VXLAN封装增加50字节开销,需将underlay接口MTU调至1550以避免分片丢弃;RFC 7348明确禁止VXLAN分片,CE设备不支持重组,故必须端到端MTU对齐。

核心问题在于:VXLAN封装增加了14–28字节开销(UDP头+IP头+VXLAN头),若物理网卡MTU仍为默认1500,而flannel.1接口未同步调小,大包就会在封装后超限——被中间设备静默丢弃,TCP不报错、ICMP不可达常被过滤,最终表现为“小包通、大包卡、连接看似正常却传不动数据”的长死锁。
确认MTU链路是否断裂
先验证实际路径MTU,不依赖猜测:
- 在任一Pod内执行:
ping -M do -s 1472 <另一节点PodIP>(Linux)或ping -f -l 1472 <另一节点PodIP>(Windows);1472 + 28 = 1500,是标准以太网基准 - 若超时,逐步减小
-s值(1452 → 1400 → 1350),直到能通;临界值+28即为当前路径真实MTU - 特别注意:若
ping通但curl -v http://<跨节点服务>卡在Transfer,基本锁定是MTU导致的TCP MSS协商失效或分片黑洞
检查Flannel各层MTU配置一致性
MTU必须在三层对齐:物理网卡 → flannel.1 → 容器veth → Pod网络栈:
- 查物理网卡MTU:
ip link show eth0 | grep mtu(假设主网卡是eth0) - 查flannel.1 MTU:
ip link show flannel.1 | grep mtu;应比物理网卡小约50(如eth0=1500 → flannel.1=1450) - 查Pod内网卡MTU:
kubectl exec <pod> -- ip link show eth0 | grep mtu;应与flannel.1一致 - 查Flannel DaemonSet中是否设置了
FLANNEL_MTU环境变量:kubectl -n kube-flannel get ds kube-flannel-ds -o yaml | grep FLANNEL_MTU -A 2
修正并固化MTU配置
改完不持久=白改。需同步更新三处:
- 在Flannel ConfigMap中显式指定MTU(推荐):
kubectl -n kube-system edit cm kube-flannel-cfg,修改net-conf.json段,加入"MTU": 1450 - 在Flannel DaemonSet中添加环境变量:
- name: FLANNEL_MTU<br> value: "1450"
- 重启Flannel生效:
kubectl -n kube-system delete pod -l app=flannel - 验证容器内MTU是否自动同步:
kubectl exec <new-pod> -- cat /sys/class/net/eth0/mtu,应显示1450
排除校验和与内核干扰
VXLAN在NAT或部分虚拟化环境中,UDP校验和易损坏,触发内核丢包:
- 临时禁用flannel.1 TX校验和:
ethtool -K flannel.1 tx off - 持久化:写udev规则
/etc/udev/rules.d/90-flannel-mtu.rules:SUBSYSTEM=="net", ACTION=="add|change", ENV{INTERFACE}=="flannel.1", RUN+="/sbin/ip link set dev flannel.1 mtu 1450", RUN+="/sbin/ethtool -K flannel.1 tx off" - 确认vxlan内核模块已加载:
lsmod | grep vxlan;未加载则modprobe vxlan

















