这是 Cilium Bandwidth Manager(EDT) ,不是 Kubernetes 原生能力,而是 Cilium 在 eBPF + TC 层实现的 Pod 级出方向带宽控制。你这张截图里的描述是 完全准确但信息密度很高,我给你拆成「怎么开 + 怎么用 + 它到底在干什么」。
一、这个 Bandwidth Manager 是什么(先立住概念)
一句话:
Bandwidth Manager = 用 eBPF 在宿主机 TC 层,对 Pod 出方向流量做精确调度(EDT),不是靠 iptables / tc class。
它解决的是:
- Pod 级 egress bandwidth limit
- TCP + UDP 都支持
- 不会破坏 TCP 拥塞控制(这是 EDT 的核心价值)
- 不依赖 kube-proxy / iptables
📌 它只管出方向(egress)
📌 它是 L3/L4 的,不是 L7
二、开启条件(很关键,很多人卡在这里)
1️⃣ 内核要求(必须)
uname -r
要求:
- Linux ≥ 5.4
- 推荐 ≥ 5.10
原因:
EDT(Earliest Departure Time)依赖 skb->tstamp + BPF TC 支持。
2️⃣ Cilium 必须运行在这些模式下
你当前状态里有一部分已经满足了 👍:
DatapathMode: veth
Routing: Network: Native Host: BPF
Attach Mode: TCX
Bandwidth Manager 要求:
| 项目 | 是否必须 |
|---|---|
| DatapathMode = veth | ✅ |
| Attach Mode = TC / TCX | ✅ |
| kube-proxy replacement | 推荐 |
| IPAM | 无强依赖 |
| Overlay / Native | 都支持 |
三、如何开启 Bandwidth Manager(真正的开关)
✅ Helm / ConfigMap 配置(最常见)
Helm values.yaml
bandwidthManager:
enabled: true
bbr: false # 是否强制 TCP BBR
bbrHostNamespaceOnly: false
或直接 Helm upgrade:
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--reuse-values \
--set bandwidthManager.enabled=true
🔍 验证是否开启成功
cilium status
应看到类似:
BandwidthManager: Enabled
或者:
cilium config | grep Bandwidth
四、怎么“用”?——Pod 级限速方式(重点)
1️⃣ 使用 Pod Annotation(官方推荐方式)
apiVersion: v1
kind: Pod
metadata:
name: test-pod
annotations:
kubernetes.io/egress-bandwidth: "10M"
spec:
containers:
- name: app
image: busybox
command: ["sleep", "3600"]
支持单位:
K,M,G- 比如:
100M,1G
📌 这是标准 K8s annotation,但只有 Cilium 真正实现了 EDT 级别支持
2️⃣ 生效机制(非常重要)
当 Pod 创建时:
Pod egress
↓
veth (pod)
↓
veth_h (host)
↓
TC eBPF (EDT 调度)
↓
NIC
Cilium 会:
- 在 Pod 对应 host veth 上
- 挂载 tc egress BPF
- 使用 EDT 算法给每个 skb 设置发送时间
你可以验证:
tc qdisc show dev <veth_h>
五、EDT 到底解决了什么(为什么不是 tc tbf)
传统 tc 限速(TBF / HTB)的问题:
- ❌ 丢包
- ❌ TCP 拥塞窗口被打爆
- ❌ RTT 抖动巨大
EDT 的做法是:
不丢包,只延迟发送时间
效果:
- TCP 认为网络只是“慢一点”
- 拥塞控制稳定
- 吞吐更平滑
这就是为什么 AI / 存储 / 长连接场景都推荐 EDT
六、BBR 选项要不要开?
bandwidthManager:
bbr: true
含义:
- 强制 Pod egress 使用 TCP BBR
- UDP 不受影响
是否建议你开?
| 场景 | 建议 |
|---|---|
| 公网 / 长 RTT | ✅ |
| 数据中心内 | ⚠️ |
| 已经有 TCP tuning | ❌ |
八、快速自检 Checklist
你可以照这个顺序检查:
# 1. 是否开启
cilium status | grep Bandwidth
# 2. Pod annotation 是否存在
kubectl get pod xxx -o yaml | grep egress-bandwidth
# 3. host veth 上是否有 tc
tc qdisc show | grep cilium
# 4. 是否真的限速
iperf3 / curl 测试
九、一句结论(给你定调)
Bandwidth Manager = Cilium 最强但最容易被误解的功能之一
它非常适合 Pod egress 限速 + 高质量 TCP
但 只作用于 Cilium 接管的 veth 流量
实际测试
需要重启 cilium
root@k8s-ctrl:~# k exec -it -n kube-system cilium-blstr -- bash
root@k8s-ctrl:/home/cilium# cilium status | grep -i tc
CNI Config file: successfully wrote CNI configuration file to /host/etc/cni/net.d/05-cilium.conflist
IPv4 BIG TCP: Disabled
IPv6 BIG TCP: Disabled
Attach Mode: Legacy TC
root@k8s-ctrl:/home/cilium# cilium status | grep -i band
BandwidthManager: EDT with BPF [CUBIC] [bond0, genev_sys_6081, ovn0]
root@k8s-ctrl:/home/cilium#