腾讯云 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 网络,操作前先把业务流量摘走,别在工作时间直接动。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189