iptables snat規則缺失,kubernetes叢集問題node上所有容器無法ping通外網
現象
Kubernetes叢集的一個node出現問題,該問題node上所有的容器不能ping外網IP。
網路方案是flannel,kube-proxy使用ipvs的方式。
調查
選擇叢集外的一臺機器作為目標機器,在問題機器的容器內ping目標機器,容器的IP是 10.12.9.139
,目標機器地址是 10.10.64.58
。
在目標機器上抓包:
[[email protected] lxcfs]# tcpdump -n -i eth0 icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 11:51:40.167453 IP 10.12.9.139 > 10.10.64.58: ICMP echo request, id 31744, seq 115, length 64 11:51:40.167560 IP 10.10.64.58 > 10.12.9.139: ICMP echo reply, id 31744, seq 115, length 64 11:51:41.167434 IP 10.12.9.139 > 10.10.64.58: ICMP echo request, id 31744, seq 116, length 64 11:51:41.167561 IP 10.10.64.58 > 10.12.9.139: ICMP echo reply, id 31744, seq 116, length 64 11:51:42.167453 IP 10.12.9.139 > 10.10.64.58: ICMP echo request, id 31744, seq 117, length 64 11:51:42.167581 IP 10.10.64.58 > 10.12.9.139: ICMP echo reply, id 31744, seq 117, length 64
目標機器收到了容器內發出的請求包,並且做了迴應,但在問題機器上抓包,沒有抓到目標機器的迴應包。
檢視目標機器上抓到的報文情況,發現 源IP是容器的IP(10.12.9.139)
。這是有問題的,因為目標機器不是kubernetes中的機器,壓根不能訪問容器的IP,它看到IP應當是 容器所在的node的IP
。
解決方法
問題應該出iptables上,容器的報文被送離node時沒有做snat。
對比問題node的iptables規則和正常node的iptables規則,發現問題node上缺失了一條iptables規則:
-A POSTROUTING -s 10.12.9.138/26 ! -o docker0 -j MASQUERADE
將這條規則新增上以後,狀況消失(注意-s指定的是node分配的虛擬網段):
iptables -t nat -A POSTROUTING -s 10.12.9.138/26 ! -o docker0 -j MASQUERADE
為什麼會缺了一條iptables規則?需要繼續嘗試復現。2019-02-15 13:13:18