故障类型
我遇到的几次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