「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 分配?

相关 Issue

posted @ 2020-04-02 22:12  於清樂  阅读(1743)  评论(0编辑  收藏  举报