深入理解k8s kube-proxy

 

07a6f41cc232bdbe87ca3e5633f1ffaf.png

1、概述

我觉得只要大家知道kube-proxy是用来配置网络规则的而不是转发流量的,真正的流量由iptables/ipvs来转发就可以了。

网络是k8s的一个关键部分。理解k8s中网络组件如何工作可以帮助更好的设计和配置我们的应用。

kube-proxy就是K8s网络的核心组件。它把我们应用使用的service翻译为网络规则。

kube-proxy这个名气会有让人产生一点歧义,因为有技术背景的朋友们看到后不了解之前就会想到用户的流量是先经过kube-proxy,然后kube-proxy转发到集群的,其实并不是这样的。kube-proxy只负责网络规则的创建,修改和删除,真正的流量还是依赖于Linux/Windows来接受和转发。如果从这个角度来理解,kube-proxy在Linux环境上主要控制和配置iptables或ipvs, 在windows则控制和配置kernelspec。 从这个角度来看kube-proxy像是一个控制平面,iptables/ipvs/kernelspec像是一个数据平面。

正因为kube-proxy不处理用户流量,所以k8s的性能不会有什么问题,反观Istio使用边车模式(sidecar),对流量进行管理才会导致性能问题。

在开始说明kube-proxy之前,我们可以想一下kube-proxy主要想解决哪些问题。

2.kube-proxy需要解决哪些问题?

  1. 服务发现,给Pod提供一个统一的入口来访问服务
  2. 负载均衡:这里主要是kube-proxy把Pod的路由信息写到iptables或者ipvs,让内核对根据支持的负载均衡算法进行流量转发

另外,我想额外说明的是kube-proxy时刻都要监听Api Server(kube-proxy的老板)发送过来的Pod的CUD(创建,更新和删除)信息,有变更就改规则。

ffedeb3edf34e77fd2239ab4eb064126.png

3.什么是kube-proxy

k8s中的Pod是临时的,因为Pod中运行的是我们的应用,我们的应用可能随时会崩溃,崩溃了以后k8s会为我们重新创建,我们不能用Pod的IP通信,因为Pod每次崩溃重启IP会变更,而且Pod的数量也会改变。

 

616c2691c215b751f98cb8a7be383dc4.png

所以K8s就增加了Service来提供Pod统一的入口。Service提供了连接一个或者多个的Pod静态地址。我们可以这么理解:进入k8s集群的流量先到达Service,然后流量被重定向到Pod,同时Service保证流量不转发到不健康的Pod。这个保证会在一个短的时间无法保证,就是Pod从进入不健康状态到被检测出不健康的这个时间区间。

23c890ced6f1774f436de49db4c7dd7c.png

但是在网络层如何实现Service到Pod的映射?kube-proxy就是干这事的。

kube-proxy会被安装在每个k8s的Node之上。它用来监控Service和Endpoint的变化。然后他会将这些变化转换为自己Node上的网络规则。

kube-proxy是以DaemonSet的形式运行在k8s集群中的。但是它也可以以进程的方式安装在Linux系统之中。安装方式可以参考官网自己选择。

  1. kubeadmin安装k8s,kube-proxy会被安装位DaemonSet
  2. 使用Linux tar方式安装,kube-proxy会以Linux进程方式运行

4.kube-proxy工作原理

在kube-proxy安装完成后,它会与API Server完成认证。
当新的Service或者EndPoint被添加或者移除,那么API Server会将这些变更通知给kube-proxy。

kube-proxy在收到通知后会将这些变化应用于Node的NAT规则中。这些NAT规则就是简单的件Service IP映射到Pod IP。

当有流量发送给Service时,Service会基于NAT的这些规则将流量转发给Pod。

我们来看几个例子。
假设我们有一个Service,这个Service名字为SVC01,类型为ClusterIP。当这个Service创建完成后,API Server会检查需要关联到这个Service的Pod。我们一般是通过在Service中配置Pod的标签来选择一组Pod,所以API Server会查找与Service中标签匹配的Pod。

假设API Server查找到的Pod为Pod01和Pod02,其中Pod1在Node1,Pod2在Node2。API Server会创建一个抽象的Endpoint。每个EndPoint。每个EndPoint代表了一个Pod的IP地址。SVC01可以绑定到这两个Pod对应的Endpoint。假设这两个EndPoint为EP01和EP02。

 

66f7c67e0db5674a85aa40d20b4b540c.png

这些配置在Control Plane完成后,k8s还在将这些Mapping关系体现在Node上。一旦这些配置在Node上配置完成后,SVC01 Servvice的流量就会被转发到EP01和EP02,如下图所示:

1f8c6dabbfada7f349e63288fbbd442d.png

在这种情况下,如果有流量进入SVC01,则流量转发如下图:

d20c3278cac969fa0d8ae6b11c385443.png

Service和EndPoint映射说明:

  1. Service和EndPoint是IP和端口的映射而不只是IP的映射
  2. DNAT转换发生在源Node。因为Service类型是ClusterIP,只能从集群内部进行访问
  3. 如果Service类型是其他方式,比如:NodePort,这些规则会被应用到Linux。
  4. NAT规则会随机选择其中一个Pod进行流量转发,但是这个会根据kube-proxy的模式而改变

下面我们来看下kube-proxy的模式。

5.kube-proxy模式

kube-proxy支持不同的网络转发模式。每种模式用来描述Kube-proxy如何来实现NAT规则。想要知道每种模式的好坏,我们需要理解每种模式的工作原理。

5.1.IPtables 模式

IPTables是最通用和最常用的模式。在这个种模式下,kube-proxy依赖于Linux的IPTables的功能特性。Iptable用来处理数据和过滤数据包。它会检查Linux机器上的入站和出站流量,然后IPtable可以根据规则来匹配数据包并将其转发。
当k8s使用这种模式时,kube-proxy会将Service到Pod的NAT规则写入到IPTables中。IPTables根据kube-proxy写入到这些规则将流量重定向到对应的Pod。

ba692b2b2676eebe0311008b64de11cc.png

5.1.1.IPTables劣势

IPTables劣势就是在大规模集群下性能低。
使用IPTables模式的不好之处就是它的规则是链式的,因为IPTables的设计目的是为了数据包的过滤组件。那么IPTables在处理大量规则时性能就会很低,因为链式查找速度慢。所以选择这种模式时你需要考虑你的k8s集群Service和Pod的数量,如果数量太大的话就考虑选择其他模式了。

另外,IPTables不支持一些特定的负载均衡算法,只支持简单轮询方式来实现负载均衡。

5.2.IPVS 模式

IPVS (IP Virtual Server)是一种高效的Layer-4交换机,实现了运行在LVS下的提供负载平衡功能的技术。IPVS基本上是一种高效的Layer-4交换机,它提供负载平衡的功能。这个是k8s kube-proxy的一个较好的选择。在IPVS模式下,kube-proxy将转发规则写入到IPVS中。

由于IPVS是一个专门用于交换的模块,所以它的查找算法最小可以在O(1)时间复杂度完成,所以它在大规模集群下能够表现出很好且很稳定的性能。

IPVS模式也支持很多负载均衡算法,比如:轮询,最小连接和其他哈希算法。

5.2.1.劣势

IPVS模块不一定默认安装在Linux系统中,你可能需要手动安装或启用它。并且如果不是大规模集群,IPTables就可以满足你的场景。

IPVS和Iptable对比

tigera公司提供的数据,就是开源Colico网络组件的那个公司。

  1. 服务数量与平均响应时间

    e3d002a444b4f11d7d3e54d64d54e477.png

  2. 服务数量与CPU占用

    5948f51c9009ddde4a9106a3c2431e9d.png

如何iptables和ipvs如何选择?

上面的两个图表表示:在1000个Pod时ipvs和iptables性能没有什么差别,超过1000个ipvs模式性能更高。

另外,如果你不确定使用哪个,你就选择ipvs吧。

5.3.KernelSpace 模式

这个模式时Windows节点专用的。在这个模式下,kube-proxy会将包过滤规则写入到windows的VFP(Windows Virtual Filtering Platform)。Windows上的VFP的工作原理和Linux的IPTables一样,这就意味着VFP会将数据包中的目的IP地址替换为Pod的IP地址。

如果你不熟悉Windows平台的虚拟机,那么你可以认为VFP是Hyper-V的一个扩展,这个扩展专门用于虚拟机网络。

5.4.如果检查kube-proxy的模式?

你可以通过接口查询kube-proxy的模式,kube-proxy默认端口为10249.

你可以使用/proxyMode 来查询kube-proxy模式,

curl -v localhost:10249/proxyMode

COPY

 

f66664dd5018ef4a55f21668cfbec8c3.png

上图展示了这个kube-proxy使用了ipvs模式。

5.5.IPVS规则查看

IPVS可以通过ipvsadm命令进行查看,可能需要先安装

sudo apt install ipvsadm
sudo ipvsadm -L

COPY

 

d4c1c8596c42e9cadc24cb6feda5913f.png

5.6.IPTables规则查看

使用iptables命令查看nat规则列表

iptables -t nat -n -L

COPY

 

9359c4ad1bcd2e88752700ec9964ec72.png

6.FAQ

6.1.k8s Service是一个代理吗 ?

k8s service使用起来像是一个代理,它为客户端提供了一个静态接入点。

6.2.kube-proxy会进行负载均衡吗 ?

这个视情况而定。
如果你说的是的kube-proxy这个k8s的网络agent,那么kube-proxy不会进行负载均衡。因为kube-proxy并不接收流量进行转发,而是依赖于OS提供的能力。

如果你说的是kube-proxy创建的规则,那么会。因为kube-proxy会创建对多个Pod创建具有负载均衡能力的Service,这个依赖于iptables/ipvs/kernelspec。

7.总结

kube-proxy是k8s的网络代理,它主要将Service的定义转换为网络规则。它在集群中的每个Node上运行,并与API Server通信以接收Service的更新,然后将这些更新同步到自己的Node中。

kube-proxy并不会直接接收流量并将其转发,而是依赖于OS提供的相关能力来完成。

8.参考

k8s kube-proxy – FOF编程网

 

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

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

相关文章

从“危”到“机”:HubSpot如何助企业转化出海营销CRM风险?

在全球化的大背景下,越来越多的企业选择出海拓展业务,以寻求更大的发展空间。然而,随着市场的扩大,企业在出海营销过程中也面临着各种风险。为了有效规避这些风险,许多企业选择借助HubSpot这样的专业营销软件。今天运营…

国际数字影像产业园构建成都文创产业园新地标!

国际数字影像产业园区,位于成都市金牛区的核心地带,不仅地理位置得天独厚,而且周边配套设施完善,交通便捷,不止成为北二环的新地标,正在构建成都文创产业园新地标! 国际数字影像产业园这一片区…

专利年费缴纳后电子票据

专利年费缴纳后的电子票据 随着信息技术的快速发展,电子票据作为一种新型的支付与记录方式,已经深入到了我们日常生活的各个方面。特别是在知识产权领域,专利年费的缴纳也开始逐步实现电子化。 一、专利年费缴纳的重要性 专利年费是专利权…

5【PS让图片动起来】系列3-【时间轴 花瓣飘落】

【问题介绍】上章将花瓣拆分为一片片花瓣,现在让这片花瓣【动态】飘落吧~ PS选择“窗口”→ “时间轴” 下方弹出时间轴,其中01:00f就是这个位置为1秒的。中间的0 10f 20f等,为帧速率,也就是一秒的动画时间里有几帧的意思 下图…

Linux进阶篇:磁盘管理(二):LVM的创建、格式化和使用

Linux磁盘管理(二):LVM的创建、格式化和使用 一、LVM原理回顾 LVM的工作原理进行一个总结: (1)物理磁盘被格式化为PV,空间被划分为一个个的PE (2)不同的PV加入到同一个VG中,不同PV的PE全部进入到了VG的PE…

2024年【R1快开门式压力容器操作】最新解析及R1快开门式压力容器操作试题及解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年【R1快开门式压力容器操作】最新解析及R1快开门式压力容器操作试题及解析,包含R1快开门式压力容器操作最新解析答案和解析及R1快开门式压力容器操作试题及解析练习。安全生产模拟考试一点通结合国家…

比特币革命:刚刚开始

作者:Marius Farashi Tasooji 编译:秦晋 要充分理解比特币及其含义,首先必须理解什么是价值,什么是货币。以及是什么赋予资产价值? 这个问题看似愚蠢,但实际上非常有趣。我们的生活是由我们消费或出售的物品…

scrapy 爬取m3u8视频

scrapy 爬取m3u8视频 【一】效果展示 爬取ts文件样式 合成的MP4文件 【二】分析m3u8文件路径 视频地址:[在线播放我独自升级 第03集 - 高清资源](https://www.physkan.com/ph/175552-8-3.html) 【1】找到m3u8文件 这里任务目标很明确 就是找m3u8文件 打开浏览器…

CPU和GPU分别是什么?主要区别是什么?

CPU与GPU的区别 定义性能特点应用领域结构与体积控制与协同工作特殊用途与限制脑图 定义 CPU: 中央处理器,负责解释并执行指令GPU: 图形处理器,专用于图形和视频处理 性能特点 CPU 计算量小,适合复杂运算结构组成复杂,控制逻辑…

老王讲IT:高级变量类型

IT老王:高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型(float) 布尔型(bool) 真 True 非 0 数 —— 非零…

一文了解ERC404协议

一、ERC404基础讲解 1、什么是ERC404协议 ERC404协议是一种实验性的、混合的ERC20/ERC721实现的,具有原生流动性和碎片化的协议。即该协议可让NFT像代币一样进行拆分交易。是一个图币的互换协议。具有原生流动性和碎片化的协议。 这意味着通过 ERC404 协议&#xf…

python--正则表达式-分组,贪婪模式,懒惰模式

分组&#xff1a; 分组在正则表达式中充当二次筛选 re.match(r"<[a-zA-Z].*>(.*)</[a-zA-Z]>", "<a>这个是百度的链接</a>") <re.Match object; span(0, 15), match<a>这个是百度的链接</a>> 贪婪与懒惰模式&am…

这个40M的小工具助你在windows下处理数据如虎添翼!!

这个40M的小工具助你在windows下处理数据如虎添翼&#xff01;&#xff01;7 使用windows系统时&#xff0c;如何获取一个大小为1M的文件的行数呢&#xff1f;一般是选择用excel或notepad等软件打开文件&#xff0c;然后查看最后一行的行号&#xff0c;那如果是想快速获取一个…

OSCP靶场--Nagoya

OSCP靶场–Nagoya 考点 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.214.21 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-02 08:52 EDT Nmap scan report for 192.168.214.21 Host is up (0.38s latency).…

用Python实现输入点云索引绘制该点云法向量

import open3d as o3d# 读取pcd文件 pcd o3d.io.read_point_cloud(r"D:\PythonProjects\Codes\paper_images\back_point\voxel.pcd")# 计算法向量 pcd.estimate_normals(search_paramo3d.geometry.KDTreeSearchParamHybrid(radius0.1, max_nn30))# 选择要绘制法向量…

C#:用定时器监控定时器,实现中止定时器正在执行的任务,并重启

Windows服务中使用的比较多的是定时器&#xff0c;但这种定时任务有个比较大的毛病&#xff1a;有时会莫名其妙地停止执行&#xff08;长时间执行不完&#xff0c;假死&#xff09;&#xff0c;必须得手工重启Windows服务才能恢复正常。这个就太麻烦了。 有没有办法来实现定时…

MAC苹果电脑如何使用Homebrew安装iperf3

一、打开mac终端 找到这个终端打开 二、终端输入安装Homebrew命令 Homebrew官网地址&#xff1a;https://brew.sh/ 复制这个命令粘贴到mac的终端窗口&#xff0c;然后按回车键 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/in…

引领教育变革:山海鲸可视化智慧教育方案

随着信息技术的迅猛发展&#xff0c;教育领域正迎来一场深刻的变革。山海鲸可视化智慧教育解决方案&#xff0c;以其创新的技术和丰富的应用场景&#xff0c;正成为推动教育现代化进程的重要力量。 山海鲸可视化智慧教育解决方案是一套集教学、管理、服务于一体的综合性教育系…

Vue的模块化开发初探

文章目录 Vue的模块化开发初探一 概述二 步骤2.1 下载必须模块2.2 安装Live Server插件2.3 编写代码2.4 运行结果 三 总结四 参考资料 Vue的模块化开发初探 一 概述 Vue是一个渐进式JavaScript框架&#xff0c;可以按需引入部分功能&#xff0c;而不必全量引入整个框架。 二…

【机器学习】一文掌握机器学习十大分类算法(上)。

十大分类算法 1、引言2、分类算法总结2.1 逻辑回归2.1.1 核心原理2.1.2 算法公式2.1.3 代码实例 2.2 决策树2.2.1 核心原理2.2. 代码实例 2.3 随机森林2.3.1 核心原理2.3.2 代码实例 2.4 支持向量机2.4.1 核心原理2.4.2 算法公式2.4.3 代码实例 2.5 朴素贝叶斯2.5.1 核心原理2.…