问题现象
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监听
# 启动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
route -n
# 查询ARP
ip neigh | grep flannel
# 查询 FDB
bridge fdb show | grep flannel.1
发现别的节点 ARP 表和 FDB 表保存的重启节点的 Flannel.1
网卡的 MAC
地址不对。更新MAC地址:
# 删除FDB命令:bridge fdb del <MAC地址> dev <接口> dst <目标IP>
bridge fdb del 46:83:71:f7:d7:69 dev flannel.1 dst 10.201.112.29
# 新增:bridge fdb add <MAC地址> dev <接口> dst <目标IP>
bridge fdb add 46:83:71:f7:d7:69 dev flannel.1 dst 10.201.112.29
# 删除ARP
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
# 注意:删除ARP后可能会自动添加一个,导致新增失败,RTNETLINK answers: File exists,可以将删除和新增放同一个命令执行。
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,问题解决。