本文作者: slience_me
問題描述
# 問題描述
# root@k8s-node1:/home/slienceme# kubectl get pods --all-namespaces
# NAMESPACE NAME READY STATUS RESTARTS AGE
# kube-flannel kube-flannel-ds-66bcs 1/1 Running 0 12h
# kube-flannel kube-flannel-ds-ntwwx 1/1 Running 0 12h
# kube-flannel kube-flannel-ds-vb6n9 1/1 Running 5 12h
# kube-system coredns-7f9c544f75-67njd 0/1 CrashLoopBackOff 17 12h // [!code focus:8]
# kube-system coredns-7f9c544f75-z82nl 0/1 CrashLoopBackOff 17 12h
# kube-system etcd-k8s-node1 1/1 Running 4 12h
# kube-system kube-apiserver-k8s-node1 1/1 Running 4 12h
# kube-system kube-controller-manager-k8s-node1 1/1 Running 3 12h
# kube-system kube-proxy-fs2p6 1/1 Running 0 12h
# kube-system kube-proxy-x7rkp 1/1 Running 0 12h
# kube-system kube-proxy-xpbvt 1/1 Running 3 12h
# kube-system kube-scheduler-k8s-node1 1/1 Running 3 12h
# kube-system tiller-deploy-6ffcfbc8df-mzwd7 1/1 Running 0 39m
原因分析:
在 CoreDNS 的配置文件 (Corefile) 中,forward 插件不應該指向 CoreDNS 本身,否則會導致 DNS 請求循環。如果 forward 指向 CoreDNS,它會不斷地將請求轉發回自己,造成無限循環。
通過對問題的追蹤,在github issue找到 CoreDNS pod goes to CrashLoopBackOff State
解決方案:
你需要修改 Kubernetes 中的 CoreDNS 配置,具體操作步驟如下:
步驟 1: 修改 CoreDNS 配置ConfigMap
kubectl edit configmap coredns -n kube-system
步驟 2: 修改 Corefile
配置
修改 Corefile
中的 forward
配置,當前配置為:
forward . /etc/resolv.conf
你需要將其修改為指向外部 DNS 服務器,比如 Google 的公共 DNS 服務器 8.8.8.8
或 1.1.1.1
(Cloudflare DNS)。例如,你可以修改為:
forward . 8.8.8.8
或者如果你希望使用多個 DNS 服務器,可以配置多個地址:
forward . 8.8.8.8 8.8.4.4
步驟 3: 保存并退出
步驟 4: 驗證配置生效
驗證 CoreDNS 配置是否生效,可以查看 CoreDNS Pod 是否正常運行,并且配置是否正確生效。
kubectl get pods -n kube-system -l k8s-app=kube-dns
如果需要,也可以重啟 CoreDNS Pods,以確保新的配置生效:
kubectl rollout restart deployment coredns -n kube-system
通過這些步驟,你就能避免 CoreDNS 發生循環請求,確保 DNS 請求被轉發到外部的 DNS 服務器,而不是 CoreDNS 本身。