Cilium系列-11-启用带宽管理器

news2024/11/20 4:17:50

系列文章

  • 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, 启用带宽管理器, 以更有效地管理网络流量,改善整体应用的延迟和吞吐量。

测试环境

  • Cilium 1.13.4
  • K3s v1.26.6+k3s1
  • OS
    • 3 台 Ubuntu 23.04 VM, Kernel 6.2, x86

带宽管理器

Cilium 的带宽管理器(Bandwidth Manager)负责更有效地管理网络流量,目的是改善整体应用的延迟和吞吐量。

除了原生支持 Kubernetes Pod bandwidth annotations 外,带宽管理器(首次在 Cilium 1.9 中引入)还在所有面向外部的网络设备上设置公平队列(FQ)队列规则,以支持 TCP 堆栈步调(例如 EDT/BBR),并为网络堆栈设置最佳的服务器级 sysctl 设置。

带宽管理器的功能主要集中在两个方面,即从上层协议和从队列规范的角度。

带宽管理器启用后,默认情况下会将 TCP 拥塞控制算法切换为 BBR,从而实现更高的带宽和更低的延迟,尤其是面向互联网的流量。它将内核网络堆栈配置为更面向服务器的 sysctl 设置,这些设置已在生产环境中证明是有益的。它还重新配置了流量控制队列规则(Qdisc)层,以便在 Cilium 使用的所有面向外部的网络设备上使用多队列 Qdiscs 和公平队列(FQ)。切换到公平队列后,带宽管理器还在 eBPF 的帮助下实现了对最早出发时间 Earliest Departure Time(EDT)速率限制的支持,并且现在原生支持 kubernetes.io/egress-bandwidth Pod 注释。

这也消除了对带宽 CNI 插件链的需求,因为该插件使用了 TBF(Token Bucket Filter, 令牌桶过滤器),在可扩展性方面受到限制。通过基于 EDT 的模型,可以避免 Qdisc 层的全局锁定,尤其是在多队列网卡的情况下。Cilium 的 eBPF 数据路径会将网络流量分类到每个节点的聚合中,然后在将数据包传递到 FQ leaf Qdiscs 前不久,通过在出口的网络数据包上设置最早离开时间戳,执行用户定义的 kubernetes.io/egress-bandwidth 速率。Qdiscs 维护每个流的状态,并根据数据包的时间戳来安排数据包的离开时间,确保数据包不会在时间戳规定的时间之前被发送出去。通过 eBPF 的灵活性,对 Pod 聚合体的分类不仅适用于直接路由,也适用于隧道或使用 L7 代理的情况。

Bandwidth Manager

与 eBPF 和 FQ 相比,在使用 HTB(Hierarchical Token Bucket, 分层令牌桶)进行速率限制的情况下,对应用延迟进行的评估表明,在改善传输延迟的同时,CPU 利用率也能显著降低。当 eBPF 和 FQ 结合使用时,第 95 百分位的延迟降低了约 20 倍,第 99 百分位的延迟降低了约 10 倍。

需求

  • Kernel >= 5.1
  • Direct-routing 配置 或 隧道
  • 基于 eBPF 的 kube-proxy 替换

实战: 启用带宽管理器

要启用带宽管理器:

helm upgrade cilium cilium/cilium --version 1.13.4 \
  --namespace kube-system \
  --reuse-values \
  --set bandwidthManager.enabled=true 

验证

状态验证

要验证您的安装是否与带宽管理器一起运行,请在任何 Cilium pod 中运行 cilium status,并查找报告 "BandwidthManager"状态的行,该行应显示 "EDT with BPF"。

具体如下:

$ kubectl -n kube-system exec ds/cilium -- cilium status | grep BandwidthManager
BandwidthManager:           EDT with BPF [CUBIC] [eth0]

带宽管理器功能验证

下面是一个应用 Pod 的部署示例,由于使用了 kubernetes.io/egress-bandwidth 注释,其出口带宽被限制为 50 Mbit/s:

cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: DaemonSet
metadata:
   name: iperf3
   labels:
      app: iperf3
spec:
   selector:
      matchLabels:
        app: iperf3
   template:
      metadata:
         labels:
            app: iperf3
         annotations:
            kubernetes.io/egress-bandwidth: '50M'
      spec:
         containers:
         -  name: iperf3
            image: clearlinux/iperf:3
            command: ['/bin/sh', '-c', 'sleep 1d']
            ports:
            - containerPort: 5201
EOF

结果如下:

$ k3s kubectl get pod -o wide -l app=iperf3
NAME           READY   STATUS    RESTARTS   AGE    IP           NODE          NOMINATED NODE   READINESS GATES
iperf3-g54rg   1/1     Running   0          2m9s   10.0.0.127   cilium-62-1   <none>           <none>
iperf3-4fwnf   1/1     Running   0          97s    10.0.1.101   cilium-62-2   <none>           <none>
iperf3-688m4   1/1     Running   0          65s    10.0.2.247   cilium-62-3   <none>           <none>

选择一个 pod 作为 server(cilium-62-2 node 上的为 server), 另一个作为 client(cilium-62-3 node 上的为client).

Server (iperf3-4fwnf) 运行的命令为:

kubectl exec -it iperf3-4fwnf -- iperf3 -s -f M

Client (iperf3-688m4) 运行的命令为:

$ kubectl exec -it iperf3-688m4 -- iperf3 -c 10.0.1.101 -f m
Connecting to host 10.0.1.101, port 5201
[  5] local 10.0.2.247 port 33300 connected to 10.0.1.101 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  7.51 MBytes  63.0 Mbits/sec    0    385 KBytes
[  5]   1.00-2.00   sec  5.65 MBytes  47.4 Mbits/sec    0    385 KBytes
[  5]   2.00-3.00   sec  5.65 MBytes  47.4 Mbits/sec    0    385 KBytes
[  5]   3.00-4.00   sec  5.65 MBytes  47.4 Mbits/sec    0    385 KBytes
[  5]   4.00-5.00   sec  5.65 MBytes  47.4 Mbits/sec    0    385 KBytes
[  5]   5.00-6.00   sec  5.65 MBytes  47.4 Mbits/sec    0    385 KBytes
[  5]   6.00-7.00   sec  5.65 MBytes  47.4 Mbits/sec    0    385 KBytes
[  5]   7.00-8.00   sec  5.65 MBytes  47.4 Mbits/sec    0    385 KBytes
[  5]   8.00-9.00   sec  5.65 MBytes  47.4 Mbits/sec    0    385 KBytes
[  5]   9.00-10.00  sec  6.46 MBytes  54.2 Mbits/sec    0    385 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  59.2 MBytes  49.7 Mbits/sec    0             sender
[  5]   0.00-10.02  sec  57.0 MBytes  47.8 Mbits/sec                  receiver

iperf Done.

实测带宽为: 49.7 Mbits/sec 47.8 Mbits/sec, 确实实现了 50 Mb/s 的带宽限制. 👍️👍️👍️

总结

本文继续调优 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, 支持的 NICs: mlx4, mlx5)
    • 由于没有支持的网卡, 无法完成验证
  • ❌ 修改 MTU 为巨型帧 (jumbo frames) (需要网络条件允许)
  • ✔️ 启用带宽管理器 (Bandwidth Manager) (需要 Kernel >= 5.1)
  • 启用 Pod 的 BBR 拥塞控制 (需要 Kernel >= 5.18)
  • 启用 XDP 加速 (需要 支持本地 XDP 驱动程序)

📚️参考文档

  • Bandwidth Manager - Tuning Guide — Cilium 1.13.4 documentation
  • Bandwidth Manager - Cilium 1.9: Maglev, Deny Policies, VM Support, OpenShift, Hubble mTLS, Bandwidth Manager, eBPF Node-Local Redirect, Datapath Optimizations, and more

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

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

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

相关文章

P-DQN:离散-连续混合动作空间的独特算法

一、说明 本文首先说明DQN是个什么概念&#xff0c; DQN&#xff08;Deep Q-Network&#xff09;是一种基于深度学习的强化学习算法&#xff0c;在游戏AI中表现优异&#xff0c;如AlphaGo。然后说明人物动作预测的算法实现方法。 二、关于DQN的概念和实验 DQN&#xff08;Deep …

混合精度训练中的内存占用

结论&#xff1a; 在模型训练中&#xff0c;fp16会比fp32快很多&#xff0c;因此&#xff0c;一般会使用fp16的参数进行模型的前向和后向计算。然而&#xff0c;在进行梯度累加的时候&#xff0c;fp16往往会精度不够&#xff0c;无法满足计算需求。因此&#xff0c;会在反向计…

SOLIDWORKS等轴测剖切视图的创建技巧

在SOLIDWORKS工程图中&#xff0c;经常会用到等轴测剖切视图来显示零件或装配体的内部结构&#xff0c;下面介绍一下两种创建方式&#xff0c;供大家参考&#xff0c;以下图为例。 方法一 第一步&#xff0c;打开零件&#xff0c;创建一个切除拉伸的配置&#xff0c;该配置为 …

全网超细,Jenkins持续集成-自动化测试(详细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 执行集成构建 持…

计算机top命令

top 快捷键 1 核心参数 1 1 参考资料 [1]. https://blog.csdn.net/weixin_45465395/article/details/115728520 [2].https://www.cnblogs.com/liushui-sky/p/13224762.html

为了规避风险,如何给大模型打水印?

大型语言模型&#xff0c;如最近开发的ChatGPT&#xff0c;可以撰写文件、创建可执行代码和回答问题&#xff0c;通常具有人类般的能力。 随着这些大模型的应用越来越普遍&#xff0c;越来越大的风险也显现了出来&#xff0c;它们可能被用于恶意目的。这些恶意目的包括&#xf…

uni-app选择器( uni-data-picker)选择任意级别

背景说明 uni-app 官方的插件市场有数据驱动选择器&#xff0c;可以用作多级分类的场景。引入插件后&#xff0c;发现做不到只选择年级&#xff0c;不选择班级&#xff08;似乎&#xff0c;只能到最后子节点了&#xff09;。 需求中&#xff0c;有可能选择的不是叶子。比如&a…

渣罐炉倾翻液压系统比例阀控制器

渣罐炉倾翻液压系统是一种用于渣罐炉倾翻的液压系统&#xff0c;由液压泵、油缸、阀组、油箱、管路等组成。 2. 启动液压泵&#xff0c;将液压油输送到油缸。 总之&#xff0c;渣罐炉倾翻液压系统具有操作简便、高效稳定等特点&#xff0c;适用于各种类型的渣罐炉倾翻。

SpringBoot+Vue开发笔记

参考&#xff1a;https://www.bilibili.com/video/BV1nV4y1s7ZN?p1 ----------------------------------------------------------概要总结---------------------------------------------------------- 1、MVC架构&#xff1a; View&#xff1a;与用户交互 Controller&…

浅谈下API初步认知

当我们谈论API&#xff0c;我们指的是应用程序接口&#xff08;Application Programming Interface&#xff09;。API允许不同的软件应用程序之间互相通信和交互。它定义了一组规定和协议&#xff0c;用于确定数据传输和请求的格式、方法和功能。 API的作用是在软件开发中提供一…

运动蓝牙耳机什么款式好、适合运动的蓝牙耳机推荐

夏天到了&#xff0c;越来越多的年轻人会选择在一天的忙碌之后通过简单的运动缓解疲劳。而在运动装备的选择上&#xff0c;除了常规的衣服、鞋之外&#xff0c;耳机也成为了当下年轻群体的必备项&#xff0c;尤其是在运动的过程中听听喜欢的音乐或者电台能够更好地放松身心。那…

Go init 顺序 使用建议

init函数的主要作用&#xff1a; 初始化不能采用初始化表达式初始化的变量。程序运行前的注册&#xff0c;例如初始化数据库链接。实现sync.Once功能。其他 init函数的主要特点&#xff1a; init函数先于main函数自动执行&#xff0c;不能被其他函数调用&#xff1b;init函数…

LeetCode每日一题Day3——1. 两数之和

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f433;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; …

Java编程常用数据转换:String与int互转、Date与String互转、BigDecimal与int比较

一、String与Int互转 在 Java 中要将 String 类型转化为 int 类型时&#xff0c;需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行转换。 String str "555555555"; int a Integer.parseInt(str); // 方式1 int b Integer.valueOf(str).intValu…

从虚拟到现实:数字孪生助力建筑创新

随着科技的不断进步&#xff0c;数字孪生技术正逐渐成为建筑行业的新宠。数字孪生是一种将实体世界与数字世界相结合的技术&#xff0c;通过将现实世界中的物体、系统或过程以数字化的方式进行建模和仿真&#xff0c;实现了真实世界与虚拟世界的互通。 在建筑行业中&#xff0c…

酷开系统 | 酷开科技,让数据变得更有价值!

身处信息时代&#xff0c;我们每个人时刻都在生成、传递和应用数据&#xff0c;数据已经成为了现代社会中宝贵的资源之一&#xff0c;而在人工智能领域&#xff0c;数据更是被称为人工智能的“燃料”。 而在AI的发展中&#xff0c;只有拥有高质量、多样性且充分代表性的数据集…

Sqli-labs1~65关 通关详解 解题思路+解题步骤+解析

Sqli-labs 01关 (web517) 输入?id1 正常 输入?id1 报错 .0 输入?id1-- 正常判断是字符型注入&#xff0c;闭合方式是这里插一句。limit 100,1是从第100条数据开始&#xff0c;读取1条数据。limit 6是读取前6条数据。 ?id1 order by 3-- 正常判断回显位有三个。?id…

途乐证券|医药板块走高,神奇制药、双成药业涨停,科源制药等拉升

医药板块3日盘中震动走高&#xff0c;截至发稿&#xff0c;睿智医药涨超15%&#xff0c;景峰医药、神奇制药、双成药业等涨停&#xff0c;誉衡药业、科源制药涨约7%&#xff0c;精华制药、赛托生物涨约6%。 途乐证券指出&#xff0c;医药商场当前仍处于磨底行情&#xff0c;但行…

手机商城免费搭之java商城 电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c bbc

​ 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前…

Kali搭建Suricata环境及使用方式

这个和上一个snort如出一辙&#xff0c;并且兼容snort的规则&#xff0c;有一个有的没的我就不赘述了&#xff0c;直接开整&#xff01; 开整&#xff01; 0x01 环境0x02 配置0x03 使用 0x01 环境 kali2021 && suricata apt install suricata #安装 suricata-updat…