Calico CNI报错calico-kube-controllers初始化Calico数据存储失败
问题排查与解决步骤
1 优先验证apiserver服务连通性
报错核心是calico-kube-controllers无法访问Kubernetes默认apiserver服务地址10.96.0.1:443,先在Pod调度到的工作节点上执行以下测试:
- 直接测试连通性:
curl -kv https://10.96.0.1:443,如果不通继续排查以下项 - 检查kube-proxy运行状态,查看kube-proxy日志确认是否有规则下发失败报错:你的集群节点是CentOS 8/RHEL 8,默认使用nftables框架,要确认kube-proxy的iptables后端和Calico配置的
FELIX_IPTABLESBACKEND=NFT匹配,如果kube-proxy仍使用legacy iptables后端,会和Calico的nftables规则冲突,导致service路由失效 - 若集群使用ipvs模式,执行
ipvsadm -Ln查看10.96.0.1:443对应的后端是否为正常的master节点地址和端口 - 关闭节点默认firewalld服务(RHEL8/CentOS8默认firewalld会拦截Calico/K8s相关流量,生产环境建议直接关闭用Calico网络策略管理):
systemctl stop firewalld && systemctl disable firewalld
2 验证Calico CRD安装完整性
- 检查Calico所有CRD是否正确部署:
kubectl get crds | grep calico - 确认clusterinformations CRD存在且有默认实例:
kubectl get clusterinformations default -o yaml,如果实例不存在,说明Calico初始化阶段CRD注册未完成,重新 apply 对应v3.19.1版本的Calico CRD配置文件即可
3 检查Calico网卡自动检测配置
- 你配置的
IP_AUTODETECTION_METHOD=interface=en.*,需要确认所有节点的业务通信网卡名称确实为en开头,执行ip a查看节点网卡信息,若节点存在多块en开头的网卡(比如管理+业务双网卡场景),Calico可能会选错网卡导致跨节点流量不通,建议修改为基于网段的自动检测规则,替换为你节点实际的物理网卡网段:
- name: IP_AUTODETECTION_METHOD value: "cidr=你的节点物理网卡网段"
- 检查所有calico-node Pod运行状态:
kubectl get pod -n kube-system | grep calico-node,如果有异常Pod,查看日志确认是否为网卡检测失败导致的启动异常
4 验证RBAC权限配置
- 检查calico-kube-controllers对应的ServiceAccount是否有访问CRD资源的权限:
kubectl auth can-i get clusterinformations --as=system:serviceaccount:kube-system:calico-kube-controllers -n kube-system,返回yes为正常,若返回no,重新apply Calico对应版本的RBAC配置文件即可
5 临时恢复方案
如果仅工作节点上的calico-kube-controllers启动失败,可先给Deployment添加节点亲和性,将Pod调度到master节点先恢复业务,再逐步排查工作节点网络问题:
nodeSelector: node-role.kubernetes.io/master: "" tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule
内容的提问来源于stack exchange,提问作者sfgroups
相关产品推荐
相关产品推荐

