Kubernetes 集群中 CoreDNS 与 Calico 的故障排查与修复全记录

从 DNS 探针失败到完整网络解决方案


问题背景

在通过 kubeadm 初始化 Kubernetes 集群时,我指定了自定义的 DNS 域名和服务 CIDR:

kubeadm init \
  --service-dns-domain=oldboyedu.com \
  --service-cidr=10.200.0.0/16 \
  --pod-network-cidr=10.100.0.0/16

随后安装 Calico 时,CoreDNS Pod 持续报错 Readiness probe failed (HTTP 503),且 Pod 状态为 Running 但未就绪。


问题现象

  1. CoreDNS 状态异常

    kubectl get pods -n kube-system -l k8s-app=kube-dns
    
    NAME          READY   STATUS    RESTARTS   AGE
    coredns-xxxx  0/1     Running   0          10m
    
  2. 探针失败日志

    Warning  Unhealthy  3m (x10)  kubelet  Readiness probe failed: HTTP probe failed with statuscode: 503
    
  3. ConfigMap 配置问题
    CoreDNS 的 Corefile 中误用了默认域名 cluster.local,而集群实际域名为 oldboyedu.com


根本原因

  1. 域名不匹配

    • kubeadm init 指定了 --service-dns-domain=oldboyedu.com,但 CoreDNS 配置未同步修改。
    • 导致 CoreDNS 无法正确解析集群内服务(如 kubernetes.default.svc.oldboyedu.com)。
  2. 探针依赖 DNS 解析
    CoreDNS 的 /ready 端点需要能成功解析 Kubernetes 服务,否则返回 503。

  3. Calico 网络未完全就绪
    在 Calico 安装过程中,节点污点 network-unavailable 可能影响 CoreDNS 的网络连通性。


解决方案

1. 修正 CoreDNS 配置

更新 ConfigMap 以匹配集群域名:

kubectl edit cm -n kube-system coredns
Corefile: |
  .:53 {
      kubernetes oldboyedu.com in-addr.arpa ip6.arpa {  # 关键修改
         pods insecure
         fallthrough in-addr.arpa ip6.arpa
      }
      # 其他配置保持不变...
  }

2. 调整探针参数

为 CoreDNS 添加更宽松的探针检查:

readinessProbe:
  httpGet:
    path: /ready
    port: 8181
  initialDelaySeconds: 5  # 适当延长初始等待
  periodSeconds: 10
  failureThreshold: 3     # 允许更多次失败

3. 确保 Calico 与 CoreDNS 协同工作

  • 检查 Calico IP 池

    kubectl get ippools -o yaml | grep cidr
    

    确认 CIDR 范围与 kubeadm --pod-network-cidr 一致(如 10.100.0.0/16)。

  • 添加网络就绪容忍

    tolerations:
    - key: node.kubernetes.io/network-unavailable
      operator: Exists
      effect: NoSchedule
    

4. 验证修复

# 重启 CoreDNS
kubectl rollout restart ds/coredns -n kube-system

# 测试解析
kubectl run dns-test --image=busybox --rm -it -- \
  nslookup kubernetes.default.svc.oldboyedu.com

经验总结

  1. 关键配置一致性

    • kubeadm init--service-dns-domain 必须与 CoreDNS 的 kubernetes 插件域名完全一致。
    • 使用 kubectl get cm -n kube-system coredns -o yaml 快速验证配置。
  2. 组件启动顺序

    • 先确保 CNI(如 Calico)就绪,再部署 CoreDNS。
    • 可临时使用 hostNetwork: true 让 CoreDNS 绕过 CNI 依赖。
  3. 监控与日志

    • 通过 kubectl logs 检查 CoreDNS 日志,重点关注 [ERROR] 和插件加载情况。
    • 使用 kubectl describe endpoints kube-dns -n kube-system 确认服务端点是否正常。

附录:完整修复流程

graph TD A[发现CoreDNS未就绪] --> B[检查探针日志] B --> C{是否为503错误?} C -->|是| D[检查Corefile域名] C -->|否| E[检查网络连通性] D --> F[修正为oldboyedu.com] F --> G[重启CoreDNS] G --> H[验证DNS解析] H --> I[检查Calico IP池]

相关命令速查

功能 命令
检查集群域名 kubectl get cm -n kube-system kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' | yq eval '.networking.dnsDomain' -
强制重建 Pod kubectl delete pod -n kube-system -l k8s-app=kube-dns --force
测试服务解析 nslookup <service>.<ns>.svc.oldboyedu.com

通过这次排查,我深刻理解了 Kubernetes 各组件间的依赖关系。配置一致性启动顺序是稳定性的关键!

posted on 2025-06-12 13:38  Leo_Yide  阅读(507)  评论(0)    收藏  举报