測試環境服務出現問題,服務一直報錯認證超時,檢查pod,發現如下情況:
- 異常節點的pod可以ping通本地宿主機的ip,但是ping本地宿主機的網關沒有回顯(通過tcpdump發現的)
- 異常節點的pod可以ping通正常節點的pod
- 異常節點的pod去ping正常節點的宿主機ip,正常節點使用tcpdump抓包,發現返回是正常,但是pod內部還是沒有ping通的回顯
- 異常節點的宿主機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