flannel pod to pod网络连通性问题排查
最近我们在K8s产品里遇到了一个奇怪的问题,首先这是一个以flannel为CNI plugin的K8s cluster,相同的产品部署在aws、azure上都没有问题,在公司的公共虚拟服务上也没有问题,但在我们组里的物理机上部署的时候,发现cluster内部的pod与pod直接通信出了问题,并且在相同的环境里,上一个版本没有问题,但升级到新版本之后问题出现。这里分析了一下,得出如下结论:
这个问题肯定始于当前所在的环境有关系的
我们产品与上一个版本之间的flannel版本并没有改变,唯一改变的是OS,从16.04升级到了22.04
阅读了一些flannel网络通信原理相关的文档,并进行tcpdump抓包后,发现
从node1上的pod1到node2上的pod2,ping没有问题,说明icmp没问题,说明路由都是正常
从pod1访问pod2的 tcp/udp 包在node1的flannel.1和eth0上都能抓到,但在node2的eth0上抓不到,这个看来很像是被防火墙drop了
从pod1访问node2上的8472 udp端口,可以在node2的eth0上抓到,这个我不确定它到底说明了什么问题
然后因为flannel vxlan支持一些可配置的参数,我们的产品里都用的默认值:
VXLAN
Use in-kernel VXLAN to encapsulate the packets.
Type and options:
Type(string):vxlanVNI(number): VXLAN Identifier (VNI) to be used. On Linux, defaults to 1. On Windows should be greater than or equal to 4096.Port(number): UDP port to use for sending encapsulated packets. On Linux, defaults to kernel default, currently 8472, but on Windows, must be 4789.GBP(Boolean): Enable VXLAN Group Based Policy. Defaults tofalse. GBP is not supported on WindowsDirectRouting(Boolean): Enable direct routes (likehost-gw) when the hosts are on the same subnet. VXLAN will only be used to encapsulate packets to hosts on different subnets. Defaults tofalse. DirectRouting is not supported on Windows.MacPrefix(String): Only use on Windows, set to the MAC prefix. Defaults to0E-2A.
根据这些参数说明,我先尝试把DirectRouting改为true,然后网络就通了,所以可以断定问题出现在vxlan的overlay packet上。
然后,我尝试设置了VNI number,但没什么用。
又试着把Port改为8473,这下网络又通了,所以怀疑是overlay的端口与底层网络之间有冲突,尝试这搜了一下,搜到了文章
记一次K8S VXLAN Overlay网络8472端口冲突问题的排查
跟我遇到的现象几乎一样,又顺着vxlan的冲突问题进行了搜索发现了2个文章:
exsi 使用 redhat8.4 搭建k8s集群,flannel vxlan 模式的不正常排错
VMXNET3 v4 causes invalid checksums of inner packets of VXLAN tunnel (BZ#1960702)
于是我也尝试了disable VM的checksum offload,这里port改回默认值,网络依然没问题,所以初步断定这就是root cause。
然后又找到了calico相关的issue和fix
https://github.com/projectcalico/calico/issues/4727
https://github.com/projectcalico/calico/pull/6842
最终决定我们的产品里也需要disable checksum offload。
Comments