Cilium系列-12-启用 Pod 的 BBR 拥塞控制
系列文章
前言
将 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-latency或network-throughput
- CPU 调为性能模式
- 停止 irqbalance,将网卡中断引脚指向特定 CPU
 
- tuned network-* profiles, 如: 
在网络/网卡设备/OS等条件满足的情况下, 我们尽可能多地启用这些调优选项, 相关优化项会在后续文章逐一更新. 敬请期待.
今天我们来调优 Cilium, 启用 Pod 的 BBR 拥塞控制, 以为互联网流量提供更高的带宽和更低的延迟.
测试环境
- Cilium 1.13.4
- K3s v1.26.6+k3s1
- OS
- 3 台 Ubuntu 23.04 VM, Kernel 6.2, x86
 
BBR 拥塞控制
Cilium 的带宽管理器提供的围绕 MQ/FQ 设置的基础架构还允许对 Pod 使用 TCP BBR 拥塞控制。当 Pod 被暴露在 Kubernetes 服务背后,面对来自互联网的外部客户端时,BBR 尤其适用。BBR 可为互联网流量提供更高的带宽和更低的延迟,例如,事实证明,BBR 的吞吐量可比目前最好的基于损耗的拥塞控制高出 2,700 倍,队列延迟可降低 25 倍。
为了让 BBR 在 Pod 上可靠运行,它需要 5.18 或更高版本的内核。
BBR 还需要 eBPF Host-Routing,以保留网络数据包的套接字关联,直到数据包进入主机命名空间物理设备上的 FQ 队列 discipline。
要求
- 内核 >= 5.18
- 带宽管理器
- eBPF 主机路由
实施
启用带宽管理器和 Pod 的 BBR:
helm upgrade cilium cilium/cilium --version 1.13.4 \
  --namespace kube-system \
  --reuse-values \
  --set bandwidthManager.bbr=true
验证
要验证您的安装是否使用 Pods 的 BBR 运行,请在任何 Cilium pod 中运行 cilium status,并查找报告 "BandwidthManager" 状态的行,该行应显示 EDT with BPF 以及 [BBR]。具体如下:
$ kubectl -n kube-system exec ds/cilium -- cilium status | grep BandwidthManager
BandwidthManager:           EDT with BPF [BBR] [eth0]
总结
本文继续调优 Cilium, 启用 Pod 的 BBR 拥塞控制, 以为互联网流量提供更高的带宽和更低的延迟. 前提是 Kernel >= 5.18, 并启用带宽管理器和基于 eBPF 的主机路由.
至此,性能调优已完成实战验证:
- ️ 启用本地路由 (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 编写.
Cilium系列-12-启用 Pod 的 BBR 拥塞控制的更多相关文章
- kali linux系列之启用vpn
		kali linux系列之启用vpn 文/玄魂 默认情况下,kali linux的vpn选项是不可用的. 下面是安装openvpn的方法,同样的,可以安装其他类型的vpn. 打开终端输入命令: Apt ... 
- Java 集合系列 12 TreeMap
		java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ... 
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(12)-实现用户异步登录和T4模板
		原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(12)-实现用户异步登录和T4模板 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ... 
- java io系列12之 BufferedInputStream(缓冲输入流)的认知、源码和示例
		本章内容包括3个部分:BufferedInputStream介绍,BufferedInputStream源码,以及BufferedInputStream使用示例. 转载请注明出处:http://www ... 
- C#程序集系列12,C#编译器和CLR如何找寻程序集
		本篇体验C#编译器和CLR运行时如何查找程序集,并自定义CLR运行时查找程序集的方式. □ C#编译器和CLR运行时如何查找程序集 C#编译器在哪里?--在C:\Windows\Microsoft.N ... 
- Caffe学习系列(12):训练和测试自己的图片--linux平台
		Caffe学习系列(12):训练和测试自己的图片 学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测 ... 
- Java JUC之Atomic系列12大类实例讲解和原理分解
		Java JUC之Atomic系列12大类实例讲解和原理分解 2013-02-21 0个评论 作者:xieyuooo 收藏 我要投稿 在java6以后我们不但接触到了Loc ... 
- Spring框架系列(12) - Spring AOP实现原理详解之JDK代理实现
		上文我们学习了SpringAOP Cglib动态代理的实现,本文主要是SpringAOP JDK动态代理的案例和实现部分.@pdai Spring框架系列(12) - Spring AOP实现原理详解 ... 
- Visual Studio 调试系列12 远程调试部署在远程计算机IIS上的ASP.NET应用程序
		系列目录 [已更新最新开发文章,点击查看详细] 要调试已部署到IIS的ASP.NET应用程序,请在部署应用程序的计算机上安装并运行远程工具,然后从Visual Studio附加到正在运行的应用 ... 
- 补习系列(12)-springboot 与邮件发送【华为云技术分享】
		目录 一.邮件协议 关于数据传输 二.SpringBoot 与邮件 A. 添加依赖 B. 配置文件 C. 发送文本邮件 D.发送附件 E. 发送Html邮件 三.CID与图片 参考文档 一.邮件协议 ... 
随机推荐
- Eclipse 没有创建 Maven 项目入口的原因
			试错过程 软件下载错了 我首先参考了 Eclipse历史版本下载和选择对应的java版本 这篇文章,发现 Eclipse 2020-06 的版本以后就不支持 JDK 8 了. 我想要下载 Oxygen ... 
- 今日分享:目前目标责任成本明细单价已设置,机构参数设置-物资合同单价超目标责任成本明细单价Y%时不能保存,该参数已设置但未生效是为什么?
			在编制的时候-"材料类别设置"中,不勾选"管控". 
- 【由浅入深学MySQL】- MySQL连接查询详解
			本系列为:MySQL数据库详解,为千锋教育资深Java教学老师独家创作 致力于为大家讲解清晰MySQL数据库相关知识点,含有丰富的代码案例及讲解.如果感觉对大家有帮助的话,可以[点个关注]持续追更~ ... 
- 【GiraKoo】面向对象开发系列之【封装】
			[技术分享]面向对象开发系列之[封装] 理解 封装是面向对象程序开发的基石. 程序开发,最核心价值,是数据. 程序其实是读取数据,操作数据,保存数据等一系列操作. 那么经过良好组织过的数据,将使编程事 ... 
- es笔记四之中文分词插件安装与使用
			本文首发于公众号:Hunter后端 原文链接:es笔记四之中文分词插件安装与使用 前面我们介绍的操作及演示都是基于英语单词的分词,但我们大部分使用的肯定都是中文,所以如果需要使用分词的操作肯定也是需要 ... 
- SQL注入原理及利用方式
			前言 在Web表单递交或输入域名或页面请求的查询字符串,通过后端语言连接数据库并查询数据,攻击者可利用此漏洞拼接恶意语句获取大量数据. SQL注入漏洞 在表单页面或者存在参数传递的地方可能存在SQL注 ... 
- MySQL中字符串查询效率大比拼
			背景 最近有个同事对字符串加索引,加完后,发现多了个奇奇怪怪的数字执行的SQL如下: alter table string_index_test add index `idx_name` (`name ... 
- ChatGPT 时代,程序员的生存之道 | 人工智能 AI
			前言 ChatGPT 近期炙手可热,仿佛没有什么问题是它不能解决的.出于对 ChatGPT 的好奇,我们决定探索下它对于前端开发人员来讲,是作为辅助工具多一些,还是主力工具更多一些? 2D 能力测试 ... 
- 深度学习应用篇-计算机视觉-图像分类[2]:LeNet、AlexNet、VGG、GoogleNet、DarkNet模型结构、实现、模型特点详细介绍
			深度学习应用篇-计算机视觉-图像分类[2]:LeNet.AlexNet.VGG.GoogleNet.DarkNet模型结构.实现.模型特点详细介绍 1.LeNet(1998) LeNet是最早的卷积神 ... 
- Qt+QtWebApp开发笔记(五):http服务器html中使用json触发ajax与后台交互实现数据更新传递
			前言 前面完成了页面的跳转.登录,很多时候不刷新页面就想刷新局部数据,此时ajax就是此种技术,且是异步的. 本篇实现网页内部使用js调用ajax实现异步交互数据. 在js中使用 ajax是通 ... 
