避坑指南:彻底清理K8s集群中的Calico网络残留(从Pod、路由到CNI配置)
Kubernetes网络清理实战彻底移除Calico的完整指南当你决定在Kubernetes集群中更换网络插件时可能会发现简单地执行kubectl delete -f calico.yaml并不能完全清除Calico的所有痕迹。残留的网络配置、路由规则和CNI文件可能导致新网络插件无法正常工作甚至引发节点状态异常。本文将带你深入排查并彻底清理Calico网络确保你的集群网络环境干净如初。1. 为什么Calico会留下网络幽灵Calico作为企业级Kubernetes网络方案采用了独特的BGP路由和策略驱动架构这使得它在提供高性能网络的同时也会在系统中留下多个层面的配置痕迹。常见的残留问题包括节点路由表污染Calico通过BGP协议在节点间交换路由信息即使删除Deployment后这些手工添加的路由规则仍会保留CNI配置残留/etc/cni/net.d/目录下的配置文件不会被自动清理内核模块加载IPIP隧道模式会加载内核模块并创建tunl0接口etcd数据残留如果使用etcd作为后端存储网络策略等数据可能仍然存在提示在开始清理前建议先备份/etc/cni/net.d/目录和节点路由表以防需要回滚操作。2. 预清理检查清单在执行实际清理操作前先确认当前集群状态# 检查Calico相关Pod是否已终止 kubectl get pods -n kube-system | grep calico # 检查节点网络接口 ip a | grep -E tunl0|wireguard # 检查节点路由表 ip route show | grep bird # 检查CNI配置文件 ls -la /etc/cni/net.d/ | grep -i calico典型的问题表现包括coredns Pod卡在Pending状态节点状态显示NotReady新部署的网络插件无法正常工作存在无法解释的网络连通性问题3. 系统化清理步骤3.1 删除Kubernetes资源首先删除Calico的Kubernetes manifestkubectl delete -f calico.yaml但这一步通常不够彻底还需要手动检查并删除以下资源# 删除可能遗留的CRD kubectl delete crd bgpconfigurations.crd.projectcalico.org kubectl delete crd bgppeers.crd.projectcalico.org kubectl delete crd blockaffinities.crd.projectcalico.org kubectl delete crd clusterinformations.crd.projectcalico.org kubectl delete crd felixconfigurations.crd.projectcalico.org kubectl delete crd globalnetworkpolicies.crd.projectcalico.org kubectl delete crd globalnetworksets.crd.projectcalico.org kubectl delete crd hostendpoints.crd.projectcalico.org kubectl delete crd ipamblocks.crd.projectcalico.org kubectl delete crd ipamconfigs.crd.projectcalico.org kubectl delete crd ipamhandles.crd.projectcalico.org kubectl delete crd ippools.crd.projectcalico.org kubectl delete crd kubecontrollersconfigurations.crd.projectcalico.org kubectl delete crd networkpolicies.crd.projectcalico.org kubectl delete crd networksets.crd.projectcalico.org # 删除可能遗留的ClusterRole和ClusterRoleBinding kubectl delete clusterrole calico-kube-controllers kubectl delete clusterrolebinding calico-kube-controllers kubectl delete clusterrole calico-node kubectl delete clusterrolebinding calico-node3.2 清理节点网络配置在每个节点上执行以下操作移除网络接口# 删除tunl0接口如果使用IPIP模式 ip link delete tunl0 # 卸载相关内核模块 modprobe -r ipip清理路由表# 查找并删除Calico添加的路由 ip route show | grep bird | awk {print $1} | while read route; do ip route delete $route done清理ARP表ip neigh show | grep cali | awk {print $1} | while read ip; do ip neigh delete $ip dev interface done3.3 删除CNI配置文件在每个节点上删除Calico的CNI配置文件rm -f /etc/cni/net.d/10-calico.conflist rm -f /etc/cni/net.d/calico-kubeconfig rm -f /etc/cni/net.d/calico-tls/*3.4 重启关键组件完成上述清理后需要重启相关服务# 重启kubelet systemctl restart kubelet # 删除并重建coredns Pod kubectl delete pod -n kube-system -l k8s-appkube-dns4. 验证清理结果执行完整套清理流程后使用以下命令验证检查项验证命令预期结果Calico Podkubectl get pods -n kube-system | grep calico无输出网络接口ip a | grep -E tunl0|wireguard无输出路由表ip route show | grep bird无输出CNI配置ls -la /etc/cni/net.d/无calico相关文件节点状态kubectl get nodes所有节点Ready如果发现仍有残留可以尝试以下进阶清理方法# 清理iptables规则谨慎操作 iptables-save | grep -v calico | iptables-restore ip6tables-save | grep -v calico | ip6tables-restore # 清理IPVS规则如果使用kube-proxy的IPVS模式 ipvsadm -C5. 切换到新网络插件的最佳实践在确认Calico已完全清理后部署新网络插件时建议遵循以下顺序确保所有节点上的Calico清理工作已完成部署新的CNI插件manifest观察coredns Pod状态检查节点网络状态验证跨节点Pod通信常见问题处理coredns持续Pending检查kubelet日志通常是因为CNI插件未正确初始化节点NotReady确认kubelet与容器运行时通信正常网络不通检查新插件的网络策略和路由配置在实际生产环境中我遇到过多次网络插件切换的场景。最稳妥的做法是在维护窗口期进行操作并确保有完整的回滚方案。一次成功的网络插件更换往往取决于清理工作的彻底程度这也是为什么本文强调多层次的系统化清理方法。