目录

  • 排查过程
  • 本地宿主机网络检查
  • pod网络检查
  • tcpdump检查网络
  • 检查flannel网卡
  • 检查宿主机网卡
  • iptables检查
  • 解决方法

测试环境服务出现问题,服务一直报错认证超时,检查pod,发现如下情况:

  1. 异常节点的pod可以ping通本地宿主机的ip,但是ping本地宿主机的网关没有回显(通过tcpdump发现的)
  2. 异常节点的pod可以ping通正常节点的pod
  3. 异常节点的pod去ping正常节点的宿主机ip,正常节点使用tcpdump抓包,发现返回是正常,但是pod内部还是没有ping通的回显
  4. 异常节点的宿主机ip是可以正常ping通其他节点的ip的

排查过程

本地宿主机网络检查

ping 122.18.125.33

终端正常,有回显,证明宿主机的网络是没有问题

route
ping 122.18.125.254

宿主机ping本机的网关(通过route命令可以查看网关ip),也有回显,也是正常的

pod网络检查

kubectl get pod -n xxx -o wide

公司服务原因,所以对于名称做了和谐

通过-o wide参数,查看pod所在节点的ip,以及pod内部的ip

kubectl exec -it -n xxx <pod-name> -- ping 122.18.125.234

-- 是为了不进入pod操作,为了不频繁exit

这个时候,pod是可以ping通本地宿主机的ip的

kubectl exec -it -n xxx <pod-name> -- ping 122.18.125.254

这个时候,pod去ping网关,发现没有任何回显,在没有抓包之前,认为是网络不通

tcpdump检查网络

检查flannel网卡
  • 在pod网络正常的节点操作
tcpdump -i flannel.1 -nvvv icmp

通过tcpdump命令,抓取flannel.1网卡,抓icmp协议(ping命令使用的是icmp协议

  • 在pod网络异常的节点操作
kubectl exec -it -n xxx <pod-name> -- ping 10.244.5.5

此时是ping网络正常节点的pod的ip,验证flannel网卡是否异常

最终的结果是,两个节点之间的pod是可以正常通信的,说明flannel网卡没有问题

如果flannel检查有问题,则先重启flannel,再重启docker后再尝试一下

systemctl restart flanneld && systemctl restart docker

检查宿主机网卡
  • 在pod网络正常的节点操作
tcpdump -i eth0 -nvvv icmp

通过tcpdump命令,抓取eth0网卡,抓icmp协议

  • 在pod网络异常的节点操作
kubectl exec -it -n xxx <pod-name> -- ping 122.18.125.33

此时ping的是pod网络正常的节点宿主机ip,发现pod内没有回显,但是tcpdump获取的信息如下

13:00:07.647480 IP (tos 0x0, ttl 60, id 42390, offset 0, flags [DF], protr ICMP (1), length 84)
    122.18.125.234 > 122.18.125.33 ICMP echo request, id 12141, seq 1, length 84

iptables检查

iptabels -t nat -nL | grep "10.244.29.2"

过滤出pod的ip,发现是有DNAT转发的,iptables的规则也是没有问题的

解决方法

实在查找不出异常,于是选择了重启network服务,结果就正常了。。。

systemctl restart network