Kubernetes Service的过程

news2024/11/25 18:47:20

文章目录

  • 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.coloradmin.cn/o/765797.html

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

相关文章

MNE脑电数据预处理

MNE 官网链接 导包 import mne import matplotlib.pyplot as plt加载数据集 不同格式数据集使用的函数不同&#xff0c;具体在官网搜索 raw mne.io.read_raw_brainvision(r"test.vhdr", preloadTrue)此语句为了画图方便 %matplotlib降采样 raw.resample(200)…

Vue3统计数值(Statistic)

可自定义设置以下属性&#xff1a; 数值的标题&#xff08;title&#xff09;&#xff0c;类型&#xff1a;string | slot&#xff0c;默认&#xff1a;‘’数值的内容&#xff08;value&#xff09;&#xff0c;类型&#xff1a;string | number&#xff0c;默认&#xff1a;…

MySql索引分类及创建索引的相关语法

1.索引分类 1.1 InnoDB中索引的分类 聚集索引与二级索引之间的B树的结构 sql语句索引执行的过程讲解 根据id查询的聚集索引效率要比二级索引高&#xff0c;故第一条sql的执行效率要高于第二条sql的执行效率。 2.索引语法 如果一个索引只关联一个字段&#xff0c;这种索引…

[虚幻引擎插件说明] DTOperateFile 使用蓝图操作文件

本插件可以在虚幻里面使用蓝图文件进行读、写、移动、复制、删除等操作。 目录 1. 节点说明 Get Stat Data – 获取文件信息 Directory Exists – 判断目录是否存在 Directory Create – 创建目录 Directory Delete – 删除目录 File Exists – 判断文件是否存在 File …

Kubernetes Dashboard部署安装

目录 Dashboard 官方文档&#xff1a;部署和访问 Kubernetes 仪表板&#xff08;Dashboard&#xff09; | Kubernetes 参考文档&#xff1a;(120条消息) K8S 安装 Dashboard_k8s 安装dashboard_tom.ma的博客-CSDN博客 扩展&#xff1a; K8S 安装 Dashboard 1、在 master …

BUFG/BUFGCE/BUFH/BUFHCE/BUFH/BUFGHCE/BUFMR/BUFMRCE/BUFR/IBUF/IBUFDS

本文对BUFG/BUFGCE/BUFH/BUFHCE简单介绍&#xff0c;便于后续查看。 原语的使用&#xff1a;在vivado中找到所要用的原语&#xff0c;直接将其实例化到设计中即可。 文章目录 BUFGBUFGCEBUFHBUFHCEBUFMRBUFRBUFMRCEIBUFIBUFDS 下图为 7 系列 FPGA 时钟架构图&#xff1a; BU…

TypeScript基础篇 - React Webpack TS 环境实战

目录 WebpackReactTS tsconfig.json src/App.tsx src/main.tsx scripts/webpack.config.js package.json scripts/template.html 一张ai生成图~ WebpackReactTS npm install react react-dom 【安装react并且安装一个react-dom】 引用时文件出现...;需要增加定义文件&a…

数据分析案例-数据分析师岗位招聘信息可视化

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

解决appium-doctor报ffmpeg cannot be found

一、下载ffmpeg安装包 https://ffmpeg.org/download.html 找到如图所示红框位置点击下载ffmpeg安装包。 二、配置ffmpeg环境变量 三、检查ffmpeg版本信息 重新管理员打开dos系统cmd命令提示符&#xff0c;输入ffmpeg查看是否出现版本信息&#xff0c;安装完好。 ffmpeg

在php中安装php_xlswriter扩展报错,找不到php_xlswriter.dll

前言&#xff1a;这里已经把下载的php_xlswriter.dll扩展放到了php安装目录的ext目录下&#xff0c;运行php -m还是报错找不到该扩展 原因&#xff1a;下载的扩展是nts的&#xff0c;而安装的php是ts的。查看当前php是nts还是ts&#xff1a; 在PHP中&#xff0c;可以利用phpin…

DWG文件怎么转图片?简单好用的转换方法分享

将CAD文件转换成图片的优势在于&#xff0c;图片文件更易于共享和传输。CAD文件通常比较大&#xff0c;而图片文件则更加轻便&#xff0c;容易通过电子邮件或者其他方式进行传输。此外&#xff0c;图片文件更易于浏览和查看。CAD文件需要特殊的软件才能打开和查看&#xff0c;而…

全志F1C200S嵌入式驱动开发(GPIO输出)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 和v3s一样,f1c200s本身的外部引脚比较少。所以这个时候,不可避免地,很多引脚的功能就会重叠在一起。这种情况下,我们就要学会取舍了。比如说,如果是学习sd卡的时候,那么spi的…

寻找下一个生成式AI独角兽,亚马逊云科技创业加速器火热来袭

生成式AI让人工智能技术又一次破圈&#xff0c;带来了机器学习被大规模采用的历史转折点。它正在掀起新一轮的科技革命&#xff0c;为人类带来前所未有的颠覆性的影响&#xff0c;而诸多创业者也应势而上&#xff0c;寻求创新机遇。生成式AI可以创造全新的客户体验、提高企业内…

QPainter中坐标系变换问题

一、坐标系简介。 Qt中每一个窗口都有一个坐标系&#xff0c;默认的&#xff0c;窗口左上角为坐标原点&#xff0c;然后水平向右依次增大&#xff0c;水平向左依次减小&#xff0c;垂直向下依次增大&#xff0c;垂直向上依次减小。原点即为&#xff08;0&#xff0c;0&#xf…

【Jenkins】Jenkins构建前端流水线

目录 一、前言二、新建前端流水线1、点击新建任务2、填写流水线名称&#xff08;这里我选择的是自由风格的软件项目&#xff09;&#xff0c;任务名称一般格式为&#xff1a;项目名称-前后端3、创建成功后的结果 三、配置前端流水线1、进入刚创建好的任务页面中&#xff0c;点击…

攻击载荷、木马、蠕虫、感染型病毒,你了解多少?

恶意程序是指数字世界中带有攻击意图的程序实体&#xff0c;通常可以分为攻击载荷、木马、蠕虫、感染型病毒。 1.攻击载荷 攻击载荷是指攻击者发起初始攻击并建立网络连接的武器载体&#xff0c;按照功能可以分为投递攻击类、连接控制类、独立攻击类。 投递攻击类有远程攻击类…

电商 api 接口文档编写

1、开篇 欢迎使用ShowDoc&#xff01; API格式&#xff1a; 备注&#xff1a;API必须返回如下3个字段&#xff1a; 参数名必选类型说明status是int状态message是string信息提示result否mix结果 2、用户相关 2.1、登录/退出 简要描述&#xff1a; 用户登录API 请求URL&…

HCIA-虚拟化

1、虚拟化概述 KVM是所有云平台的底座&#xff0c;虚拟化是所有云的基础&#xff0c;虚拟化只提供基础架构&#xff0c;云可以提供服务。 CNA是个定制的欧拉系统EulerOS&#xff0c;基于centos内核只保留和虚拟化相关的代码&#xff0c;CNA默认已经部署好kvm虚拟化的软件。CNA…

Vue3的watchEffect的妙用,与watch的区别

前言 在Vue3中&#xff0c;引入了Composition API&#xff0c;其中的watchEffect()函数是一个非常强大和灵活的工具&#xff0c;用于处理响应式数据的变化&#xff0c;使得项目更加弹性和灵活。它与watch有所不同&#xff0c;本文将介绍watchEffect()的定义、特点、与watch的区…

LeetCode 1183 矩阵中 1 的最大数量 (图解)

题目省略了 题解 很多题解都写的是&#xff0c;求正方形矩阵在原矩阵的等效位置的数量&#xff0c;但是不画图可能不好理解&#xff0c;比如我现在有个 3*3 的矩阵&#xff0c;需要用2*2的正方形填充 上图中我枚举了所有的点在小正方形可能出现的情况&#xff08;A、B、C、D&…