Q2: Pod veth pair 如果没有 QoS annotation,则不会设置 qdisc?
答案:正确!veth pair 使用默认 qdisc (通常是 noqueue)
但是:BPF 程序总是会附加!
| 设备类型 | qdisc | BPF 程序 | 用途 |
|---|---|---|---|
| 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) 机制:
- Pod 发送数据包 ↓
- 数据包到达 veth host 端 (xxx_h) ↓
- BPF 程序 cil_from_container 执行 ├─ 检查 Pod 是否有带宽限制 ├─ 如果有:计算并设置 skb->tstamp (EDT timestamp) └─ 如果无:跳过,skb->tstamp = 0 ↓
- 数据包经过网络栈到达物理网卡 (bond0) ↓
- bond0 的 FQ qdisc 读取 skb->tstamp ├─ 如果 tstamp > 0:按照 EDT 时间调度 └─ 如果 tstamp = 0:正常调度(无限制) ↓
- 数据包发送到网络
关键点:
- EDT timestamp 在 veth 上的 BPF 中设置
- FQ qdisc 在 物理网卡 上执行调度
- veth 本身不需要 FQ qdisc,它只是一个虚拟设备