腾讯云 2 台 CVM 自建 K8s 1.24,CentOS 7.9,flannel 用 host-gw 模式,第二台节点的 kube-flannel 一直 CrashLoopBackOff,日志报 failed to set bridge addr: could not add IP address to cni0: file exists,节点上 cni0 已经带着 10.244.1.1。
一开始怀疑是「卸载时没有清掉 /var/lib/cni 和 /run/flannel 的状态」,查了一圈,方向不对。
把日志和配置对完,能解释这个现象的基本就这几处。节点上残留了上一次安装留下的 cni0 网桥和地址。少数情况下是flannel 的 podCIDR 与节点现有网段重复,地址已经存在。
不容易想到的是,NetworkManager 接管了 cni0,把地址又加了回去。
动手时先看网桥和地址的现状
ip -d addr show cni0 && ip route | grep 10.244
再往下停掉 kubelet 后清理残留网桥
systemctl stop kubelet && ip link delete cni0
接着清掉 CNI 的本地状态目录
rm -rf /var/lib/cni/networks/* /run/flannel/subnet.env
末了重启 kubelet 让 flannel 重新初始化
systemctl start kubelet && kubectl get pods -n kube-flannel
手上没有现成的复现脚本,就照着线上请求手工拼了一个。
别只看报错消失,验证要多做一步。cni0 重新创建且地址落在本节点 podCIDR 内,flannel Pod 全部 Running,跨节点 Pod 可以互访。
这里还有个坑。删 cni0 会短暂中断本节点所有 Pod 网络,操作前先把业务流量摘走,别在工作时间直接动。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
