问题现象
k8s集群中有一台机器重启了,重启后在这台节点ping其他机器的pod ip都不通。
抓ping的包可以看到只有request的,正常情况是有reply的。
tcpdump -i flannel.1 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on flannel.1, link-type EN10MB (Ethernet), capture size 262144 bytes
22:28:45.852513 IP 10.233.65.0 > 10.233.64.0: ICMP echo request, id 12, seq 48, length 64
22:28:46.872698 IP 10.233.65.0 > 10.233.64.0: ICMP echo request, id 12, seq 49, length 64
22:28:47.896618 IP 10.233.65.0 > 10.233.64.0: ICMP echo request, id 12, seq 50, length 64
22:28:49.851093 IP 10.233.65.0 > 10.233.64.0: ICMP echo request, id 13, seq 1, length 64
22:28:50.872665 IP 10.233.65.0 > 10.233.64.0: ICMP echo request, id 13, seq 2, length 64
NC命令测试,问题节点启动UDP监听
nc -u -l -p 12345
tcpdump -i flannel.1 port 12345
正常节点发送udp报文
echo "test"| nc -u 10.233.64.0 12345
此时后台抓包可以看到有报文过来,但是nc控制台无任何显示。
问题解决
网上搜很多是云平台安全组策略问题,这可能是一种情况,但是我这里安全组策略都是开通的。
学习下Flannel网络模式之VXLAN
文中提到每个节点都会保存Routing Table、ARP Table和FDB Table,然后我在所有节点上都查询了这些表,
route -n
ip neigh | grep flannel
bridge fdb show | grep flannel.1
发现别的节点 ARP 表和 FDB 表保存的重启节点的 Flannel.1 网卡的 MAC 地址不对。更新MAC地址:
bridge fdb del 46:83:71:f7:d7:69 dev flannel.1 dst 10.201.112.29
bridge fdb add 46:83:71:f7:d7:69 dev flannel.1 dst 10.201.112.29
ip neigh del 10.233.64.0 dev flannel.1
ip neigh add 10.233.64.0 lladdr f2:b5:5e:29:23:55 dev flannel.1 nud permanent
ip neigh del 10.233.64.0 dev flannel.1 && ip neigh add 10.233.64.0 lladdr 0a:9c:93:d8:1c:bd dev flannel.1 nud permanent
然后测试ping别的机器POD IP,问题解决。