k8s集群節點ping不通其他主機的ip


測試環境服務出現問題,服務一直報錯認證超時,檢查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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM