Kubespray部署K8s集群后calico相关Pod CrashLoopBackOff故障求助
问题根因
问题核心原因是Calico节点IP自动探测失败,你之前尝试的can-reach参数指定的都是公网地址,而你的环境公网访问受限,探测失败后Calico无法正常注册节点信息,confd组件无法生成BIRD配置文件,导致BGP后端进程启动失败,最终所有Calico组件异常。另外CentOS7默认的SELinux、遗留iptables规则也可能会阻止Calico写入配置文件、跨节点通信。
排查步骤
- 首先查看calico-node的confd容器日志确认错误:
kubectl logs -n kube-system <calico-node Pod名称> -c confd
正常情况下会返回连接datastore失败或者拉取配置失败的报错。
- 检查所有节点的SELinux状态和iptables规则:
# 检查SELinux getenforce # 检查Calico所需端口是否被拦截 iptables -L -n | grep -E '(179|4789|5473)'
- 检查Calico IP池是否正常创建:
calicoctl get ippools -o wide
如果无返回结果,说明IP池部署阶段未正常提交到集群。
解决方法
方案1:修改Kubespray配置重新部署(推荐,新集群无业务适用)
- 编辑集群配置文件
inventory/mycluster/group_vars/k8s_cluster/k8s-net-calico.yml,添加以下参数:
# 直接指定节点所在网段,避免公网探测 calico_ip_auto_method: "cidr=192.168.231.0/24" # 可选:如果不需要BGP能力,改为VXLAN模式降低复杂度 calico_network_backend: "vxlan" calico_vxlan_mode: "Always"
- 仅重新执行集群网络部署步骤:
ansible-playbook -i inventory/mycluster/hosts.yaml cluster.yml --tags=network
方案2:手动修复现有集群
- 所有节点执行以下命令关闭SELinux、清理遗留iptables规则:
# 临时关闭SELinux setenforce 0 # 永久关闭SELinux sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config # 清理iptables规则 iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X # 重启容器运行时 systemctl restart docker
- 正确配置Calico节点IP自动探测规则:
kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=cidr=192.168.231.0/24
- 手动创建Calico默认IP池,创建
ippool.yaml文件:
apiVersion: projectcalico.org/v3 kind: IPPool metadata: name: default-ipv4-ippool spec: # 与Kubespray配置的Pod网段保持一致,默认是10.233.64.0/18 cidr: 10.233.64.0/18 vxlanMode: Always natOutgoing: true
执行提交:
calicoctl apply -f ippool.yaml
- 重启所有Calico相关Pod:
kubectl delete pod -n kube-system -l k8s-app=calico-node kubectl delete pod -n kube-system -l k8s-app=calico-kube-controllers
等待3-5分钟后执行kubectl get pods -n kube-system查看Calico组件状态,即可恢复正常。
内容的提问来源于stack exchange,提问作者HoseinGhanbari
相关产品推荐
相关产品推荐

