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通了。
相关参考
在Kubernetes环境中,发现宿主机无法ping通Pod。通过对网络流量的抓包分析,发现在某些节点上iptables可能阻止了ICMP包的传递。通过检查并调整iptables规则,成功解决了宿主机与Pod间的网络通信问题。


被折叠的 条评论
为什么被折叠?



