k8s集群dns问题解决办法

时间:2024-04-16 19:50:43

故障类型

我遇到的几次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