Domain-Name-System

kubernetes coredns 處於 CrashLoopBackOff 狀態,出現“未找到名稱伺服器”錯誤

  • November 1, 2021

我曾嘗試在我的裸機伺服器上使用 kubeadm 建構 kubernetes,並將 containerd 作為 cri,但似乎 coredns 在安裝 cni(weave-net)後無法啟動。

兩個 coredns 容器現在處於“CrashLoopBackOff”狀態,它們的日誌是:

plugin/forward: no nameservers found

而“kubectl describe pod”的描述如下:

Events:
 Type     Reason            Age                    From               Message
 ----     ------            ----                   ----               -------
 Warning  FailedScheduling  4m52s (x9 over 13m)    default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
 Normal   Scheduled         4m7s                   default-scheduler  Successfully assigned kube-system/coredns-58cf647449-8pq7k to k8s
 Normal   Pulled            3m13s (x4 over 4m6s)   kubelet            Container image "localhost:5000/coredns:v1.8.4" already present on machine
 Normal   Created           3m13s (x4 over 4m6s)   kubelet            Created container coredns
 Normal   Started           3m13s (x4 over 4m6s)   kubelet            Started container coredns
 Warning  Unhealthy         3m13s                  kubelet            Readiness probe failed: Get "http://10.32.0.3:8181/ready": dial tcp 10.32.0.3:8181: connect: connection refused
 Warning  BackOff           2m54s (x12 over 4m5s)  kubelet            Back-off restarting failed container

如果我在 /etc/resolv.conf 上添加一些設置,例如“nameserver 8.8.8.8”,coredns pods 就會開始執行。但是,目前我根本不使用任何外部 dns,並且使用 Docker 作為 cri,雖然 /etc/resolv.conf 上沒有設置,但 coredns 執行良好。

是否可以在不在 resolv.conf 上設置一些上游 dns 伺服器的情況下處理這個問題?

伺服器資訊:

OS: RedHat Enterprise Linux 8.4
cri: containerd 1.4.11
cni: weave-net 1.16
tools: kubeadm, kubectl, kubelet 1.22.1

我也嘗試過使用 calico 作為 cni,但結果是一樣的。

原因是 coredns 預設在其 ConfigMap 上有一個轉發設置。儘管 /etc/resolv.conf 上沒有 DNS 設置,但它試圖將請求轉發到上游 DNS 伺服器。

# kubectl edit configmap coredns -n kube-system

刪除以下部分後,它開始並正常工作。

   forward . /etc/resolv.conf {
      max_concurrent 1000
   }

引用自:https://serverfault.com/questions/1081685