Kubernetes Flannel 主機ping不通Pod

2020-08-09 21:58:11

Kubernetes Flannel 主機ping不通Pod

1 問題

Kubernetes搭建完成也使用了一段時間後,由於種種原因有些機器意外下線,然後又經過不同的人操作後。今天我突然發現宿主機ping不通。執行的測試例子如下:

#1.檢查節點狀態
kubectl get nodes #正常情況下所有節點都處於Ready狀態
#2.建立測試檔案 nginx-ds.yml,其內容如下:
apiVersion: v1
kind: Service
metadata:
  name: nginx-ds
  labels:
    app: nginx-ds
spec:
  type: NodePort
  selector:
    app: nginx-ds
  ports:
  - name: http
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-ds
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  selector:
    matchLabels:
      app: nginx-ds
  template:
    metadata:
      labels:
        app: nginx-ds
    spec:
      containers:
      - name: my-nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        
#3.執行測試
kubectl create -f nginx-ds.yml #結果應該是每一個Slave節點都有一個nginx-ds的Pod在執行
#4.檢查各節點的Pod IP連通性,編寫測試指令碼ping-test.sh,指令碼內容如下:
#!/bin/bash
podIPs=`kubectl get pods -o wide -l app=nginx-ds | awk '{print  $6}' |grep -v IP`
count=0
for podIp in ${podIPs[@]}
do
  let count=0
  for i in `seq 1 11` ;do
    if ssh node$i  ping -c 1 $podIp |grep '100% packet loss' ;
    then
           echo "node$i ping $podIp error" ;
    else
           let count+=1
    fi
  done
  if [ $count == 11 ];then
    echo "all Slave node ping $podIp successful!";
  else
    echo "ping $podIp failed"
  fi
done

執行上面的例子後,輸出的結果如下:
在这里插入图片描述

2 解決方案

通過上面的結果發現出問題的機器爲node3、node6、node8、node9、node10,此處以node8和node10互相ping對方機器中執行的pod爲例,發現依然是ping不通的,爲了找到問題,我們使用tcpdump進行抓包,嘗試尋找原因。過程如下:

  • 在node10中使用ping 10.244.7.178指令,然後在node8中使用sudo tcpdump,node10中的結果當然是ping不通了。而node8中的結果如下:
    在这里插入图片描述
    可以發現node8收到包了,但是node10卻沒有收到回覆 回復,我們也可以看到node10中有916個packets被dropped了。所以我猜測應該是iptalbes的問題,可能是ICMP包被iptables給drop了。
  • 接下來分別在node8和node10中執行如下指令:
    sudo iptables -P INPUT ACCEPT  && 
    sudo iptables -P OUTPUT ACCEPT && 
    sudo iptables -P FORWARD ACCEPT && 
    sudo iptables -A INPUT -p icmp
    
  • 執行指令後,在node10中使用ping 10.244.7.178發現就可以ping通了。

相關參考