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