比较kube-proxy模式:iptables还是IPVS?

kube-proxy是任何 Kubernetes 部署中的关键组件。它的作用是将流向服务(通过集群 IP 和节点端口)的流量负载均衡到正确的后端podkube-proxy可以运行在三种模式之一,每种模式都使用不同的数据平面技术来实现:userspaceiptablesIPVS

userspace 模式非常旧且慢,绝对不推荐!但是,应该如何权衡选择 iptables 还是 IPVS 模式呢?在本文中,我们将比较这两种模式,在实际的微服务环境中衡量它们的性能,并解释在何种情况下你可能会选择其中一种。

首先,我们将简要介绍这两种模式的背景,然后深入测试和结果……

背景:iptables 代理模式

iptables 是一个 Linux 内核功能,旨在成为一个高效的防火墙,具有足够的灵活性来处理各种常见的数据包操作和过滤需求。它允许将灵活的规则序列附加到内核数据包处理管道中的各个钩子上。在 iptables 模式下,kube-proxy将规则附加到 “NAT pre-routing” 钩子上,以实现其 NAT 和负载均衡功能。这种方式可行,简单,使用成熟的内核功能,并且与其他使用 iptables 进行过滤的程序(例如 Calico)能够很好地兼容。

然而,kube-proxy 编程 iptables 规则的方式意味着它名义上是一个 O(n) 风格的算法,其中 n 大致与集群规模成正比(更准确地说,是与服务的数量和每个服务背后的后端 pod 数量成正比)。

背景:IPVS 代理模式

IPVS 是一个专门为负载均衡设计的 Linux 内核功能。在 IPVS 模式下,kube-proxy通过编程 IPVS 负载均衡器来代替使用 iptables。它同样使用成熟的内核功能,且 IPVS 专为负载均衡大量服务而设计;它拥有优化的 API 和查找例程,而不是一系列顺序规则。

结果是,在 IPVS 模式下,kube-proxy 的连接处理具有名义上的 O(1) 计算复杂度。换句话说,在大多数情况下,它的连接处理性能将保持恒定,而不受集群规模的影响。

此外,作为一个专用的负载均衡器,IPVS 拥有多种不同的调度算法,如轮询、最短期望延迟、最少连接数和各种哈希方法。相比之下,iptables 中的 kube-proxy 使用的是随机的等成本选择算法。

IPVS 的一个潜在缺点是,通过 IPVS 处理的数据包在 iptables 过滤钩子中的路径与正常情况下的数据包非常不同。如果计划将 IPVS 与其他使用 iptables 的程序一起使用,则需要研究它们是否能够预期地协同工作。(别担心,Calico 早在很久以前就已经与 IPVS kube-proxy 兼容了!)

性能比较

好的,从名义上来说,kube-proxy在 iptables 模式下的连接处理是 O(n) 复杂度,而在 IPVS 模式下是 O(1) 复杂度。但在实际微服务环境中,这意味着什么呢?

在大多数情况下,涉及应用程序和微服务时,kube-proxy性能有两个关键属性可能是您关心的:

  1. 对往返响应时间的影响:当一个微服务向另一个微服务发出 API 调用时,平均而言第一个微服务发送请求并从第二个微服务接收响应需要多长时间?
  2. 对总 CPU 使用率的影响:在运行微服务时,包括用户空间和内核/系统使用在内的主机总 CPU 使用率是多少?这包括了支持微服务所需的所有进程,包括 kube-proxy。

为了说明这一点,我们在一个专用节点上运行了一个“客户端”微服务 pod,每秒生成 1000 个请求,发送到由 10 个“服务器”微服务 pod 支持的 Kubernetes 服务。然后,我们在 iptables 和 IPVS 模式下,在客户端节点上测量了性能,使用了各种数量的 Kubernetes 服务,每个服务有 10 个 pod 支持,最多达到 10,000 个服务(即 100,000 个服务后端)。对于微服务,我们使用golang编写的简单测试工具作为我们的客户端微服务,并使用标准NGINX作为服务器微服务的后端pods。

往返响应时间

在考虑往返响应时间时,理解连接和请求之间的区别非常重要。通常,大多数微服务将使用持久连接或“keepalive”连接,这意味着每个连接会在多个请求之间重复使用,而不是每个请求都需要新建一个连接。这一点很重要,因为大多数新连接都需要在网络上进行三次握手(这需要时间),并且在 Linux 网络栈内进行更多处理(这也需要一点时间和 CPU 资源)。

为了说明这些差异,我们在有和没有 keepalive 连接的情况下进行了测试。对于 keepalive 连接,我们使用了 NGINX 的默认配置,该配置会将每个连接保持活跃状态以供最多 100 个请求重复使用。请参见下图,注意响应时间越低越好。

图表显示了两个关键点:

  1. 在超过 1,000 个服务(10,000 个后端 pod)之前,iptables 和 IPVS 之间的平均往返响应时间差异微不足道。
  2. 平均往返响应时间的差异仅在不使用 keepalive 连接时才明显。也就是说,当每个请求都使用新连接时,差异才会显现。

对于 iptables 和 IPVS 模式,kube-proxy 的响应时间开销与建立连接有关,而不是与连接上的数据包或请求数量有关。这是因为 Linux 使用连接跟踪(conntrack),能够非常高效地将数据包匹配到现有连接。如果数据包在 conntrack 中被匹配到,就不需要通过 kube-proxy 的 iptables 或 IPVS 规则来决定如何处理它。

值得注意的是,在这个例子中,“服务器”微服务使用的是 NGINX pod 提供一个小的静态响应体。许多微服务需要做的工作远不止这些,这将导致相应更高的响应时间,这意味着 kube-proxy 处理的时间差在这种图表中将占据更小的百分比。

最后有一个奇怪现象需要解释:为什么在 10,000 个服务时,非 keepalive 连接的响应时间在 IPVS 模式下变得更慢,即使 IPVS 中新连接的处理复杂度是 O(1)?要真正深入了解这一点,我们需要进行更多的挖掘,但其中一个因素是整个系统由于主机上增加的 CPU 使用而变得更慢。这也引出了下一个话题。

总CPU使用率

为了说明总 CPU 使用率,下面的图表集中在不使用持久/keepalive 连接的最坏情况下,此时 kube-proxy 连接处理的开销影响最大。

图表显示了两个关键点:

  1. 在超过 1,000 个服务(10,000 个后端 pod)之前,iptables 和 IPVS 之间的 CPU 使用率差异相对不显著。
  2. 在 10,000 个服务(100,000 个后端 pod)时,iptables 的 CPU 增加约为一个内核的 35%,而 IPVS 增加约为一个内核的 8%。

有两个主要因素影响这种 CPU 使用模式。
第一个因素是,默认情况下,kube-proxy 每 30 秒重新编程一次内核中的所有服务。这解释了为什么即使 IPVS 的新连接处理名义上是 O(1) 复杂度,IPVS 模式下的 CPU 也会略有增加。此外,较早版本内核中重新编程 iptables 的 API 速度比现在慢得多。因此,如果您在 iptables 模式下使用旧版内核,CPU 增长将比图表中显示的更高。

第二个因素是 kube-proxy 使用 iptables 或 IPVS 处理新连接所需的时间。对于 iptables,这在名义上是 O(n) 复杂度。在大量服务的情况下,这对 CPU 使用有显著影响。例如,在 10,000 个服务(100,000 个后端 pod)时,iptables 每个新连接执行约 20,000 条规则。不过,请记住,在这个图表中,我们展示的是每个请求都使用新连接的最坏情况。如果我们使用 NGINX 默认的每个连接 100 次 keepalive 请求,那么 kube-proxy 的 iptables 规则执行频率将减少 100 倍,从而大大降低使用 iptables 而非 IPVS 的 CPU 影响,接近一个内核的 2%。

值得注意的是,在这个例子中,“客户端”微服务简单地丢弃了从“服务器”微服务接收到的每个响应。一个实际的微服务需要做的工作远不止这些,这将增加图表中的基础 CPU 使用率,但不会改变与服务数量相关的 CPU 增加的绝对值。

结论

在显著超过 1,000 个服务的规模下,kube-proxy 的 IPVS 模式可以提供一些不错的性能提升。具体效果可能有所不同,但一般来说,对于使用持久“keepalive”连接风格的微服务,且运行在现代内核上的情况下,这些性能提升可能相对有限。对于不使用持久连接的微服务,或者在较旧内核上运行时,切换到 IPVS 模式可能会带来显著的收益。

除了性能方面的考虑外,如果您需要比 kube-proxy 的 iptables 模式的随机负载均衡更复杂的负载均衡调度算法,也应该考虑使用 IPVS 模式。

如果您不确定 IPVS 是否会对您有利,那么坚持使用 kube-proxy 的 iptables 模式。它已经经过大量的生产环境验证,尽管并不完美,但可以说它作为默认选择是有原因的。

比较 kube-proxy 和 Calico 对 iptables 的使用

在本文中,我们看到 kube-proxy 使用 iptables 在非常大规模时会导致性能影响。我有时会被问到,为什么 Calico 没有遇到同样的挑战。答案是 Calico 对 iptables 的使用与 kube-proxy 有显著不同。kube-proxy 使用了一条非常长的规则链,其长度大致与集群规模成正比,而 Calico 使用的是非常短且优化的规则链,并广泛使用 ipsets,其查找时间复杂度为 O(1),不受其大小影响。
为了更好地理解这一点,下面的图表显示了在集群中的节点平均托管 30 个 pod,且集群中的每个 pod 平均适用 3 个网络策略的情况下,每个连接由 kube-proxy 和 Calico 执行的 iptables 规则的平均数量。

即使在完全扩展的集群中运行,拥有 10,000 个服务和 100,000 个后端 pod 时,Calico 每个连接执行的 iptables 规则数量大致与 kube-proxy 在拥有 20 个服务和 200 个后端 pod 时执行的规则数量相同。换句话说,Calico 对 iptables 的使用是可扩展的!

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

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

相关文章

QT::QNetworkReply类readAll()读取不到数据的可能原因

程序中,当发送请求时,并没有加锁,而是在响应函数中加了锁,导致可能某个请求的finished信号影响到其他请求响应数据的读取 connect(reply,&QNetworkReply::finished,this,&Display::replyFinished);参考这篇文章&#xff…

[LLM]从GPT-4o原理到下一代人机交互技术

一 定义 背景:在推出GPT-4o之前,使用语音模式与ChatGPT交流的延迟较长,无法直接观察语调、多个说话者或背景噪音,且无法输出笑声、歌唱或表达情感。 GPT-4o作为OpenAI推出的一款多模态大型语言模型,代表了这一交互技…

听说京东618裁员?所以日常准备很重要呀

文末有最少必要的面试题,还准备了离线 PDF 版本。 京东也要向市场输送人才了? 这几天看到技术群里不少朋友在讨论京东裁员相关的信息。 我去看了下京东近期的操作,京东内部考勤调整和午休时间缩短,以及强化打卡机制等管理调整;有…

AMEYA360代理 | 村田电子去寄生电感降噪元件(LCT)特点和规格

株式会社村田制作所(以下简称“村田”)开发了行业首款(1)利用负互感(2)、能对从数MHz到1GHz的谐波(3)范围内电源噪声进行抑制的去寄生电感降噪元件“LXLC21系列”(以下简称“本产品”)。只需将1件本产品连接至电源电路中的电容器,即可消除与本产品连接的电容器的ESL…

OpenMv图片预处理

本博客讲述的是获取一张图片首先对图像进行处理,比如畸形矫正,图像滤波等操作。 1.histeq()自适应直方图均衡 # 自适应直方图均衡例子 # # 此示例展示了如何使用自适应直方图均衡来改善图像中的对比度。 #自适应直方图均衡将图像分割成区域,然后均衡这些区域中的直方图,…

ubuntu server版 虚拟机根目录磁盘扩容

之前一直使用桌面版ubuntu,因为项目原因需要拉取的代码太大了且项目比较多选择了体量更小的Ubuntu server版,在使用中发现根目录的磁盘很快就用满了 如上,明明分配的300G但是/dev/mapper/ubuntu--vg-ubuntu--lv 只有98G都用满了 server版本与桌面版不同的是在server版安装的时…

一篇文章搞懂二叉树

文章目录 DP 树叶的度树的度节点的层次节点的祖先节点的子孙双亲节点或父节点 树的表示孩子兄弟表示法双亲表示法树和非树树的应用 二叉树满二叉树完全二叉树推论二叉树的存储以数组的方式以链表的方式堆(Heap)堆的分类大根堆和小根堆的作用 二叉树的遍历DFS和BFS DP 动态规划…

HCIA--DHCP: 动态主机配置协议 (复习)

DHCP: 动态主机配置协议 -- 同一分发管理ip地址 基于UDP 67/68端口工作 网络中存在DHCP的服务器为需要自动生成ip地址的设备分配ip地址;--C/S模型 成为DHCP服务器的条件: 该设备存在接口或网卡连接到所要分发ip地址的广播域内该接口或网卡必须已经配置…

在WHM中如何调整max_upload_size 参数大小

今日我们在搭建新网站时需要调整一下PHP参数max_upload_size 的大小,我们公司使用的Hostease的美国独立服务器产品默认5个IP地址,也购买了cPanel面板,因此联系Hostease的技术支持,寻求帮助了解到如何在WHM中调整PHP参数&#xff0…

全志T527芯片详解【二】:高清图像编解码

硬件模块加持 T527集成了多个图形显示和编解码相关的硬件模块,为高清图像显示、高清视频播放和多路高清摄像头输入提供了强大的硬件基础: ARM Mail-G57 GPU自研显示引擎(Display Engine)去隔行处理单元(De-interIace)2D图像加速单元(Graphic2D)视频编解…

SFOS2:组件介绍

一、前言 在sailfish os application的开发过程中,几乎是困难重重,因为我暂未找到具有完整性、指导性、易懂性的开发文档,特别是组件的使用,现决定将自己的探究结果记录下来。因此,这篇文章只会具有参考价值&#xff0…

链动3+1模式:深度解析与优势探讨

在数字化营销领域,链动模式因其强大的裂变能力和高效的引流机制而备受瞩目。其中,链动21模式一度是商家们的首选,但随着时间的推移,其存在的问题也逐渐显现:预留小号和较低的复购率成为制约其进一步发展的瓶颈。为了解…

map优化多个if

原代码如下,多个按钮的点击操作,其中val是操作的按钮的标志 const operationConst {INSTALLAPP: installApp,STOPAPP: stopApp,HOME: home,CLEAR: clear...... } function moreOperation(val, list) {selectedList list && list.length 0 ?…

最新!2023年台湾10米DEM地形瓦片数据

上次更新谷歌倾斜摄影转换生成OSGB瓦片V1.1版本,使用该版本生产了台北、台中、桃园三个地方的倾斜摄影OSGB数据,在OSGB可视化软件中进行展示,可视化效果和加载效率俱佳。已经很久没更新地形瓦片数据,主要是热点地区的原始数据没有…

算法的时间复杂度(详解)

前言: 算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果 一、算法效率 1.1 如何衡量一个算法的好坏 如何衡…

3.Linux系统环境搭建

一、虚拟化机:指的是通过虚拟化技术将一台计算机分为多台逻辑计算机。注:虚拟机共用CPU和内存资源。 二、虚拟机用途: 1.搭建学习环境:例如在同一间实验室里,物理机Windows系统,虚拟机可以用Linux系统。 …

汇舟问卷:国外问卷调一天900

大家好,我是汇舟问卷,专注于国外问卷调查互联网项目。夏天已经来临,您是否在三伏天顶着大太阳上班,汗水浸湿了衣襟,却依然要面对繁琐的工作和无尽的压力? 在这个炎热的季节里,我们都渴望找到一…

什么是React?

01 Why React? What is React? I think the one-line description of React on its home page (https://react.dev/) is concise and accurate: “A JavaScript library for building user interfaces.” 我认为React主页(https://react.dev/)上的一行描述既简洁又准确: …

ch3运输层--计算机网络期末复习(持续更新中)

运输层位于网络层之上 运输层协议提供的某些服务受到网络层协议的限制。比如,时限和带宽保证。 运输层也提供自己的特殊服务。比如,可靠数据传输服务,安全性服务。 网络层:两个主机之间的逻辑通信 运输层:两个进程之间的逻辑通信 网络地址:主机的标识(IP地址) 传输地址: …

vmware中Ubuntu虚拟机和本地电脑Win10互相ping通

初始状态 使用vmware17版本安装的Ubuntu的20版本,安装之后什么配置都要不懂,然后进行下述配置。 初始的时候是NAT,没动的. 设置 点击右键编辑“属性” 常规选择“启用”: 高级选择全部: 打开网络配置,右键属…