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 但未就绪。
问题现象
-
CoreDNS 状态异常
kubectl get pods -n kube-system -l k8s-app=kube-dnsNAME READY STATUS RESTARTS AGE coredns-xxxx 0/1 Running 0 10m -
探针失败日志
Warning Unhealthy 3m (x10) kubelet Readiness probe failed: HTTP probe failed with statuscode: 503 -
ConfigMap 配置问题
CoreDNS 的 Corefile 中误用了默认域名cluster.local,而集群实际域名为oldboyedu.com。
根本原因
-
域名不匹配
kubeadm init指定了--service-dns-domain=oldboyedu.com,但 CoreDNS 配置未同步修改。- 导致 CoreDNS 无法正确解析集群内服务(如
kubernetes.default.svc.oldboyedu.com)。
-
探针依赖 DNS 解析
CoreDNS 的/ready端点需要能成功解析 Kubernetes 服务,否则返回 503。 -
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
经验总结
-
关键配置一致性
kubeadm init的--service-dns-domain必须与 CoreDNS 的kubernetes插件域名完全一致。- 使用
kubectl get cm -n kube-system coredns -o yaml快速验证配置。
-
组件启动顺序
- 先确保 CNI(如 Calico)就绪,再部署 CoreDNS。
- 可临时使用
hostNetwork: true让 CoreDNS 绕过 CNI 依赖。
-
监控与日志
- 通过
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 各组件间的依赖关系。配置一致性和启动顺序是稳定性的关键!
浙公网安备 33010602011771号