深入理解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.mfbz.cn/a/528531.html

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

相关文章

二豆写作能用吗 #笔记#笔记

二豆写作是一款非常好用、靠谱、方便的论文写作工具,它能帮助用户快速完成论文写作,并且具有查重降重的功能。那么,二豆写作到底能不能用呢?答案是肯定的,二豆写作绝对是值得推荐的。 首先,二豆写作提供了丰…

AWS实操-EC2-创建购买linux(centos)EC2服务器教程

AWS作为全球最大的云厂商,技术成熟,产品线丰富,很多用户在购买Linux系统,EC2服务器的时候会出现很多问题,这次九河云详细将AWS的购买流程进行图文阐述,以方便大家在后续的使用和购买。 启动实例 在AWS EC2…

《古琴律学教材》是一本不可或缺的指南,全阶段都适用

《古琴律学教材》是一本不可或缺的指南,它将帮助你深入了解古琴的琴音原理、调弦方法和突破瓶颈的技巧。无论你是初学者还是有一定基础的古琴爱好者,这本教材都是你必须看的。首先,教材详细解析了古琴律学的基本概念和原理。你将了解到古琴的…

一文搞懂NLP框架之RNN、LSTM、Transformer结构原理!

NLP领域中,特征提取可谓是经历了显著的“变迁”与发展。回首过往,RNN曾以其独特的序列建模能力一度引领潮流,如今正如同明日黄花,逐步淡出历史舞台。紧接着,LSTM以解决长时依赖问题的独特设计展现出强大的生命力&#…

STM32中C编程引入C++程序

C具备类的创建思想很实用于实际场景多相似性的框架搭建;同种类型或相似类型的C的优势明显因此进行相互嵌套使用 需要在C中使用C类的话,你可以通过C的“extern "C"”语法来实现。这允许你在C代码中使用C的链接方式,而在C代码中使用…

SCP收容物051~060​

注 :此文接SCP收容物041~050​,本文只供开玩笑 ,与steve_gqq_MC合作。 --------------------------------------------------------------------------------------------------------------------------------- 目录 SCP-051 SCP-052 SCP-053 SCP-054 SCP-0…

【C语言】青蛙跳台阶问题

题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。现求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 题目分析: 当 n 等于 1 时,青蛙只能跳一级台阶到达,因此只有一种跳法,直接返回 1。当 n 等于 2 时…

万字源码解析!彻底搞懂 HashMap【二】:putVal 方法和 resize 方法(重点)

HashMap 的底层原理和扩容机制一直都是面试的时候经常被问到的问题,同时也是集合源码中最难阅读的一部分😢,之前更新的 ArrayList 源码阅读收获了很多朋友的喜欢,也给了我很多自信;本次我准备完成一个关于 HashMap 源码…

CST操作教程|精简仿真结果容量和隐藏结构的加密保护功能

使用Archive As精简仿真结果容量 结果保持不变,缩小仿真结果容量的方法。 File > Project > Archive As simulation后保存数据时仿真文件容量太大很是让人头大。为什么文件容量变这么大呢?通常不是因为CST图标形状的.cst文件造成的,而是因为生…

C++set和map详细介绍

文章目录 前言一、关联式容器和序列式容器二、set1.set文档介绍2.set成员函数1.构造函数2.迭代器3.容量4.修改5.其他 三.multiset四.map1.map文档介绍2.map成员函数1.构造2.insert插入3.count4.迭代器5.【】和at 五.multimap总结 前言 在本篇文章中,我们将会学到关…

DC-DC芯片D1509适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。

一、应用领域 适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。 二、功能介绍 D1509是芯谷科技推出的一款输入耐压40V、输出电压1.23-37V可调、输出电流最大2.0A的高效率、高精度DC-DC芯片,其输出电压有固定3.3V、5.0V和12.0V的版本&#xff…

BM96 主持人调度(二)(贪心算法)

一开始写的时候忘了给start、end数组赋值了 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 计算成功举办活动需要多少名主持人* param n int整型 有n个活动* param start…

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

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

Vue3快速上手 详细内容

Vue3快速上手 1.Vue3简介 2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王)耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址:Release v3.0.0 One Piece vuejs/core Git…

什么是国密SSL证书,和其他SSL证书的区别?

我们要了解什么是SSL证书。SSL(Secure Sockets Layer,安全套接层)是一种安全协议,主要用于在互联网上对通信双方进行身份验证以及保障数据的安全传输。而SSL证书则是由权威的数字证书认证机构签发的,用于证明网站身份的…

【Linux】磁盘与文件系统管理

目录 一、 磁盘结构 1. 数据结构 2. 物理结构 3. 硬盘的接口类型 二、 如何使用Linux中的磁盘 三、 文件系统 四、 磁盘分区 1. MBR分区 2. 分区的优缺点 3. 磁盘及分区的管理工具 五、格式化与挂载 1. 格式化 2. 挂载 六、实例演示 1. 演示分区格式化挂载 2. …

C语言写流星雨代码

目录 需要包含的头文件 图片素材的路径 初始化背景图片 报错怎么解决? 初始化流星雨 放置流星雨图片 让流星雨动起来 总不能让流星砸到地面吧 是不是应该再来一点背景音乐? 所有代码 需要包含的头文件 IMAGE img;//创建流星雨的图片变量void…

HTML - 请你说一下如何阻止a标签跳转

难度级别:初级及以上 提问概率:55% a标签的默认语义化功能就是超链接,HTML给它的定位就是与外部页面进行交流,不过也可以通过锚点功能,定位到本页面的固定id区域去。但在开发场景中,又避免不了禁用a标签的需求,那么都有哪些方式可以禁用…

Jmeter针对多种响应断言的判断

有时候response返回的结果并非一种,有多种,需要对这几种进行判断的时候需要使用Bean Shell。 (1)首先获取响应数据 String response prev.getResponseDataAsString(); ResponseCode 响应状态码 responseHeaders 响应头信息 res…

DFS:深搜+回溯+剪枝解决排列、子集问题

创作不易&#xff0c;感谢三连支持&#xff01;&#xff01; 一、全排列I . - 力扣&#xff08;LeetCode&#xff09; class Solution { public://全局变量vector<vector<int>> ret;vector<int> path;bool check[6];vector<vector<int>> perm…
最新文章