「Bug」K8s 节点的 IP 地址泄漏,导致 IP 被耗尽
Bug 描述
部署 Pod 后发现 Pod 无法启动,Kubernetes 报错:
Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "22ea7018a9a1389495e222cfg44e6fcda68c0ed91042c191074aa8566ee27e75" network for pod "xxxx-hwdtt": NetworkPlugin cni failed to set up pod "xxxx-hwdtt_192-168-1-158" network: failed to allocate for range 0: no IP addresses available in range set: 10.42.11.1-10.42.11.254
根据搜索到的博客,在节点上执行如下命令:
cd /var/lib/cni
ls k8d-pod-network # 使用 rke 部署的集群,IP 信息在这个文件夹里
ls 10.42.11.* | wc -l # 统计已分配的 IP 数量
上述命令输出很多的 IP 地址,使用 wc -l
统计发现 IP 数量为 253.
查看 Node 的 PodCIDR 网段:
kubectl get node <node-name> -o yaml | grep podCIDR
得到网段为 10.42.11.0/24
,IP 范围为 10.42.11.1-10.42.11.254
,共 254 个。(因为要去掉广播地址 10.42.11.255
和网段标识地址 10.42.11.0
)
该网段的默认网关还需要占用一个 IP,253+1=254,IP 耗尽。
可节点上的 Pod 一共才 96 个。这说明 Pod 删除后,IP 没有被回收。
修复方法
临时方法:删除掉 /var/lib/cni
中所有的 IP 地址,每个 IP 都是一个文件。
具体的原因分析
这个应该是 CNI 网络插件自身的 Bug。具体而言我有更换过 CNI 网络插件,没多久后就 IP 溢出了。可能更换 CNI 插件后,新插件不会管以前的 Pod IP,会尝试重新进行 IP 分配?