Cilium系列-13-启用XDP加速及Cilium性能调优总结

系列文章

  • Cilium 系列文章

前言

将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提升 Cilium 的网络性能. 具体调优项包括不限于:

  • 启用本地路由(Native Routing)
  • 完全替换 KubeProxy
  • IP 地址伪装(Masquerading)切换为基于 eBPF 的模式
  • Kubernetes NodePort 实现在 DSR(Direct Server Return) 模式下运行
  • 绕过 iptables 连接跟踪(Bypass iptables Connection Tracking)
  • 主机路由(Host Routing)切换为基于 BPF 的模式 (需要 Linux Kernel >= 5.10)
  • 启用 IPv6 BIG TCP (需要 Linux Kernel >= 5.19)
  • 禁用 Hubble(但是不建议, 可观察性比一点点的性能提升更重要)
  • 修改 MTU 为巨型帧(jumbo frames) (需要网络条件允许)
  • 启用带宽管理器(Bandwidth Manager) (需要 Kernel >= 5.1)
  • 启用 Pod 的 BBR 拥塞控制 (需要 Kernel >= 5.18)
  • 启用 XDP 加速 (需要 支持本地 XDP 驱动程序)
  • (高级用户可选)调整 eBPF Map Size
  • Linux Kernel 优化和升级
    • CONFIG_PREEMPT_NONE=y
  • 其他:
    • tuned network-* profiles, 如: tuned-adm profile network-latencynetwork-throughput
    • CPU 调为性能模式
    • 停止 irqbalance,将网卡中断引脚指向特定 CPU

在网络/网卡设备/OS等条件满足的情况下, 我们尽可能多地启用这些调优选项, 相关优化项会在后续文章逐一更新. 敬请期待.

今天我们来调优 Cilium, 启用 XDP 加速, 以便能够直接从网络驱动层处理 NodePort 等入站请求,这有助于减少延迟和扩展服务。另外并对 Cilium 性能调优做阶段总结.

XDP 加速

Cilium 内置了对 NodePort、LoadBalancer 服务和具有外部 IP 的服务的加速支持,以便在后端位于远程节点时,将到达的请求从该节点直接推回。该功能在 Cilium 1.8 版的 XDP(eXpress Data Path)层中引入,eBPF 直接在网络驱动程序中运行,而不是在更高层中运行。

在这种情况下,网络数据包不需要一直推送到上层网络堆栈,而是在 XDP 的帮助下,Cilium 能够直接从网络驱动层处理这些请求。鉴于单个节点的转发能力大幅提高,这有助于减少延迟和扩展服务。从 Cilium 1.8 版开始,XDP 层的 kube-proxy 将被替换。

要求

  • Kernel >= 4.19.57, >= 5.1.16, >= 5.2
  • 支持原生的 XDP 驱动程序,具体请查看 Cilium 的驱动程序列表
  • Direct-routing 配置
  • 基于 eBPF 的 kube-proxy 替换

要启用 XDP 加速,请查看 Cilium 的入门指南,其中还包含在公共云提供商上进行设置的说明。

该模式设置 loadBalancer.acceleration 允许通过 native 选项启用加速。禁用选项是默认选项,用于禁用加速。大多数支持 10G 或更高速率的驱动程序在最新内核上也支持 native XDP。对于基于云的部署,这些驱动程序中的大多数都有支持本地 XDP 的 SR-IOV 变体。对于内部部署,Cilium XDP 加速可与 Kubernetes 的负载平衡器服务实现(如 MetalLB)结合使用。加速功能只能在用于直接路由的单个设备上启用。

负载平衡器加速设置支持 DSR、SNAT 和混合模式.

为了了解 Cilium 的 XDP 服务加速在全局中的位置,下文简要介绍了 Cilium 1.8 的服务负载平衡架构:

XDP

可以看出,Cilium 在 eBPF 中的 kube-proxy 替代方案在高层上由两个主要部分组成:套接字层的 eBPF 和驱动层的 eBPF。

  • 东西向流量,即所有 Cilium 管理节点之间的服务流量,仅在内核的套接字层处理,在此之前不会为数据包元数据分配内存。在这一点上执行,可使 Cilium 消除服务转换的每包成本。
  • 南北流量,即从外部源到 Cilium 管理节点的所有入站服务流量,都在尽可能靠近驱动层的地方进行处理,在单个接口上进行入口和出口操作。这样就能非常快速地处理转发,甚至可以在堆栈上层进行任何昂贵的操作之前,将流量丢弃或反射回入站接口。处理南北流量的后一个组件则通过 XDP 进行加速。

Cilium 的服务 XDP 加速目前支持直接路由模式,与我们的 tc eBPF 实现共享相同的核心代码。在 XDP 服务转换后,提供了三种将流量重定向到远程后端的选项:DSR、SNAT 和 Hybrid。

实施

helm upgrade cilium cilium/cilium --version 1.13.4 \
    --namespace kube-system \
    --reuse-values \
    --set loadBalancer.acceleration=native

验证

要验证您的安装是否使用了 XDP 加速功能,请在任何一个 Cilium pod 中运行 cilium status,并查找报告 "XDP Acceleration"状态的行,其中应显示 "Native"。如下所示:

$ kubectl -n kube-system exec ds/cilium -- cilium status --verbose | grep XDP
  XDP Acceleration:    Native

请注意,在 XDP 层为处理 NodePort 而从设备推回的数据包在 tcpdump 中是看不到的,因为数据包抽头是在网络堆栈的较后阶段出现的。可以使用 Cilium 的监控命令或 metric counters 来获得可见性。

性能提升

Cilium 进行了初步的基准测试,将单个服务部署到一个刚刚部署了 kubeadm 的节点上,该节点的内核为 5.7,使用基于 iptables 和 ipvs 的 kube-proxy 运行以获得基线,然后将 Cilium 的 kube-proxy 替换从 tc 和 XDP 端插入 eBPF,并将其置于 eBPF 的正前方:

XDP Benchmark Graph

初步结果显示,Cilium 的 kube-proxy 替代品的 XDP 加速能力大幅提升,能够最大限度地利用数据包生成器,将所有 1000 万个传入请求推送到远程服务后端,而使用 kube-proxy 时,被测节点每秒只能为同一服务转发约 210 万个请求,其余请求则会被丢弃。在 ipvs 中也观察到了类似的情况,尽管与 iptables 相比,ipvs 对大量服务的 "首包 "可扩展性更好,但每包成本似乎略高。将 kube-proxy 替换为 Cilium 的 tc eBPF 实现,不仅解决了 "第一数据包"可扩展性问题,还提高了性能,这一点从该节点每秒约 360 万次请求中可以看出,不过这仍然无法与 Cilium 在 XDP 层进行加速时获得的显著增益相比:

XDP Benchmark

比较 kube-proxy 和 Cilium 的 XDP 实现在每秒 1000 万次请求下的火焰图,还显示了在驱动程序的轮询例程中加速服务处理的捷径。此外,与在 tc 下运行 eBPF 的 Cilium 以及在 iptables 和 ipvs 模式下的 kube-proxy 相比,在 softirq 环境下,XDP 加速转发所需的处理开销要少得多。下面的测试在原本空闲的系统上运行,节点的 CPU 仅用于处理 softirq。图中显示了可用的剩余 CPU 容量。从图中可以看出,即使在特定节点每秒约 100 万个请求的低速率下,CPU 也只将约 13% 的时间用于处理 XDP 的 softirq 上下文,因此还有 87% 的剩余容量可用于其他方面,而在 kube-proxy 情况下,CPU 至少将 60% 的时间用于服务 softirq 上下文,最多只有 40% 的剩余可用容量。在每秒约 200 万或 400 万个请求的情况下,kube-proxy 的情况会变得更糟,只有 1-2% 的空闲份额,而 CPU 要花 98% 的时间在 softirq 上下文中处理数据包:

XDP CPU

简而言之,利用 Cilium 加速 XDP 下的 Kubernetes 服务处理,可大幅提高向远程后端推送数据包的性能,同时显著降低 CPU 开销。在默认外部流量策略(externalTrafficPolicy: Cluster)下,这也提高了集群的整体容量。这意味着,将服务扩展到更多后端只能达到单个节点向这些后端转发能力的上限。不过,即使 Kubernetes 部署不需要处理那么多数据包,这些 CPU 周期也可以释放出来,用于实际的用户工作负载。

小结

本文继续调优 Cilium, 启用 XDP 加速, 以便能够直接从网络驱动层处理 NodePort 等入站请求. 具体收益为:

  • 大幅提高向远程后端推送数据包的性能
  • 显著降低 CPU 开销
  • 提高集群的整体容量

至此,性能调优已完成实战验证:

  • ✔️ 启用本地路由 (Native Routing)
  • ✔️ 完全替换 KubeProxy
  • ✔️ IP 地址伪装 (Masquerading) 切换为基于 eBPF 的模式
  • ✔️ Kubernetes NodePort 实现在 DSR(Direct Server Return) 模式下运行
  • ✔️ 绕过 iptables 连接跟踪 (Bypass iptables Connection Tracking)
  • ✔️ 主机路由 (Host Routing) 切换为基于 BPF 的模式 (需要 Linux Kernel >= 5.10)
  • ❌ 启用 IPv6 BIG TCP (需要 Linux Kernel >= 5.19, 支持的 NICs: mlx4, mlx5)
    • 由于没有支持的网卡, 无法完成验证
  • ❌ 修改 MTU 为巨型帧 (jumbo frames) (需要网络条件允许)
    • 由于网络条件不允许, 无法完成验证
  • ✔️ 启用带宽管理器 (Bandwidth Manager) (需要 Kernel >= 5.1)
  • ✔️ 启用 Pod 的 BBR 拥塞控制 (需要 Kernel >= 5.18)
  • ✔️ 启用 XDP 加速 (需要 支持本地 XDP 驱动程序)

Cilium 性能调优总结

至此, 我们阶段性地完成了 Cilium 主要的性能优化点.

Cilium 调优分为以下几个大维度:

  1. Cilium 调优
  2. 底层网络调优
  3. Linux Kernel 优化和升级
  4. 其他维度调优

Cilium 调优

Cilium 调优包括:

  • 启用本地路由(Native Routing)
  • 完全替换 KubeProxy
  • IP 地址伪装(Masquerading)切换为基于 eBPF 的模式
  • Kubernetes NodePort 实现在 DSR(Direct Server Return) 模式下运行
  • 绕过 iptables 连接跟踪(Bypass iptables Connection Tracking)
  • 主机路由(Host Routing)切换为基于 BPF 的模式 (需要 Linux Kernel >= 5.10)
  • 启用 IPv6 BIG TCP (需要 Linux Kernel >= 5.19)
  • 禁用 Hubble(但是不建议, 可观察性比一点点的性能提升更重要)
  • 启用带宽管理器(Bandwidth Manager) (需要 Kernel >= 5.1)
  • 启用 Pod 的 BBR 拥塞控制 (需要 Kernel >= 5.18)
  • 启用 XDP 加速 (需要 支持本地 XDP 驱动程序)
  • (高级用户可选)调整 eBPF Map Size

底层网络调优

底层网络调优包括:

  • 修改 MTU 为巨型帧(jumbo frames) (需要网络条件允许)

Linux Kernel 优化和升级

Linux Kernel 优化和升级包括:

  • CONFIG_PREEMPT_NONE=y

其他维度调优

其他维度调优包括:

  • tuned network-* profiles, 如: tuned-adm profile network-latencynetwork-throughput
  • CPU 调为性能模式
  • 停止 irqbalance,将网卡中断引脚指向特定 CPU

Cilium "终极"优化配置

根据个人经验, 推荐的 Cilium "性能模式" 配置为:

首先, Kernel >= 5.10, 这是最新的稳定版的内核, 可以启用对调优非常重要的"基于 BPF 的主机路由"功能, 可以启用 Cilium 的大部分功能, 如下:

Cilium 功能最小 Kernel 版本
带宽管理器>= 5.1
Egress Gateway>= 5.2
VXLAN 隧道端点 (VTEP) 集成>= 5.2
WireGuard 透明加密>= 5.6
Session Affinity的完整支持>= 5.7
基于 BPF 的代理重定向>= 5.7
pod netns 中的套接字级 LB 旁路>= 5.7
L3 设备>= 5.8
基于 BPF 的主机路由>= 5.10
Pod 的 BBR 拥塞控制>=5.18
IPv6 BIG TCP 支持>= 5.19

之后, 推荐 Cilium 配置和功能包括:

  • 禁用隧道, 禁用加密
  • 启用本地路由(Native Routing)
  • 完全替换 KubeProxy
  • IP 地址伪装(Masquerading)切换为基于 eBPF 的模式
  • Kubernetes NodePort 实现在 DSR(Direct Server Return) 模式下运行
  • 主机路由(Host Routing)切换为基于 BPF 的模式 (需要 Linux Kernel >= 5.10)
  • 启用带宽管理器(Bandwidth Manager) (需要 Kernel >= 5.1)
  • 启用 XDP 加速 (需要 支持本地 XDP 驱动程序, 但是大部分 10G/40G 网卡, 包括虚拟网卡以及云供应商已经支持了.)

绕过 iptables 连接跟踪(Bypass iptables Connection Tracking) 就是可选项了, 因为启用了"基于 BPF 模式的主机路由"后, 是没有必要设置改选项的.

启用 IPv6 BIG TCP 不建议启用, 一方面是对内核要求较高, 需要 Linux Kernel >= 5.19; 另一方面是 IPv6 在 Kubernetes 的使用还未大规模普及.

也不建议为了提升性能而禁用 Hubble, 因为可观察性比一点点的性能提升更重要.

不建议启用 Pod 的 BBR 拥塞控制, 也是因为其对内核要求较高, 需要 Kernel >= 5.18. 有条件的可以按需启用.

最终, 安装的命令如下:

helm install cilium cilium/cilium --version 1.13.4 \
    --namespace kube-system \
    --set operator.replicas=2 \
    --set hubble.relay.enabled=true \
    --set hubble.ui.enabled=true
    --set tunnel=disabled \
    --set kubeProxyReplacement=strict \
    --set bpf.masquerade=true \
    --set loadBalancer.mode=dsr \
    --set bandwidthManager.enabled=true \
    --set loadBalancer.acceleration=native \
    --set k8sServiceHost=${API_SERVER_IP} \
    --set k8sServicePort=${API_SERVER_PORT}

🐾Warning

  1. 本地路由需要添加更多 helm 参数, 请按照您的实际情况进行选择和添加.
  2. loadBalancer.mode 根据您的实际需求, 从 DSR 和 hybrid 中选择. (默认 SNAT 模式)

🎉🎉🎉

📚️参考文档

  • LoadBalancer & NodePort XDP Acceleration - Kubernetes Without kube-proxy — Cilium 1.13.4 documentation
  • Cilium 1.8: XDP Load Balancing, Cluster-wide Flow Visibility, Host Network Policy, Native GKE & Azure modes, Session Affinity, CRD-mode Scalability, Policy Audit mode, ...
  • Tuning Guide — Cilium 1.13.4 documentation

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

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

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

相关文章

RK3588平台开发系列讲解(文件系统篇)什么是 VFS

文章目录 一、什么是 VFS二、VFS 数据结构2.1、超级块结构2.2、目录结构2.3、文件索引结点2.4、打开的文件2.5、四大对象结构的关系沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 今天我们一起来瞧一瞧 Linux 是如何管理文件,也验证一下 Linux 那句口号:一切皆为文…

基于Java+Swing实现超级玛丽游戏

基于JavaSwing实现超级玛丽游戏 一、系统介绍二、功能展示三、其他系统 一、系统介绍 超级玛丽小游戏的JAVA程序,进入游戏后首先按空格键开始,利用方向键来控制的马里奥的移动,同时检测马里奥与场景中的障碍物和敌人的碰撞,并判断…

GitHub上删除项目后,IDEA分享项目到GitHub提示Remote is already on GitHub

文章目录 一、错误信息二、解决方法1.删除GitHub上的项目2.找到项目里的.git隐藏文件3.找到config文件4.打开config文件,删除[remote "git-test"]及下面两行内容5.继续使用IDEA分享项目到GitHub即可 一、错误信息 二、解决方法 1.删除GitHub上的项目 2.…

39.利用matlab寻找素数(matlab程序)

1.简述 MATLAB嵌套循环允许使用一个循环在另一循环内,下面用一个嵌套循环来把所有从1到100的素数显示出来。 2.代码 %% 学习目标:寻找素数 clear sum5; %求0~100素数之和 ss0; %用来标定是否是素数,0表示不是 p…

el-select控制单选还是多选

<el-form :inline"true" :model"form" class"demo-form-inline"><el-form-item><el-select v-model"form.properties_id" placeholder"请选择样品性质" clearable :multiple"multiple_properties"…

[RT-Thread]基于ART-PI的YMODEM协议在文件系统(LFS,FAT,RAMFS)下的文件传输及其注意事项

[写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,朝花夕拾故以此作文] 目录 [写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,朝花夕拾故以此作文] 前提 准备工作 内容 问题也就是注意事项 前提 准备工作 创建基于ART-PI开发板(STM32H750)…

数据库导出Excel格式的表结构

数据库导出Excel格式的表结构 你是否遇到到导出数据库里面的表结构&#xff0c;包含字段名称、类型、长度、小数、默认值、字段描述之类的需求&#xff1b;当我们去navcat里面找时发现没有&#xff0c;因为navcat没有提供这一功能&#xff0c;他只可以导出表结构的sql&#xff…

Stable Diffusion - Style Editor 和 Easy Prompt Selector 提示词插件配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132122450 Style Editor 插件&#xff1a; cd extensions git clone https://ghproxy.com/https://github.com/chrisgoringe/Styles-Editor报错&…

PHP实现首字母头像

<?php $name"哈哈"; $logoletter_avatar($name);echo <img src".$logo." style" border-radius: 50%;">;function letter_avatar($text) {$total unpack(L, hash(adler32, $text, true))[1];$hue $total % 360;list($r, $g, $b) hs…

docker数据持久化

在Docker中若要想实现容器数据的持久化&#xff08;所谓的数据持久化即数据不随着Container的结束而销毁&#xff09;&#xff0c;需要将数据从宿主机挂载到容器中。目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中。 &#xff08;1&#xff09;Volumes&#xff1a;…

Django架构图

1. Django 简介 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架 使用 Django&#xff0c;只要很少的代码&#xff0c;Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容&#xff0c;并进一步开发出全功能的 Web 服务 Django 本身…

shell 脚本

一、使用PID过滤该进程的所有信息 #! /bin/bash # Function: 根据用户输入的PID&#xff0c;过滤出该PID所有的信息 read -p "请输入要查询的PID: " P nps -aux| awk $2~/^$P$/{print $11}|wc -l if [ $n -eq 0 ];thenecho "该PID不存在&#xff01;&#xff0…

MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容测评

今天给大家带来了 MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容 100 挑战赛 的视频&#xff0c;现在充电头再以文章的形式呈现给大家&#xff0c;让大家更清楚、直白的了解这款笔记本在升级系统后的兼容性如何。 MacBook Pro 16 M1 Max 配置了 140W 的 MagSafe 充电口&…

Leetcode-每日一题【剑指 Offer 05. 替换空格】

题目 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。 示例 1&#xff1a; 输入&#xff1a;s "We are happy."输出&#xff1a;"We%20are%20happy." 限制&#xff1a; 0 < s 的长度 < 10000 解题思路 前置知识 Str…

【签到 前缀异或和】牛客多校2023 6E

题意&#xff1a; 思路&#xff1a; 签到签了半天&#xff0c;思路和正解一模一样&#xff0c;但是经典不会调细节 先不去考虑一个区间分为多段&#xff0c;先去考虑一个区间的区间和是偶数 首先很明显&#xff0c;我们只关注奇偶性&#xff0c;因此可以把所有的ai都%2&…

从价值的角度看,为何 POSE 通证值得长期看好

PoseSwap 是 Nautilus Chain 上的首个 DEX&#xff0c;基于 Nautilus Chain 也让其成为了首个以模块化构建的 Layer3 架构的 DEX。该 DEX 本身能够以 Dapp 层&#xff08;Rollup&#xff09;的形态&#xff0c;与其他应用层并行化运行。基于 Zk-Rollup PoseiSwap 具备隐私特性&…

Nacos适配人大金仓国产数据库

nacos版本2.2.0 人大金仓版本8.6.0 一、相关文件 Nacos官方文档-数据源插件https://nacos.io/zh-cn/docs/v2/plugin/datasource-plugin.html Nacos2.2.0源码https://github.com/alibaba/nacos/archive/refs/tags/2.2.0.zip 人大金仓驱动https://download.csdn.net/download/q…

树的层次遍历

层次遍历简介 广度优先在面试里出现的频率非常高&#xff0c;整体属于简单题。而广度优先遍历又叫做层次遍历&#xff0c;基本过程如下&#xff1a; 层次遍历就是从根节点开始&#xff0c;先访问根节点下面一层全部元素&#xff0c;再访问之后的层次&#xff0c;类似金字塔一样…

nginx部署以及反向代理多域名实现HTTPS访问

nginx部署以及反向代理多域名实现 1.nginx部署 1.1 编写nginx部署文件 docker-compose.yml version: 3 services: nginx:restart: always image: nginx:1.20container_name: nginx-mainports:- 80:80- 443:443volumes: # 基础配置- /opt/nginx_main/nginx-info/nginx.conf:/…

商城-学习整理-基础-商品服务API-品牌管理(六)

目录 一、使用逆向工程生成前后端代码1、新增品牌管理菜单2、使用生成的前端代码 二、优化逆向生成的品牌管理页面1、显示状态开关优化2、品牌上传优化&#xff08;使用阿里云存储&#xff09;1&#xff09;阿里云对象存储-普通上传方式2&#xff09;阿里云对象存储-服务端签名…