故障類型
我遇到的幾次k8s集群的dns問題,大致分為幾種:
- 網絡插件的pod掛掉了
- 服務是雙網卡的情況
- 服務器自身的網絡問題,比如路由
解決辦法
1、確認宿主機的網絡訪問情況,dns解析。因為pod一般是復制宿主機信息。
ping 114.114.114.114
cat /etc/resolv
centos7 可以在網卡配置dns覆蓋resolv的配置,確認網卡中的dns刪除掉。
2、確認服務器路由,都使用同一個默認網關
route -n
netstat -r
3、查看集群的網絡組建 flannel和dns,確認pod運行狀態正常
kubectl get pod -n kube-system -o wide |grep flannel
kubectl get pod -n kube-system |grep dns
4、如果以上都正常。
重啟服務器網絡
systemctl restart network
重啟docker,清空exit狀態的pod
systemc restart docker
docker container prune
重啟kubelet
systemctl restart kubelet
5、終極殺招
重啟服務器
reboot
測試腳本
busybox
部署一個DaemonSet的busybox運行在每個節點上
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: busybox-test
namespace: default
spec:
selector:
matchLabels:
name: busybox-test
template:
metadata:
labels:
name: busybox-test
spec:
containers:
- name: app
image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
terminationGracePeriodSeconds: 30
sh
在kubectl服務器上執行腳本測試
#!/bin/bash
for i in `kubectl get pods -o wide |grep busy |awk '{print $1}'`
do
echo "開始執行測試.....$i"
PODNAME=$i
NODENAME=`kubectl get pods -o wide |grep $i | awk '{print $7}'`
echo "正在執行測試主機名為$NODENAME,POD名為$PODNAME"
kubectl exec $PODNAME -- nslookup my-nginx |grep -v 'find'
echo "准備下一次測試"
sleep 5
done