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了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【云原生】K8S单节点搭建

Kubernetes Kubernetes基础概念架构1、基础环境2、安装kubelet、kubeadm、kubectl 2、使用kubeadm引导集群1、下载各个机器需要的镜像2、初始化主节点 Kubernetes核心实战Pod Kubernetes基础概念 kubernetes具有以下特性&#xff1a; ● 服务发现和负载均衡 Kubernetes 可以使…

EasyCVR录像阈值配置未生效,是什么原因?

有用户反馈&#xff0c;在平台中设置了录像阈值不生效&#xff0c;导致磁盘爆满。针对该反馈&#xff0c;我们立即进行了排查。 EasyCVR基于云边端一体化架构&#xff0c;可支持多协议、多类型设备接入&#xff0c;在视频能力上&#xff0c;平台可实现视频直播、录像、回放、检…

小白带你学习Linux的rsync的基本操作(二十四)

目录 前言 一、概述 二、特性 1、快速 2、安全 三、应用场景 四、数据的同步方式 五、rsync传输模式 六、rsync应用 七、rsync命令 1、格式 2、选项 3、举例 4、配置文件 5、练习 八、rsyncinotfy实时同步 1、服务器端 2、开发客户端 前言 Rsync是一个开源的…

分布式应用之zookeeper集群+消息队列Kafka

一、zookeeper集群的相关知识 1.zookeeper的概念 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能…

【深入探究人工智能】:历史、应用、技术与未来

深入探究人工智能 前言人工智能的历史人工智能的应用人工智能的技术人工智能的未来当代的人工智能产物结语&#x1f340;小结&#x1f340; &#x1f389;博客主页&#xff1a;小智_x0___0x_ &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &am…

软件渗透测试真的很重要吗?渗透测试有哪些测试流程?

软件渗透测试是指通过模拟恶意攻击者的行为&#xff0c;评估软件系统中的潜在安全漏洞和弱点的活动。这种安全测试方法能够帮助开发人员和系统管理员发现并修复潜在的安全漏洞&#xff0c;以确保软件系统的安全性和完整性。软件渗透测试是一项高度技术性的任务&#xff0c;需要…

Docker 基本管理

Docker 基本管理 一&#xff1a;Docker 概述1.容器化越来越受欢迎&#xff0c;因为容器是&#xff1a;2.Docker与虚拟机的区别&#xff1a;3.Docker核心概念&#xff1a; 二&#xff1a;安装 Docker1.安装依赖包2.设置阿里云镜像源3.安装 Docker-CE并设置为开机自动启动4.查看 …

Storage、正则表达式

1 LocalStorage 2 SessionStorage 3 正则表达式的使用 4 正则表达式常见规则 5 正则练习-歌词解析 6 正则练习-日期格式化 Storage-Storage的基本操作 // storage基本使用// 1.token的操作let token localStorage.getItem("token")if (!token) {console.log(&q…

SpringBoot读取配置的6种方式

1. 概述 通过了解springboot加载配置&#xff0c;可以更方便地封装自定义Starter。 在SpringBoot中&#xff0c;可以使用以下6种方式读取 yml、properties配置&#xff1a; 使用Value注解&#xff1a;读取springboot全局配置文件单个配置。使用Environment接口&#xff1a;通过…

J-Flash烧录工具如何添加新的芯片类型

0 Preface/Foreword 1 添加方法 1.1 修改JLinkDevices.xm <!-- --> <!-- CMS --> <!-- --> <Device> <ChipInfo Vendor"CMS32" Name"CMS32L051" Core"JLINK_CORE_CORTEX_…

每天一点Python——day58

#第五十八天 集合间的关系&#xff1a; 类似于数学中学到的集合一样&#xff0c;关系差不多&#xff0c;譬如相等&#xff0c;子集&#xff0c;交集 如图所示&#xff1a;#①两个集合是否相等&#xff1a;运用运算符【等号】或者运算符&#xff01;【不等号】进行判断 #例&…

企业电子招标采购系统源码Spring Cloud + Spring Boot + MybatisPlus + 前后端分离 + 二次开发

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…

3Ds max入门教程:快捷键命令和鼠标热键大全

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 起初&#xff0c;您可能需要花一些时间查找热键&#xff0c;但是一旦您使用它们记住了它们&#xff0c;它们将使您以至少两倍的速度产生结果。例如&#xff0c;当您进行建模&#xff08;移动、缩放、旋转等…

allure环境搭建

allure环境搭建 在搭建之前你应该有python、pycharm allure介绍 官网&#xff1a;https://docs.qameta.io/allure/ 英文介绍 Allure Framework is a flexible lightweight multi-language test report tool that not only shows a very concise representation of what have…

青岛大学_王卓老师【数据结构与算法】Week05_13_队列的顺序表示和实现1_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c; 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础…

Mysql教程(一):Mysql数据模型和SQL语法分析

Mysql教程&#xff08;一&#xff09;&#xff1a;Mysql数据模型和SQL语法分析 1、Mysql数据模型 1.1 关系型数据库&#xff08;RDBMS&#xff09; 概念&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库。 特点&#xff1a; 使用表存储数…

XR应用云流化,多方面提升 XR 扩展现实体验!

无论是使用户能够协作设计电动赛车&#xff0c;还是帮助观众通过数字世界与自然互动&#xff0c;越来越多的企业利用XR扩展现实为用户提供沉浸式逼真的虚拟环境。 下一代沉浸式技术的应用越来越广泛&#xff0c;图形和人工智能的最新突破正在扩展XR的功能。这四种技术正在XR生态…

蓝桥杯真题:密码脱落(区间dp)

目录 题目&#xff1a; 解题思路&#xff1a; dp分析&#xff1a; 解题代码&#xff1a; 题目&#xff1a; 解题思路&#xff1a; 题目要求的为脱落的种子数&#xff08;即回文字符中没有对应回文的字符的数量&#xff09; 我们可以转换成求回文字符串最长回文字符串的长…

02.MySQL——CURD

文章目录 表的增删改查Create单行数据全列插入多行数据指定列插入插入否则更新替换——REPLACE RetrieveSELECT 列WHERE 条件结果排序筛选分页结果 UpdateDelete删除数据截断表 插入查询结果聚合函数group bywhere和having SQL查询中关键字优先级函数日期函数字符串函数数学函数…

SpringBoot 统一功能的处理

SpringBoot 统一功能的处理 文章目录 SpringBoot 统一功能的处理1. 用户登录权限校验1.1 最初用户登录验证1.2 Spring AOP 统一用户登录验证的问题1.3 SpringAOP 拦截器1.3.1 实现自定义拦截器1.3.2 将自定义拦截器加入到系统配置 1.4 拦截器实现原理1.4.1 实现流程图1.4.2 实现…