k8s集群dns問題解決辦法


故障類型

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM