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 manifest:
kubectl 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> done
3.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-app=kube-dns4. 验证清理结果
执行完整套清理流程后,使用以下命令验证:
| 检查项 | 验证命令 | 预期结果 |
|---|---|---|
| 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/ | 无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与容器运行时通信正常
- 网络不通:检查新插件的网络策略和路由配置
在实际生产环境中,我遇到过多次网络插件切换的场景。最稳妥的做法是在维护窗口期进行操作,并确保有完整的回滚方案。一次成功的网络插件更换往往取决于清理工作的彻底程度,这也是为什么本文强调多层次的系统化清理方法。