重要
Flannel v0.13.0 在 Linux 5.15 内核下,VXLAN 的 checksum offload 功能导致校验和计算错误,报文携带 bad udp cksum 被丢弃,跨节点 Pod 无法通信。
环境说明
- OS: Ubuntu 22.04, 内核 5.15.0-79-generic
- rke v1.2.6, K8s v1.19.8, canal (flannel v0.13.0 + calico)
- 双节点:node-1 (10.42.0.0/24), node-2 (10.42.1.0/24)
1. 现象
| 场景 | 结果 |
|---|---|
| 同节点 Pod 互 ping | 正常 |
| 跨节点 Pod 互 ping | 不通 |
| 宿主机 ping 本节点 Pod | 正常 |
| 宿主机 ping 其他节点 Pod | 不通 |
2. 排错过程
| 步骤 | 命令 | 结论 |
|---|---|---|
| 防火墙 | systemctl status ufw | 已关闭 |
| 安全组 | 云控制台检查 | 无限制 |
| iptables | sudo iptables -L | 无异常 |
| 路由 | route -n | flannel 子网路由正常 |
抓包发现关键线索:
| |
报文包含 bad udp cksum 标记。
3. 根因
checksum-offload 将校验和计算交给网卡。VXLAN 模式下,某些内核版本与网卡驱动的 checksum offload 交互导致校验值计算错误,报文被丢弃。
canal 中跨节点通信通过 flannel VXLAN,节点内通过 calico——所以仅跨节点不通。
4. 处理
两种方案:
| 方案 | 命令 |
|---|---|
| 关闭 VXLAN 网卡 checksum offload | ethtool -K flannel.1 tx-checksum-ip-generic off |
| 升级内核 | — |