kubernetes深入理解之Service

news2024/11/25 6:43:26

版权声明:本文为CSDN博主「开着拖拉机回家」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
主页地址:开着拖拉机回家的博客_CSDN博客-Linux,Java基础学习,MySql数据库领域博主


目录

一、概述

1.1 Service

1.2 kube-proxy与Service

1.3VIP和Service代理

二、Pod与Service 的关系

三、Service类型

四、代理模式分类

五、Service定义与创建

5.1 创建ClusterIP类型的Service

5.2 创建NodePort类型的Service

5.3创建LoadBalancer类型的Service

六、Service 代理模式

6.1iptables简介

6.2iptables规则链在NodePort的应用

6.3IPVS

6.4iptables和IPVS对比

6.5Service工作流程


一、概述


1.1 Service

Service引入主要是解决Pod的动态变化,提供统一访问入口。Kubernetes Service定义了这样一种抽象: Service是一种可以访问 Pod逻辑分组的策略, Service通常是通过 Label Selector访问 Pod组。

Service能够提供负载均衡的能力,但是在使用上有以下限制:只提供 4 层负载均衡能力,而没有 7 层功能,但有时我们可能需要更多的匹配规则来转发请求,这点上 4 层负载均衡是不支持的。Service的作用:

• 防止Pod失联,准备找到提供同一个服务的Pod(服务发现)

• 定义一组Pod的访问策略(负载均衡)

1.2 kube-proxy与Service

  • 客户端访问节点时通过 iptables 实现的;
  • iptables规则是通过 kube-proxy写入的;
  • apiserver通过监控 kube-proxy去进行对服务和端点的监控;
  • kube-proxy通过 pod的标签( lables)去判断这个断点信息是否写入到 Endpoints里

1.3VIP和Service代理

在 Kubernetes集群中,每个 Node运行一个 kube-proxy进程。 kube-proxy负责为 Service实现了一种 VIP(虚拟 IP)的形式,而不是 ExternalName的形式。在 Kubernetes v1.0版本,代理完全在 userspace。在 Kubernetes v1.1版本,新增了 iptables代理,但并不是默认的运行模式。从 Kubernetes v1.2起,默认就是 iptables代理。在 Kubernetes v1.8.0-beta.0中,添加了 ipvs代理。

在 Kubernetes v1.0版本, Service是 4 层( TCP/ UDP over IP)概念。在 Kubernetes v1.1版本,新增了 Ingress API( beta版),用来表示 7 层( HTTP)服务为何不使用 round-robin DNS?

DNS会在很多的客户端里进行缓存,很多服务在访问 DNS进行域名解析完成、得到地址后不会对 DNS的解析进行清除缓存的操作,所以一旦有他的地址信息后,不管访问几次还是原来的地址信息,导致负载均衡无效。


二、Pod与Service 的关系


• Service通过标签关联一组Pod

• Service使用iptables或者ipvs为一组Pod提供负载均衡能力


三、Service类型


  • ClusterIP:集群内部使用,默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP
  • NodePort:对外暴露应用(集群外),在ClusterIP基础上为Service在每台机器上绑定一个端口
  • LoadBalancer:对外暴露应用,适用公有云
  • ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。

四、代理模式分类


  • iptables 代理模式
  • userspace 代理模式
  • ipvs 代理模式

ipvs代理模式中 kube-proxy会监视 Kubernetes Service对象和 Endpoints,调用 netlink接口以相应地创建 ipvs规则并定期与 Kubernetes Service对象和 Endpoints对象同步 ipvs规则,以确保 ipvs状态与期望一致。访问服务时,流量将被重定向到其中一个后端 Pod。

与 iptables类似, ipvs于 netfilter的 hook功能,但使用哈希表作为底层数据结构并在内核空间中工作。这意味着 ipvs可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外, ipvs为负载均衡算法提供了更多选项,例如:rr:轮询调度lc:最小连接数dh:目标哈希sh:源哈希sed:最短期望延迟nq:不排队调度


五、Service定义与创建


5.1 创建ClusterIP类型的Service

ClusterIP主要在每个node节点使用iptables,将发向ClusterIP对应端口的数据,转发到kube-proxy中。然后kube-proxy自己内部实现有负载均衡的方法,并可以查询到这个service下对应pod的地址和端口,进而把数据转发给对应的pod的地址和端口。

 主要需要以下几个组件的协同工作:

apiserver:用户通过 kubectl命令向 apiserver发送创建 service的命令, apiserver接收到请求后将数据存储到 etcd中

kube-proxy: Kubernetes的每个节点中都有一个叫做 kube-porxy的进程,这个进程负责感知 service、 pod的变化,并将变化的信息写入本地的 iptables规则中

iptables:使用 NAT等技术将 virtualIP的流量转至 endpoint中

创建 service.yaml文件:

apiVersion: v1
kind: Service
metadata:
  name: web
  namespace: default
spec:
  ports:
  - port: 8090      # service端口
    protocol: TCP   # 协议
    targetPort: 80  # 容器端口
  selector:         # 标签选择器
    app: nginx      # 指定关联Pod的标签
  type: ClusterIP   # 服务类型

### 
kubectl apply -f service.yaml
### 查看service
kubectl get svc
### 查看pod 标签
kubectl get pods --show-labels

 关联 Labels app=nginx 的pod,然后使用 service 提供的 IP 访问

ClusterIP 默认分配一个稳定的IP地址,即VIP,只能在集群内部访问。

5.2 创建NodePort类型的Service

NodePort:在每个节点上启用一个端口来暴露服务,可以在集群外部访问,将向该端口的流量导入到 kube-proxy,然后由 kube-proxy进一步到给对应的 pod。。也会分配一个稳定内部集群IP地址。

访问地址:<任意NodeIP>:<NodePort> 端口范围:30000-32767

示例 

apiVersion: v1
kind: Service
metadata:
  name: web-nodeport
  namespace: default
spec:
  ports:
  - port: 80        # service 端口
    protocol: TCP   # 协议
    targetPort: 80  # 容器内部端口
    nodePort: 30008 # NodePort端口
  selector:         # 标签选择器
    app: nginx      # 指定关联Pod的标签
  type: NodePort    # service类型

使用 NodePort类型的服务将nginx 的服务端口暴露出来。

端口30553 加任意一台服务器IP成功访问

NodePort:会在每台Node上监听端口接收用户流量,在实际情况下,对用户暴露的只会有一个IP和端口,那这么多台Node该使用哪台让用户访问呢?

这时就需要前面加一个公网负载均衡器为项目提供统一访问入口了。

负载均衡器:

开源:Nginx 、LVS、haproxy

公有云:SLB

部署Nginx:

​## 安装 nginx ,并启动
yum install epel-release -y
yum install nginx  -y
systemctl start nginx

vim /etc/nginx/nginx.conf
#在server 的上面插入以下代码
    upstream webservers {
        server 192.168.2.118:30553;
        server 192.168.2.210:30553;
   }
    server{
        listen       8553;
        location / {
            proxy_pass http://webservers;
        }
   }
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;  
.....


## 配置关系重新 加载
[root@k8s-devops ~]# nginx -s reload
## 查看 8553 端口是否监听
[root@k8s-devops ~]# netstat -anlp | grep  8553
tcp        0      0 0.0.0.0:8553            0.0.0.0:*               LISTEN      16715/nginx: master 
[root@k8s-devops ~]# 
​

监听端口如下:

IP+8553 端口访问 nginx 应用 :

5.3创建LoadBalancer类型的Service

LoadBalancer与NodePort类似,在每个节点上启用一个端口来暴露服务。除此之外,Kubernetes会请求底层云平台(例如阿里云、腾讯云、AWS等)上的负载均衡器,将每个Node

([NodeIP]:[NodePort])作为后端添加进去。


六、Service 代理模式


6.1iptables简介

表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理

链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。

使用-j可以指定动作,比如

-j ACCEPT

-j DROP

-j REJECT

原文链接:Iptables 详解与实战案例_开着拖拉机回家的博客-CSDN博客_iptables 实战

6.2iptables规则链在NodePort的应用

我们将 web-nodeport Service 的iptables 规则链 搜索出来。·

iptables规则链方位步骤:

第一步 :在浏览器访问

http://192.168.2.119:30553

第二步 : 规则链重定向

###  数据包经过iptables规则匹配,重定向另一个链, KUBE-SVC-GCYSPZR5VVR6P7RM,  
##  -A 表示在指定链的末尾添加(append)一条新的规则
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/web-nodeport" -m tcp --dport 30553 -j KUBE-MARK-MASQ
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/web-nodeport" -m tcp --dport 30553 -j KUBE-SVC-GCYSPZR5VVR6P7RM

第三步 : 实现规则链转发负载

### 一组规则,有几个pod就会创建几条,我们这个三个 pod(这里实现了负载均衡器, probability 匹配到规则链的概率)
-A KUBE-SVC-GCYSPZR5VVR6P7RM -m comment --comment "default/web-nodeport" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-KYDJN3GW7WZ2VGX2
-A KUBE-SVC-GCYSPZR5VVR6P7RM -m comment --comment "default/web-nodeport" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-MC5SFNONWFPVUITK
-A KUBE-SVC-GCYSPZR5VVR6P7RM -m comment --comment "default/web-nodeport" -j KUBE-SEP-7GGWNYUUPHQRXI76

第四步: 使用DNAT转发到具体的Pod

### 使用DNAT转发到具体的Pod  
# 匹配链:KUBE-SEP-7GGWNYUUPHQRXI76, KUBE-SEP-MC5SFNONWFPVUITK,KUBE-SEP-MC5SFNONWFPVUITK 
# -s  源服务器 
# to-destination   目标服务器
# -j 指定动作 ACCEPT DROP 
-A KUBE-SEP-7GGWNYUUPHQRXI76 -s 10.244.2.16/32 -m comment --comment "default/web-nodeport" -j KUBE-MARK-MASQ
-A KUBE-SEP-7GGWNYUUPHQRXI76 -p tcp -m comment --comment "default/web-nodeport" -m tcp -j DNAT --to-destination 10.244.2.16:80
-A KUBE-SEP-KYDJN3GW7WZ2VGX2 -s 10.244.1.11/32 -m comment --comment "default/web-nodeport" -j KUBE-MARK-MASQ
-A KUBE-SEP-KYDJN3GW7WZ2VGX2 -p tcp -m comment --comment "default/web-nodeport" -m tcp -j DNAT --to-destination 10.244.1.11:80
-A KUBE-SEP-MC5SFNONWFPVUITK -s 10.244.2.15/32 -m comment --comment "default/web-nodeport" -j KUBE-MARK-MASQ
-A KUBE-SEP-MC5SFNONWFPVUITK -p tcp -m comment --comment "default/web-nodeport" -m tcp -j DNAT --to-destination 10.244.2.15:80

针对ClusterIP实现的转发后面与nodeport一样,回到了上面第三步

#### 针对ClusterIP实现的转发,后面与nodeport一样,回到了上面第三步
-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.96.186.242/32 -p tcp -m comment --comment "default/web-nodeport cluster IP" -m tcp --dport 8090 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.96.186.242/32 -p tcp -m comment --comment "default/web-nodeport cluster IP" -m tcp --dport 8090 -j KUBE-SVC-GCYSPZR5VVR6P7RM

6.3IPVS

 kube-proxy 是configmap 配置文件 部署的,我们修改下 kube-proxy 配置文件

 编辑 修改 mode为IPVA:

## 编辑  kube-proxy 配置文件
kubectl edit configmap kube-proxy -n kube-system

40       tcpTimeout: 0s
41       udpTimeout: 0s
42     kind: KubeProxyConfiguration
43     metricsBindAddress: ""
44     mode: "ipvs"        ##   修改 kube-proxy 配置中的mode为:ipvs
45     nodePortAddresses: null
46     oomScoreAdj: null
47     portRange: ""
48     showHiddenMetricsForVersion: ""
49     udpIdleTimeout: 0s

可以使用如下的命令查看 IPVS数据链

## 安装IPVS 命令
yum install ipvsadm

ipvsadm -L -n



### 删除POD kube-proxy-tg889 
kubectl -n kube-system delete pod  kube-proxy-tg889

 删除node1 上的pod ,重新启动

 查看新的kube-proxy pod日志,显示“Using ipvs Proxier” 表示开启了ipvs模式:

[root@node1 ~]# kubectl -n kube-system logs  kube-proxy-tg889
I0512 20:46:39.128357       1 node.go:172] Successfully retrieved node IP: 192.168.2.118
I0512 20:46:39.128553       1 server_others.go:142] kube-proxy node IP is an IPv4 address (192.168.10.136), assume IPv4 operation
I0512 20:46:39.153956       1 server_others.go:258] Using ipvs Proxier.
I0512 20:46:39.166860       1 proxier.go:372] missing br-netfilter module or unset sysctl br-nf-call-iptables; proxy may not work as intended
E0512 20:46:39.167001       1 proxier.go:389] can't set sysctl net/ipv4/vs/conn_reuse_mode, kernel version must be at least 4.1
W0512 20:46:39.167105       1 proxier.go:445] IPVS scheduler not specified, use rr by default
I0512 20:46:39.167274       1 server.go:650] Version: v1.19.0

6.4iptables和IPVS对比

Iptables:

  • 灵活,功能强大
  • 规则遍历匹配和更新,呈线性时延

IPVS:

  • 工作在内核态,为大型集群提供了更好的可扩展性和性能
  •  调度算法丰富:最小负载、最少连接、加权等(rr,wrr,lc,wlc,ip hash...)
  • ipvs 支持服务器健康检查和连接重试等功能

6.5Service工作流程

  1. 用户执行kubectl/userClient向apiserver发起一个命令,经过认证授权后,经过scheduler的各种策略,得到一个目标node,然后告诉apiserver,apiserver 会请求相关node的kubelet,通过kubelet把pod运行起来,apiserver还会将pod的信息保存在etcd;
  2. pod运行起来后,controllermanager就会负责管理pod的状态,如,若pod挂了,controllermanager就会重新创建一个一样的pod,或者像扩缩容等;
  3. pod有一个独立的ip地址,但pod的IP是易变的,如异常重启,或服务升级的时候,IP都会变,这就有了service;完成service工作的具体模块是kube-proxy,在每个node上都会有一个kube-proxy,在任何一个节点上访问一个service的虚拟ip,都可以访问到pod;
  4. service的IP可以在集群内部访问到,在集群外呢?service可以把服务端口暴露在当前的Node上,外面的请求直接访问到node上的端口就可以访问到service了

参考:一文讲透K8s的Service概念

 版权声明:本文为CSDN博主「开着拖拉机回家」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
主页地址:开着拖拉机回家的博客_CSDN博客-Linux,Java基础学习,MySql数据库领域博主

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/58104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【salesforce平台基础】-想到啥写点啥

【salesforce基础】-想到啥写点啥1.salesforce架构2.学习过程中常见的几个“公司”&#x1f92d;3.术语4.平台的用途&#xff08;举例说明&#xff09;5.AppExchange&#xff08;软件应用商店&#xff09;6.sandbox7.平台入门1.salesforce架构 salesforce是一家云公司&#xf…

7.关于线性回归模型的QA

为什么使用平方损失而不是绝对差值呢&#xff1f; 答&#xff1a; 二者区别不大&#xff0c;但是绝对差值是一个不可导的函数&#xff0c;在零点的时候&#xff0c;绝对差值的导数会有点难求。 损失为什么要求平均&#xff1f; 答&#xff1a;求平均的话&#xff0c;梯度是在…

原语科技宣布完成千万级天使+轮融资,致力于打造隐私计算标准化产品

原语科技 开放隐私计算 开放隐私计算 开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。 180篇…

【基础算法】多项式三大运算 C++实现

●多项式计算 一维多项式就是包含一个变量的多项式&#xff0c;一个一维多项式示例如下&#xff1a; 一维多项式求值就是对于上述多项式&#xff0c;计算在指定的x处的函数值。一个通用的计算多项式值的算法可以采用递推的方式&#xff0c;可以将上述多项式变为如下的等价形式…

位运算 离散化 区间和算法

目录一、位运算1.1 思路1.1 例题&#xff1a;二进制中1的个数二、离散化2.1 概念2.2 例题&#xff1a;区间和三、合并区间3.1 概念3.2 例题&#xff1a;合并区间一、位运算 1.1 思路 首先知道一个概念&#xff1a;一个正整数的负数等于其按位取反后1 -x ~x 1 举个例子&…

干货——生产型企业的供应商管理系统模板

供应商管理主要是是通过提高供货产品和服务质量及交付能力&#xff0c;缩短企业采购周期和生产成本&#xff0c;从而提升产品核心竞争力。随着如今信息技术的发展&#xff0c;采用先进的信息化手段更能够提升供应商管控能力&#xff0c;实现资源的有效整合&#xff0c;从而加强…

[附源码]计算机毕业设计疫苗药品批量扫码识别追溯系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

测试服务器的udping值

测试服务器的udping值参考下载工具步骤一&#xff1a;在服务器上启动UDP Echo服务(必须)启动**UDP Echo服务**步骤二&#xff1a;在客户端下载UDPing工具步骤三&#xff1a;在客户端测试UDPing值参考 https://help.aliyun.com/document_detail/158771.html UDPing项目地址: h…

阿里资深架构师整理分享的分布式系统架构:技术栈详解与进阶文档

前言 有人调侃我们说&#xff1a; 程序员不如送外卖。送外卖是搬运食物&#xff0c;自己是搬运代码&#xff0c;都不产出新的东西……透支体力&#xff0c;又消耗健康&#xff0c;可替代性极强&#xff0c;30岁之后就要面临被优化的危险……想跳槽&#xff0c;但是更高的平台…

PyTorch 2.0 重磅发布:一行代码提速 30%

在今天的 PyTorch 2022 开发者大会上&#xff0c;PyTorch 团队发布了一个新特性torch.compile&#xff0c;这个新特性将 PyTorch 的性能推向了新高度&#xff0c;并开始将 PyTorch 的部分实现从 C 中迁移到 Python 中。他们相信这是 PyTorch 一个实质性的新方向--因此称之为 **…

(最优化理论与方法)第六章无约束优化算法-第一节:线搜索方法

文章目录一&#xff1a;无约束优化问题概述二&#xff1a;线搜索方法&#xff08;1&#xff09;概述&#xff08;2&#xff09;线搜索准则A&#xff1a;Armijo准则①&#xff1a;概述②&#xff1a;Armjio准则缺陷③&#xff1a;回退法④&#xff1a;代码B&#xff1a;Goldstei…

从固定管线到可编程管线:十段代码入门OpenGL

文章目录1. 最简单的OpenGL应用程序2. 视点系统和投影矩阵3. 深度缓冲区和深度测试4. 模型的旋转和平移5. VBO和顶点混合数组6. 纹理映射和纹理坐标7. 光照和法向量计算8. 最简单的着色器程序9. 着色器中的MVP矩阵10. 着色器中的漫反射、镜面反射和高光计算1. 最简单的OpenGL应…

【什么是区块链】

区块链技术简介前言一、区块链技术简介二、区块链的特点1.去中心化2.去信任3.不可篡改和伪造4.可溯源5.匿名性三、区块链用到的技术1.非对称密码算法2.哈希函数3.P2P网络4.安全多方计算前言 比特币与区块链的关系&#xff1a; 2008年中本聪&#xff08;Satoshi Nakamoto&…

Python中logging日志模块详解

用Python写代码的时候&#xff0c;在想看的地方写个print xx 就能在控制台上显示打印信息&#xff0c;这样子就能知道它是什么了&#xff0c;但是当我需要看大量的地方或者在一个文件中查看的时候&#xff0c;这时候print就不大方便了&#xff0c;所以Python引入了logging模块来…

104.二叉树的最大深度 | 111.二叉树的最小深度

文章目录二叉树的深度104.二叉树的最大深度题目题解111.二叉树的最小深度题目题解二叉树的深度 104.二叉树的最大深度 题目 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。…

Mac终端常用命令

1、打开窗口命令 快速打开&#xff1a;command空格&#xff08;打开查询&#xff09;&#xff0c;输入ter回车 打开多个窗口&#xff1a;commandN&#xff08;光标在终端执行此操作&#xff09; 2、目录操作 命令名 命令功能 备注 cd 打开当前目录 cd dirname pwd 显示…

Java 调用 Cpp 代码简单示例

Java 调用 Cpp 代码 前言&#xff1a;首先说明一下&#xff0c;本篇文章是干嘛的&#xff0c;简单来说就是在 Java 代码里调用 C 代码。但是呢&#xff0c;这里只做一个简单的示例&#xff0c;调用最简单的 C 代码&#xff0c;起到一个抛砖引玉的作用。如有不对之处&#xff0…

选择编码节点的最佳数量和位置研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

[附源码]计算机毕业设计校园招聘微信小程序Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

代码随想录训练营第39天|LeetCode 62.不同路径、63. 不同路径 II

参考 代码随想录 题目一&#xff1a;LeetCode 62.不同路径 相比于之前的爬楼梯&#xff0c;这题变成了二维&#xff0c;对于某个位置[i,j]&#xff0c;可以从[i-1,j]或者[i,j-1]走到[i,j]&#xff0c;因此在求解思想上其实是类似于爬楼梯的。 确定dp数组及其下标的含义 dp[…