Kubernetes Service的过程

文章目录

  • Kubernetes Service的实现
    • 基础内容
      • 1. 命令 ip route show table all
      • 2. DNAT
      • 3. IPVS和iptables
      • 4. Service
    • Service的实现
    • 简述

Kubernetes Service的实现

基础内容

在了解Service之前,需要先了解一些额外的知识:

  1. 命令: ip route show table all
  2. DNAT
  3. IPVS和iptables
  4. 基础的网络知识(网关,网段或子网,转发)

1. 命令 ip route show table all

这条命令会列出主机内所有的路由.内容展示包含了对应的网段或者IP,要通过那个虚拟设备发送出去.示例:

root@debian:~/kubernetes# ip route show table all 
default via 10.0.0.2 dev ens33 onlink 
10.0.0.0/24 dev ens33 proto kernel scope link src 10.0.0.50 
10.244.0.0/24 dev cni0 proto kernel scope link src 10.244.0.1 
local 10.0.0.50 dev ens33 table local proto kernel scope host src 10.0.0.50 
broadcast 10.0.0.255 dev ens33 table local proto kernel scope link src 10.0.0.50 
local 10.96.0.1 dev kube-ipvs0 table local proto kernel scope host src 10.96.0.1 
......

摘取一条,比如:local 10.96.0.1 dev kube-ipvs0 table local proto kernel scope host src 10.96.0.1
local:这表示这是一个本地路由,用于指示目标地址是本地主机。
10.96.0.1:目标地址,即要匹配的 IP 地址.
dev kube-ipvs0:指定了数据包应该通过的网络接口,即 kube-ipvs0.
table local:指定了路由表名称,即 local 表.
proto kernel:表示该路由表项是内核生成的.
scope host:表示该路由的作用域仅限于本地主机.
src 10.96.0.1:源 IP 地址,即数据包的出站地址.

2. DNAT

在网络中发送数据包,都是要写明源IP地址及目标IP地址等信息的.可以参考OSI模型.
而DNAT就是,修改数据包中的目标IP为另一个IP,源IP不变.然后重新把这个数据包发送出去.实际上就是一个转发.
DNAT转发

3. IPVS和iptables

kube-proxy是k8s中的一个组件.主要负责网络相关的事情,或者说Service就是基于kube-proxy实现的.
而kube-proxy实际上是调用了系统的iptables和IPVS.所以Service也是基于他们两个实现的.
前者是防火墙,后者是一个性能更好的转发服务.两者在k8s集群中起到的作用都是转发数据包,也就是DNAT.

查看IPVS:

root@debian:~/kubernetes# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.96.0.1:443 rr-> 10.0.0.50:6443               Masq    1      3          0         
TCP  10.96.0.10:53 rr-> 10.244.0.24:53               Masq    1      0          0         -> 10.244.0.25:53               Masq    1      0          0         
TCP  10.96.0.10:9153 rr-> 10.244.0.24:9153             Masq    1      0          0         -> 10.244.0.25:9153             Masq    1      0          0         
TCP  10.107.158.131:80 rr-> 10.244.0.30:80               Masq    1      0          0         -> 10.244.0.33:80               Masq    1      0          0         -> 10.244.0.34:80               Masq    1      0          0         
UDP  10.96.0.10:53 rr-> 10.244.0.24:53               Masq    1      0          0         -> 10.244.0.25:53               Masq    1      0          0 

rr表示轮询策略。

4. Service

Service 是一种抽象,用于定义一组 Pod 的逻辑网络端点。它是 Kubernetes 集群内部的一种资源对象,用于实现服务发现和负载均衡。
Service对应了一组endpoint。每个endpoint都是一个Pod的IP地址,他是基于IPVS实现的,所以你访问Service可以转发到对应的Pod上。
示例:

root@debian:~/kubernetes# kubectl get service
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   34d
nginx        ClusterIP   10.107.158.131   <none>        80/TCP    36m

现在,集群里有一个nginx的Service。

root@debian:~/kubernetes# kubectl get endpoints -o wide 
NAME         ENDPOINTS                                      AGE
kubernetes   10.0.0.50:6443                                 34d
nginx        10.244.0.30:80,10.244.0.33:80,10.244.0.34:80   36m

查看他们对应的endpoints,可以看到nginx对应了三个IP地址。

root@debian:~/kubernetes# kubectl get pod -o wide 
NAME                                READY   STATUS    RESTARTS   AGE    IP            NODE     NOMINATED NODE   READINESS GATES
nginx-deployment-6595874d85-5hpvq   1/1     Running   0          4m9s   10.244.0.33   master   <none>           <none>
nginx-deployment-6595874d85-mm2m5   1/1     Running   0          4m9s   10.244.0.34   master   <none>           <none>
nginx-deployment-6595874d85-qtnwb   1/1     Running   0          41m    10.244.0.30   master   <none>           <none>

最后,我们看一下Pod的IP地址,和endpoint的是完全对应的。而endpoints和Service ClusterIP的地址,也是在上面ipvs表中可以找到对应关系的。

所以,当创建或者更新了一个Pod的时候,controller会去同步更新endpoint的地址。接下来endpoint通知kube-proxy,kube-proxy更新IPVS的规则。

Service的实现

请添加图片描述

当Pod对一个Service发起请求后:

首先通过集群DNS解析到Service的IP地址。然后数据包源IP填写为当前Pod自己的IP,目标IP填写为对应的Service的IP,然后这个数据包通过虚拟设备来到宿主机。

对于虚拟设备和如何来到宿主机,可以参考docker 网络通信原理,kubernetes flannel 网络,flannel的host-gw与calico。或者参考 深入剖析 Kubernetes 张磊。

数据包来到宿主机后,这里就和Pod和Pod通信不同了。
通过命令可以看到,service的IP地址和Pod的IP地址完全不是一个网段:

root@debian:~/kubernetes# kubectl get pod -o wide 
NAME                                READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
nginx-deployment-6595874d85-5hpvq   1/1     Running   0          14m   10.244.0.33   master   <none>           <none>
nginx-deployment-6595874d85-mm2m5   1/1     Running   0          14m   10.244.0.34   master   <none>           <none>
nginx-deployment-6595874d85-qtnwb   1/1     Running   0          51m   10.244.0.30   master   <none>           <none>
root@debian:~/kubernetes# kubectl get service -o wide 
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE   SELECTOR
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   34d   <none>
nginx        ClusterIP   10.107.158.131   <none>        80/TCP    50m   app=nginx

Pod的地址是10.244.0.30,而Service的地址是10.107.158.131
这就意味着,请求Service的数据包来到宿主机内核后,不能像其他到Pod的数据包一样直接通过CNI进行转发。

所以接下来查看下路由表:

root@debian:~/kubernetes# ip route show table all|grep "10.107.158.131"
local 10.107.158.131 dev kube-ipvs0 table local proto kernel scope host src 10.107.158.131

在这里可以看到。路由表中过滤了一下对应的IP地址,可以看到他要通过kube-ipvs0这个虚拟设备发出。
这个虚拟设备也是kube-proxy添加的了,这个虚拟设备就像一根网线,一端在宿主机上,一段对接到了IPVS。数据包接下来通过kube-ipvs0发送给了IPVS,IPVS根据自己的策略轮询选择一个endpoints:

# 这里只截取了重要部分
root@debian:~/kubernetes# ipvsadm -Ln
TCP  10.107.158.131:80 rr-> 10.244.0.30:80               Masq    1      0          0         -> 10.244.0.33:80               Masq    1      0          0         -> 10.244.0.34:80               Masq    1      0          0  

IPVS里有目标IP为10.107.158.131的这一条记录。然后从对应的这三个IP轮询获取一个,重新DNAT数据包,比如选择了10.244.0.30这个IP,那么DNAT后数据包的目标IP就改为了10.244.0.30

IPVS自己是发送不了数据包的。他只能把这个数据包重新发送到宿主机的网络栈里。但是这个时候经过IPVS加工处理过的数据包,和Pod请求Pod的数据包没什么区别了。源IP是发送数据包的Pod的IP,目标是nginx 的一个Pod的IP。
所以,主机内核就会根据路由表找到目标IP所在的主机节点发送出去。这里会根据使用的CNI和模式的不同,采取的策略也不同,同样参考上面的文档。但是数据包已经可以正常发送到对端Pod了。

简述

数据包从pod内发出后,在主机内核匹配路由表转发给了IPVS。IPVS虽然说是负载,但是实际上只做了一个DNAT的操作。然后操作结束后数据包的目标IP就不再是Service的,而是对端Pod的了。接下来数据包重新发送到主机网络栈,主机网络栈就可以根据CNI配置的规则进行下一步的转发了。

对于IPVS如何知道Pod的IP,是因为contaoller manage在创建Pod后,会更新endpoints,然后告知 kube-proxy。kube-proxy会去操作修改IPVS的规则表。这样,IPVS就可以轮流的使用多个IP转发数据包了。

所以kube-proxy实际上是操作的IPVS去工作。他们负责给每个节点的IPVS规则表里,加上整个集群的Service对应endpoints的规则。当集群Service较多的时候,iptables的性能就不如IPVS了。

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

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

相关文章

idea不小心push的文件夹怎么处理?

第一种方式&#xff0c;把不小心push上去的人解决掉。 第二种方式&#xff0c;以我自身为例&#xff0c;同事不小心push了.idea文件夹 首先打开git bash git rm --cached .idea/ -r 然后查看一下状态 git status 接着提交修改 git commit -m "cancel track .idea file&q…

【Redis】高可用之三:集群(cluster)

本文是Redis系列第6篇&#xff0c;前5篇欢迎移步 【Redis】不卡壳的 Redis 学习之路&#xff1a;从十大数据类型开始入手_AQin1012的博客-CSDN博客关于Redis的数据类型&#xff0c;各个文章总有些小不同&#xff0c;我们这里讨论的是Redis 7.0&#xff0c;为确保准确&#xf…

Linux基础(三)端口、进程及主机状态管理、环境变量、文件管理

目录 端口 nmap netstat 进程管理 查看进程 关闭进程 主机状态监控 系统资源top命令 磁盘信息监控 网络状态监控 环境变量 $符号 自己设置环境变量 自定义环境变量PATH Linux的文件和下载 压缩和解压 tar命令 zip和unzip命令 端口 每个电脑有一个ip地址&#xff…

Vue项目实现在线预览pdf,并且可以批量打印pdf

最近遇到一个需求,就是要在页面上呈现pdf内容,并且还能用打印机批量打印pdf,最终效果如下: 当用户在列表页面,勾选中两条数据后,点击“打印表单”按钮之后,会跳到如下的预览页面: 预览页面顶部有个吸顶的效果,然后下方就展示出了2个pdf文件对应的内容,我们接着点击“…

echarts 地图点击常见问题

echats 散点图不支持缩放 echarts 地图点击激活label如何去除 高德loca 1.4版本热力图报错 绘制的颜色区间是 0 --1 高德地图销毁不生效 自己傻逼&#xff0c;每次没有清空数组导致叠加数据&#xff0c;约点数据越多。 为何用高德地图district.search查询不到别的省数据&…

[微信小程序] movable-view 可移动视图容器 - 范围问题

movable-view 可移动视图容器 可移动视图容器&#xff0c;在页面中可以拖拽滑动。movable-view必须在 movable-area 组件中&#xff0c;并且必须是直接子节点 <view><movable-area style"width: 750rpx;height: 200rpx;background-color: gainsboro;">&l…

Java的数据结构-Map集合

文章目录 Map概述Map常用方法Map遍历元素的方法1.方法一&#xff1a;keySet()2.方法二&#xff1a;entrySet() HashMap Map概述 1、Map和collection没有继承关系2、Map集合以key和value的方式存储数据&#xff1a;键值对key和value都是引用数据类型。key和value都是存储对象的…

(栈队列堆) 剑指 Offer 31. 栈的压入、弹出序列 ——【Leetcode每日一题】

❓ 剑指 Offer 31. 栈的压入、弹出序列 难度&#xff1a;中等 输入两个整数序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如&#xff0c;序列 {1,2,3,4,5} 是某栈的压栈序列&#xff0c;序…

Appium Android ——利用 TestNG 并行执行用例

目录 前言&#xff1a; 一、测试类 二、连接两个 Android 设备或启动两个虚拟机 三、项目路径下新建两个 testng.xml 四、开启两个 appium server 五、导出依赖 六、执行测试 七、查看报告 前言&#xff1a; Appium是一个流行的移动应用自动化测试工具&#xff0c;…

使用semanage管理SELinux安全策略

semanage命令用于管理SELinux的策略&#xff0c;格式为“semanage [选项] [文件]”。 SELinux服务极大地提升了Linux系统的安全性&#xff0c;将用户权限牢牢地锁在笼子里。semanage命令可以设置文件、目录的策略&#xff0c;还可以管理网络端口、消息接口。 常用参数&#xf…

vue3+vite配置 unplugin-vue-component 找不到 Vant 组件的问题

使用 vue3 vite Vant 搭建移动端项目&#xff0c;为了避免全量引入 vant 导致打包体积过大&#xff0c;又不想一个一个组件手动导入&#xff0c;所以就选择了 vant 官方推荐的方法&#xff0c;使用 unplugin-vue-components 插件自动引入组件&#xff0c;并按需引入组件的样式…

Qgis3.16ltr+VS2017二次开发环境搭建(保姆级教程)

1.二次开发环境搭建 下载osgeo4w-setup.exeDownload QGIShttps://www.qgis.org/en/site/forusers/download.html 点击OSGeo4W Network Installer 点击下载 OSGeo4W Installer 运行程序 osgeo4w-setup.exe&#xff0c;出现以下界面&#xff0c;点击下一页。 选中install from i…

力扣206. 反转链表

给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1a; 输入&am…

MySQL进阶

目录 一、存储引擎 1、MySQL体系结构 2、存储引擎简介 3、存储引擎特点 InnoDB MyISAM Memory 4、存储引擎选择 二、索引 1、索引概述 2、索引结构 3、索引分类 4、索引语法 5、SQL性能分析 5.1 SQL执行频率 5.2 慢查询日志 5.3 profile详情 5.4 explain执行…

Sentinel流量规则模块(新增)

系统并发能力有限&#xff0c;比如系统A的QPS支持1个请求&#xff0c;如果太多请求过来&#xff0c;那么系统A就应该进行流量控制了&#xff0c;比如其他请求直接拒绝 新增流控规则介绍:新增流控规则窗口 1.资源名&#xff1a;默认请求路径。 2.针对来源&#xff1a;Se…

基于51单片机和proteus的温室大棚系统

此系统是基于51单片机和proteus的仿真设计&#xff0c;功能如下&#xff1a; 1. LCD1602实时显示光照/土壤湿度/温度值及设定值。 2. 按键可增减光照/土壤湿度/温度设定阈值。 3. 获取到的温度低于设定温度则打开加热设备。 4. 获取到的光照值低于设定光照值则打开补光灯。…

【iOS】编译与链接

前言 计算机语言分为机器语言、汇编语言和高级语言。 可以将高级语言分为两种&#xff1a;编译语言和解释型语言&#xff08;直译式语言&#xff09;。 解释型语言&#xff08;逐步进行解释执行&#xff09; 解释语言编写的程序在每次运行时都需要通过解释器对程序进行动态…

【区块链+体育】“数智化”的杭州亚运会,中创助力区块链技术发展

“智能”&#xff0c;是杭州亚运会的办赛理念之一。除了数字藏品开亚运先河&#xff0c;杭州亚组委充分应用区块链、大数据、人工智能等前沿技术&#xff0c;为观众提供从购票、出行、观赛到住宿、美食和旅游等“一站式”服务。 本次亚运会将全程智能陆续落到了实处&#xff0…

CSS 实现 Turbo 官网 3D 网格线背景动画

转载请注明出处&#xff0c;点击此处 查看更多精彩内容 查看 Turbo 官网 时发现它的背景动画挺有意思&#xff0c;就自己动手实现了一下。下面对关键点进行解释说明&#xff0c;查看完整代码及预览效果请 点击这里。 简单说明原理&#xff1a;使用 mask-image 遮罩绘制网格&a…