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
執行上面的例子後,輸出的結果如下:
通過上面的結果發現出問題的機器爲node3、node6、node8、node9、node10,此處以node8和node10互相ping對方機器中執行的pod爲例,發現依然是ping不通的,爲了找到問題,我們使用tcpdump
進行抓包,嘗試尋找原因。過程如下:
ping 10.244.7.178
指令,然後在node8中使用sudo tcpdump
,node10中的結果當然是ping不通了。而node8中的結果如下:sudo iptables -P INPUT ACCEPT &&
sudo iptables -P OUTPUT ACCEPT &&
sudo iptables -P FORWARD ACCEPT &&
sudo iptables -A INPUT -p icmp
ping 10.244.7.178
發現就可以ping通了。相關參考