当前位置: 首页 > news >正文

比较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 的使用是可扩展的!

相关文章:

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

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

CSS:浮动

▐ 文档流: 由于网页默认是一个二维平面,当我们在网页中一行行摆放标签时,块标签会独占一行,行标签则只占自身大小,这种情况下要实现网页布局就很麻烦了,所以我们就需要通过一些方法来改变这种默认的布局方…...

SQL 语言:嵌入式 SQL 和动态 SQL

文章目录 基本概述嵌入式 SQL动态 SQL总结 基本概述 嵌入式SQL和动态SQL是两种在应用程序中嵌入和使用SQL语句的方法。它们都允许开发人员在编程语言中编写SQL语句,以便在应用程序中执行数据库操作。然而,这两种方法在实现方式、性能和灵活性方面存在一…...

Java Object类方法介绍

Object作为顶级类,所有的类都实现了该类的方法,包括数组。 查询Java文档: 1、object.eauqls(): 其作用与 有些类似。 : 是一个比较运算符,而不是一个方法。 ①可以判断基本类型,也可以判断引用类型。 ②若…...

2024 京麟ctf -MazeCodeV1

文章目录 检查代码思路一个字节的指令注意附上S1uM4i佬们的exp https://www.ctfiot.com/184181.html 检查 代码 __int64 __fastcall check_solve(char *a1) {__int64 result; // rax__int64 v2; // rax__int64 index_step; // rax__int64 v4; // rax__int64 v5; // rax__int64…...

计算机网络基础 - 计算机网络和因特网(1)

计算机网络基础 计算机网络和因特网什么是 Internet?具体构造的的角度服务角度网络结构 网络边缘网络核心电路交换分组交换概述排队时延和分组丢失转发表和路由选择协议按照有无网络层的连接 分组交换 VS 电路交换 接入网DSL 因特网接入电缆因特网接入光纤到户 FTTH无线接入网…...

自学动态规划——零钱兑换

零钱兑换 322. 零钱兑换 - 力扣(LeetCode) 注意几个关键的地方: 因为每次都是找min,所以我们不能将所有元素都初始化为0,不然最后结果一定是0,这里我设置为0x3f3f3f3f,表示无解。当amount0的…...

kafka单机安装及性能测试

kafka单机安装及性能测试 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,并于2011年开源,随后成为Apache项目。Kafka的核心概念包括发布-订阅消息系统、持久化日志和流处理平台。它主要用于构建实时数据管道和流处理应用&#xff…...

2024.05.29学习记录

1、css面经复习 2、代码随想录二刷 3、rosebush upload组件初步完成...

6.10 Libbpf-bootstrap(一,简介)

写在前面 在看完前面的介绍,是不是感觉看了也就看了。但是,如果想要像BCC那样使用libbpf编写BPF程序,该怎么开始呢? 那么这就需要libbpf-bootstrap了。 libbpf-bootstrap是官方推荐的一个范式,就像我们写PPT的模版。简单来说可以简化我们的BPF开发流程,它可以帮助我们…...

2.1.2 基于配置方式使用MyBatis

文章目录 实战目标实战步骤1. 创建Maven项目2. 添加项目依赖3. 创建用户实体类4. 创建用户映射器配置文件5. 创建MyBatis配置文件6. 创建日志属性文件7. 测试用户操作8. 运行测试方法 预期结果实战方法结论 实战目标 本实战的目标是演示如何使用MyBatis框架来操作数据库。通过…...

使用NuScenes数据集生成ROS Bag文件:深度学习与机器人操作的桥梁

在自动驾驶、机器人导航及环境感知的研究中,高质量的数据集是推动算法发展的关键。NuScenes数据集作为一项开源的多模态自动驾驶数据集,提供了丰富的雷达、激光雷达(LiDAR)、摄像头等多种传感器数据,是进行多传感器融合…...

氢燃料电池汽车行业发展

文章目录 前言 市场分布 整车销售 发动机配套 氢气供应 发展动能 参考文献 前言 见《氢燃料电池技术综述》 见《燃料电池工作原理详解》 见《燃料电池发电系统详解》 见《燃料电池电动汽车详解》 市场分布 纵观全球的燃料电池汽车市场,截至2022年底&#xff…...

Linux服务器配置ssh证书登录

1、ssh证书登录介绍 Linux服务器ssh登录有密码登录和证书登录两种。如果使用密码登录,容易遭受密码泄露或者暴力破解,我们可以使用ssh证书登录并禁止使用密码登录,ssh证书登录通过公钥和私钥来完成整个连接过程,公钥保存在服务器…...

端口扫描利器--nmap

目录 普通扫描 几种指定目标的方法 TCP/UDP扫描 端口服务扫描 综合扫描 普通扫描 基于端口连接并响应(真实) ​ nmap -sn 网段(0/24)-sn 几种指定目标的方法 单个IP扫描 IP范围扫描 扫描文件里的IP 扫描网段,(排除某IP) 扫描网段(排除某清单IP) TCP/UDP扫描 -sS …...

React基础知识笔记

Reat简介 React:用于构建用户界面的 JavaScript 库。由 Facebook 开发且开源。是一个将视图渲染为html视图的开源库 第一章:React入门 相关js库 react.development.js :React 核心库react-dom.development.js :提供 DOM 操作的…...

筛选的艺术:数组元素的精确提取

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、筛选的基本概念 二、筛选的实际应用案例 1. 筛选能被三整除的元素 2. 筛选小于特定值…...

SQLServer2022新特性JSON_PATH_EXISTS测试输入 JSON 字符串中是否存在指定的 SQL/JSON 路径

SQLServer2022新特性JSON_PATH_EXISTS测试输入 JSON 字符串中是否存在指定的 SQL/JSON 路径 参考官方文档 https://learn.microsoft.com/en-us/sql/t-sql/functions/json-path-exists-transact-sql?viewsql-server-ver16 1、本文内容 语法参数返回值示例相关内容 适用于&a…...

力扣:104. 二叉树的最大深度

104. 二叉树的最大深度 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入&#xff1a…...

嵌入式0基础开始学习 ⅠC语言(3)分支结构

C语言程序设计结构 分三种 顺序结构: 一条一条指令执行。 int a,b; a 3; b 4; 分支结构(选择结构):…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM&#xff09…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...