现场是这样的。阿里云 3 节点 K8s 1.26,Ubuntu 22.04,Calico 3.26 用 IPIP 模式,同节点 Pod 互访正常,跨节点 ping 直接百分百丢包,tcpdump 在 eth0 能看到协议号 4 的包出去,对端节点没有回包,安全组只放了 TCP 22 和 6443。
中间走过弯路,把「IPPool 配了 ipipMode Always 但节点网卡 MTU 没跟着减」当成主因,改完现象没变。
真正麻烦的地方在于,几个原因的现象几乎一样。安全组没有放行 IPIP 协议即协议号 4 的入站流量;云环境不允许协议号 4,IPIP 封装在 VPC 里被直接丢弃;节点路由表没有指向对方的 tunl0,回包走了默认网关。
先确认跨节点的封装包有没有发出去
tcpdump -i eth0 -nn proto 4 -c 20
随后查看 Calico 的 IPPool 封装模式
calicoctl get ippool -o wide
然后改成 VXLAN 模式并放行 UDP 4789
calicoctl patch ippool default-ipv4-ippool -p '{"spec":{"ipipMode":"Never","vxlanMode":"Always"}}'
末了确认节点间的隧道和 BGP 状态
calicoctl node status
恢复的判定其实很直接。跨节点 Pod 互相 ping 通且丢包率为 0,calicoctl node status 里所有节点都是 Established。
容易忽略的是,云上安全组对协议号的支持不一致,改 VXLAN 前先确认 UDP 4789 已放行,否则换了模式照样不通。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
