K8s Calico Pod启动失败 报错创建默认IPv4 IP池资源不存在
故障根因
- 集群同时部署Calico、Canal两套CNI网络插件,存在配置冲突
- Calico依赖的自定义资源定义(CRD)未完整安装,导致calico-node启动时无法调用对应API创建IP池,网络插件完全失效,依赖CNI网络的coredns、calico-kube-controllers组件无法正常调度或启动。
修复步骤
1. 清理冲突CNI残留
先删除现有异常的网络插件资源,全节点清理旧配置:
# 删除控制面异常的网络插件工作负载 kubectl delete deployment calico-kube-controllers -n kube-system kubectl delete daemonset calico-node canal -n kube-system
所有集群节点(含master、worker节点)执行以下命令清理本地残留配置:
# 清理旧CNI配置与二进制文件 rm -rf /etc/cni/net.d/* rm -rf /opt/cni/bin/*
master节点执行以下命令清理etcd中残留的Calico旧配置:
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \ --key=/etc/kubernetes/pki/etcd/healthcheck-client.key \ del /calico/ --prefix
2. 确认集群Pod网段
执行以下命令确认kubeadm初始化时配置的Pod网段:
kubectl get configmap kubeadm-config -n kube-system -o yaml | grep podSubnet
记录输出的网段值,后续部署Calico时需保持配置一致,从提供的日志看当前网段为10.244.0.0/16。
3. 重新部署Calico
注意:单集群仅允许部署一套CNI插件,禁止同时安装Calico、Canal、Flannel等多个网络组件
- 获取与当前K8s版本匹配的Calico部署包,先部署包内提供的
crds.yaml文件,完成CRD资源注册:
kubectl apply -f crds.yaml
- 等待10秒左右执行以下命令,确认CRD注册成功:
kubectl get crds | grep projectcalico.org
输出结果包含felixconfigurations.crd.projectcalico.org、globalfelixconfigs.crd.projectcalico.org等资源即为正常。
3. 修改Calico主部署文件calico.yaml中CALICO_IPV4POOL_CIDR字段的值,和之前查到的集群Pod网段保持一致,然后执行部署:
kubectl apply -f calico.yaml
4. 部署验证
等待1-3分钟后执行以下命令查看组件状态:
kubectl get pods -n kube-system
正常状态下calico-node、calico-kube-controllers Pod状态全部为Running,coredns Pod会在CNI网络就绪后自动完成调度启动,不再处于Pending状态。
避坑说明
- 部署Calico必须先安装CRD资源,再部署主组件,顺序颠倒就会触发日志中出现的「资源不存在」类报错
- 旧CNI插件的本地配置文件如果不清理干净,新插件启动时会读取到错误配置,反复启动失败
- 不要在集群中混用多种CNI插件,会直接导致整个集群网络层瘫痪
内容的提问来源于stack exchange,提问作者SamAndrew81
相关产品推荐
相关产品推荐

