避坑指南:Calico网络插件安装后CoreDNS还是Pending?手把手教你排查与修复
Kubernetes网络插件Calico安装后CoreDNS异常排查指南
当你按照教程一步步安装完Calico网络插件,满心欢喜地输入kubectl get pods -n kube-system命令,却发现CoreDNS的状态依然是Pending时,那种挫败感我深有体会。这不是一个简单的安装问题,而是Kubernetes网络配置中常见的"坑"。本文将带你深入排查这个问题的根源,并提供切实可行的解决方案。
1. 问题现象与初步诊断
在Kubernetes集群中,CoreDNS是负责服务发现的核心组件。正常情况下,它的状态应该是Running。当出现Pending状态时,通常意味着Pod无法正常调度或启动。让我们先确认问题的具体表现:
kubectl get pods -n kube-system -o wide典型的问题输出可能如下:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES coredns-558bd4d5db-4jbdv 0/1 Pending 0 15m <none> <none> <none> <none> coredns-558bd4d5db-pw5x5 0/1 Pending 0 15m <none> <none> <none> <none>关键诊断步骤:
检查Calico组件是否正常运行:
kubectl get pods -n calico-system查看CoreDNS Pod的详细事件:
kubectl describe pod -n kube-system coredns-558bd4d5db-4jbdv
提示:重点关注Events部分,常见的错误信息包括"no nodes available to schedule pods"或"network plugin not ready"。
2. 常见原因分析与排查
2.1 CIDR配置不匹配
这是最常见的问题根源。Calico需要知道Kubernetes集群的Pod网络CIDR范围,而这个配置必须在多个地方保持一致:
kubeadm init时的配置:
kubeadm init --pod-network-cidr=192.168.0.0/16Calico的custom-resources.yaml文件:
ipPools: - blockSize: 26 cidr: 192.168.0.0/16 encapsulation: VXLANCrossSubnet
验证方法:
kubectl get ippools.crd.projectcalico.org -o yaml如果发现CIDR不匹配,你需要:
删除现有的Calico安装:
kubectl delete -f tigera-operator.yaml kubectl delete -f custom-resources.yaml修改custom-resources.yaml中的CIDR配置
重新应用配置文件
2.2 主节点Taint未移除
默认情况下,Kubernetes主节点有污点(taint),阻止普通Pod调度。对于测试环境或单节点集群,你可能需要移除这个污点:
kubectl taint nodes --all node-role.kubernetes.io/master-验证Taint是否已移除:
kubectl describe node <master-node-name> | grep Taints预期输出应该是:
Taints: <none>2.3 网络策略或防火墙问题
即使Calico安装成功,网络策略或主机防火墙也可能阻止CoreDNS正常工作。检查以下方面:
主机防火墙规则:
iptables -L | grep calico网络策略:
kubectl get networkpolicies --all-namespacesCalico BGP配置(如果使用BGP):
calicoctl get bgpconfigurations -o yaml
3. 深度排查工具与技巧
当上述常见原因都排查过后问题仍然存在,我们需要更深入的诊断方法。
3.1 使用calicoctl诊断
Calico提供了专门的命令行工具calicoctl来诊断网络问题:
calicoctl node status预期输出示例:
Calico process is running. IPv4 BGP status +--------------+-------------------+-------+----------+-------------+ | PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO | +--------------+-------------------+-------+----------+-------------+ | 192.168.1.2 | node-to-node mesh | up | 10:21:13 | Established | +--------------+-------------------+-------+----------+-------------+3.2 检查IP地址分配
calicoctl get ipam -o yaml这个命令会显示IP地址分配情况,确保Calico正确管理IP地址池。
3.3 检查路由表
在节点上检查路由表,确保Calico添加了正确的路由:
ip route show | grep cali4. 修复步骤与验证
根据排查结果,采取相应的修复措施:
4.1 CIDR不匹配的修复
备份当前配置:
kubectl get ippools.crd.projectcalico.org -o yaml > ippools-backup.yaml删除错误的IP池:
calicoctl delete ippools default-ipv4-ippool创建正确的IP池:
apiVersion: projectcalico.org/v3 kind: IPPool metadata: name: new-pool spec: cidr: 192.168.0.0/16 ipipMode: Always natOutgoing: true应用新配置:
calicoctl apply -f new-ippool.yaml
4.2 验证修复效果
删除CoreDNS Pod让其重建:
kubectl delete pod -n kube-system -l k8s-app=kube-dns检查新Pod状态:
watch kubectl get pods -n kube-system -l k8s-app=kube-dns测试DNS解析:
kubectl run -it --rm --restart=Never busybox --image=busybox -- nslookup kubernetes.default
5. 高级问题与解决方案
对于更复杂的环境,可能会遇到以下问题:
5.1 多网卡环境配置
当节点有多个网络接口时,Calico可能选择错误的接口。可以通过修改Calico的配置来解决:
apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: calicoNetwork: nodeAddressAutodetectionV4: interface: "eth.*|en.*"5.2 MTU不匹配问题
不同网络环境的MTU设置可能导致网络问题。检查并调整MTU:
ip link show | grep mtu在Calico配置中设置正确的MTU:
apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: calicoNetwork: mtu: 14405.3 网络策略冲突
检查是否有网络策略阻止了CoreDNS的通信:
calicoctl get networkpolicy --all-namespaces -o wide如果发现问题,可以临时允许所有流量进行测试:
apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: allow-all spec: selector: all() types: - Ingress - Egress ingress: - action: Allow egress: - action: Allow6. 预防措施与最佳实践
为了避免将来再次遇到类似问题,建议采取以下预防措施:
- 文档化配置:记录所有关键配置参数,特别是CIDR范围
- 版本兼容性检查:确保Calico版本与Kubernetes版本兼容
- 预检脚本:使用Calico提供的诊断脚本预先检查环境
curl -L https://github.com/projectcalico/calico/blob/master/manifests/calicoctl-diagnostics.yaml -o calicoctl-diagnostics.yaml kubectl apply -f calicoctl-diagnostics.yaml - 监控设置:配置监控告警,及时发现网络问题
关键配置检查清单:
| 检查项 | 命令/方法 | 预期结果 |
|---|---|---|
| CIDR一致性 | 比较kubeadm init和custom-resources.yaml | 两者CIDR相同 |
| Taint状态 | kubectl describe node | 主节点无污点 |
| Calico组件状态 | kubectl get pods -n calico-system | 所有Pod为Running |
| IP分配情况 | calicoctl get ipam | IP池配置正确 |
| 网络连通性 | ping和nslookup测试 | 跨节点通信正常 |
在实际生产环境中,我遇到过多次类似问题,最棘手的一次是由于底层网络设备的MTU设置与Calico不匹配导致的。那次经历让我深刻认识到,Kubernetes网络问题的排查需要系统性地检查每一层配置。
