cilium 总是会附加哪些 BPF 程序

4 阅读1分钟

Q2: Pod veth pair 如果没有 QoS annotation,则不会设置 qdisc?

答案:正确!veth pair 使用默认 qdisc (通常是 noqueue)

但是:BPF 程序总是会附加!

设备类型qdiscBPF 程序用途
Pod veth (xxx_h)noqueue/pfifo_fast (默认)✅ 总是附加网络策略、可观测性、EDT 设置
物理网卡 (bond0)fq (Bandwidth Manager 设置)条件附加FQ 调度、NodePort、Masquerade
OVN 设备 (ovn0)默认 (不应该改)❌ 不应该附加由 OVN 管理

🔬 为什么 veth 不需要 FQ qdisc?

Cilium 的 Bandwidth Manager 使用 EDT (Earliest Departure Time) 机制:

  1. Pod 发送数据包 ↓
  2. 数据包到达 veth host 端 (xxx_h) ↓
  3. BPF 程序 cil_from_container 执行 ├─ 检查 Pod 是否有带宽限制 ├─ 如果有:计算并设置 skb->tstamp (EDT timestamp) └─ 如果无:跳过,skb->tstamp = 0 ↓
  4. 数据包经过网络栈到达物理网卡 (bond0) ↓
  5. bond0 的 FQ qdisc 读取 skb->tstamp ├─ 如果 tstamp > 0:按照 EDT 时间调度 └─ 如果 tstamp = 0:正常调度(无限制) ↓
  6. 数据包发送到网络

关键点:

  • EDT timestamp 在 veth 上的 BPF 中设置
  • FQ qdisc 在 物理网卡 上执行调度
  • veth 本身不需要 FQ qdisc,它只是一个虚拟设备