cilium qos EDT

40 阅读3分钟

这是 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#