解决K8s网络插件冲突:彻底清理Calico/Flannel残留配置的5个关键步骤

张开发
2026/4/12 11:25:46 15 分钟阅读

分享文章

解决K8s网络插件冲突:彻底清理Calico/Flannel残留配置的5个关键步骤
解决Kubernetes网络插件冲突的深度清理指南当你在Kubernetes集群中切换网络插件时残留的配置往往成为隐形杀手。上周我接手一个生产环境集群就因为旧版Calico未清理干净导致新安装的Flannel持续报错整个集群的网络功能陷入半瘫痪状态。这种问题在混合云环境和多CNI插件测试场景中尤为常见。1. 理解网络插件冲突的根源Kubernetes网络插件通过CNIContainer Network Interface规范与集群交互但不同插件实现方式差异巨大。Calico基于BGP协议和IP-in-IP隧道而Flannel则依赖VXLAN或host-gw后端。当两者共存时它们的网络接口、路由规则和iptables链会产生致命冲突。典型症状包括Pod间通信时断时续kubectl get pods显示大量ContainerCreating状态节点网络性能骤降CNI插件日志中出现resource already exists类错误关键诊断命令ip link show | grep -E cni0|flannel|cali ip route list | grep -E flannel|calico iptables-save | grep -i calico2. 安全准备与环境隔离开始清理前必须做好这些防护措施集群状态快照kubectl get all -A -o wide cluster_snapshot.txt iptables-save iptables_backup.rules ip route save route_backup.txt关键组件隔离暂停Cluster Autoscaler设置Deployment副本数为0驱逐非关键Pod使用kubectl drain --ignore-daemonsets维护窗口通告kubectl create namespace maintenance kubectl annotate ns maintenance maintenance.window$(date %FT%T%z)注意生产环境务必在业务低峰期操作并确保有完整的回滚方案。3. 彻底卸载网络插件组件3.1 官方卸载流程执行Calico卸载kubectl delete -f https://docs.projectcalico.org/manifests/calico.yaml kubectl delete crd felixconfigurations.crd.projectcalico.org kubectl delete crd bgpconfigurations.crd.projectcalico.orgFlannel卸载kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml rm -f /etc/cni/net.d/10-flannel.conflist3.2 深度清理残留配置执行这个全面的清理脚本#!/bin/bash # 清理网络接口 ip link delete cni0 2/dev/null ip link delete flannel.1 2/dev/null ip link delete tunl0 2/dev/null # 删除CNI配置 rm -rf /etc/cni/net.d/* rm -rf /var/lib/cni/* rm -rf /var/run/calico/* # 内核模块卸载 modprobe -r ipip 2/dev/null modprobe -r vxlan 2/dev/null # 防火墙规则清理 iptables -F iptables -t nat -F iptables -t mangle -F4. 系统级残留检测与处理4.1 隐藏文件检查清单位置检查内容清理命令/var/lib/calico, flannel, cni目录rm -rf /var/lib/{calico,flannel,cni}/run/网络插件运行时文件rm -rf /run/flannel/*/opt/cni/bin旧版CNI插件二进制文件mv /opt/cni/bin /opt/cni/bin.bak4.2 内核参数复位某些网络插件会修改sysctl参数需要恢复默认值sysctl -w net.ipv4.conf.all.rp_filter1 sysctl -w net.ipv4.conf.default.rp_filter1 sysctl -w net.bridge.bridge-nf-call-iptables05. 验证与新建插件部署5.1 环境纯净度检查运行这个验证脚本确保无残留#!/bin/bash check_resources() { kubectl get crd | grep -E calico|flannel ip link show | grep -E cali|flannel ls -la /etc/cni/net.d/ } check_resources | tee cleanup_validation.log5.2 新插件安装最佳实践版本兼容性检查kubectl version --short kubeadm version -o short分阶段部署策略kubectl apply -f new-cni.yaml --dry-runserver kubectl apply -f new-cni.yaml --validatefalse健康检查方法watch -n 2 kubectl -n kube-system get pods -l k8s-appnew-cni kubectl -n kube-system logs -f cni-pod-name6. 高级故障排查技巧当标准清理流程失效时这些方法曾帮我解决过棘手问题案例1某次Calico卸载后其Felix服务仍在后台运行。解决方法pkill -f calico-felix systemctl list-units | grep calico | awk {print $1} | xargs -I{} systemctl stop {}案例2Flannel留下的VXLAN设备导致新插件无法启动。需要深度清理ip -d link show type vxlan ip link delete vxlan.calico 2/dev/null网络命名空间残留处理lsns -t net | grep -v kubelet nsenter --net/var/run/netns/bad-ns ip link delete dev cali12345

更多文章