由於無法分配ip而導致的FailedCreatePodSandBox

Ivan_Wz發表於2020-12-31

由於無法分配ip而導致的FailedCreatePodSandBox


一、問題現象

描述:當pod排程到某主機上時,pod無法正常啟動並顯示如下圖事件。

二、排查思路

  1. 檢視網路外掛日誌。
  2. 去主機上看/var/lib/cni/networks/default-cni-network這個目錄 發現ip已經佔滿,如下圖現象。

三、問題原因

  • 這是kubernetes的一個老問題了,與容器無法啟動/失敗時不清理容器ip有關
  • 該問題的根本原因是由於pod生命週期的PodSync迴圈處理策略與cni外掛的衝突導致的,即本應該作為GC goroutine(一個go語言的排程器,或者可以直接理解為kubelet)的一部分的cni delete沒有被呼叫而導致了IP洩露。因此該問題並非是網路外掛單方面問題,和k8s自身和docker都有所關聯。由於該問題復現較為困難,目前我們也並沒有使用calico去嘗試復現該問題,因此並不確定calico一定不會出現此問題。
  • 可以嘗試通過手動刪除IP池中沒有被使用到的IP,但這種方式並不能根本性的解決,只能保證新起pod有IP可用。如果您現在的環境無法重啟docker,可以先通過手動刪除的方式來臨時解決,等存在重啟docker的視窗期時再去重啟docker來修復。

四、解決辦法

  • 需要把/var/lib/cni/networks/default-cni-network這個目錄mv一個bak出來,然後新建一個目錄,重啟docker
  • 讓這個主機上的pod全部重新分配IP
systemctl stop docker
cp -r /var/lib/cni/network/default-cni-network/  /var/lib/cni/network/default-cni-network_bak/
cd /var/lib/cni/network/default-cni-network/ 
rm -f 10*
systemctl start docker

相關issues:
https://github.com/kubernetes/kubernetes/issues/86944
https://github.com/kubernetes/kubernetes/pull/94624

相關文章