k8s-coredns-CrashLoopBackOff 工作不正常
本文作者: 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 本身。