2017-12-18 148 views
0

我的k8s羣集的節點嘗試刪除容器使用的圖像。Kubernetes&垃圾收集器:試圖刪除使用的圖像

這種行爲對我來說似乎很陌生。

這裏的日誌:

kubelet: I1218 12:44:19.925831 11177 image_gc_manager.go:334] [imageGCManager]: Removing image "sha256:99e59f495ffaa222bfeb67580213e8c28c1e885f1d245ab2bbe3b1b1ec3bd0b2" to free 746888 bytes 
kubelet: E1218 12:44:19.928742 11177 remote_image.go:130] RemoveImage "sha256:99e59f495ffaa222bfeb67580213e8c28c1e885f1d245ab2bbe3b1b1ec3bd0b2" from image service failed: rpc error: code = Unknown desc = Error response from daemon: conflict: unable to delete 99e59f495ffa (cannot be forced) - image is being used by running container 6f236a385a8e 
kubelet: E1218 12:44:19.928793 11177 kuberuntime_image.go:126] Remove image "sha256:99e59f495ffaa222bfeb67580213e8c28c1e885f1d245ab2bbe3b1b1ec3bd0b2" failed: rpc error: code = Unknown desc = Error response from daemon: conflict: unable to delete 99e59f495ffa (cannot be forced) - image is being used by running container 6f236a385a8e 
kubelet: W1218 12:44:19.928821 11177 eviction_manager.go:435] eviction manager: unexpected error when attempting to reduce nodefs pressure: wanted to free 9223372036854775807 bytes, but freed 0 bytes space with errors in image deletion: rpc error: code = Unknown desc = Error response from daemon: conflict: unable to delete 99e59f495ffa (cannot be forced) - image is being used by running container 6f236a385a8e 

有什麼建議? 手動刪除Docker鏡像並在節點上停止容器會導致此類問題?

預先感謝您。

回答

1

據我所知,Kubelet有一個垃圾收集器,目的是爲了利用資源去除不必要的k8s對象。

如果對象不屬於任何所有者,則表示它是孤兒。 Kubernetes中有一種模式,在kubernetes中被稱爲所有權。

對於實例,如果應用部署對象,那麼它將創建一個replicaSet對象,進一步ResplicaSet將創建pods對象。

所以,所有權流

部署< == RepicaSet < ===波德

現在,如果你刪除部署對象,這意味着ReplicaSet沒有所有者,然後垃圾收集器會嘗試刪除ReplicaSet現在莢沒有擁有者,因此,GC會嘗試刪除豆莢。

有一個名爲ownerReferences其描述了在所有這些對象諸如部署,ReplicaSet,豆莢等的關係字段

有3種方法中Kubernetes刪除對象。

  • 前景:如果您嘗試刪除部署,那麼在部署將被刪除後,將刪除第一個窗格,然後複製窗格。
  • 背景:如果您嘗試刪除部署,則第一次部署將被刪除現在,GC將刪除複製品和Pod。
  • 孤兒:如果刪除部署,則Repicaset將成爲孤兒,GC將刪除所有這些孤兒對象。

解決您的問題

在我看來,你的POD(容器)是孤立的,因此,GC是確保它是從集羣中移除。

如果你想檢查ownerRererences狀態:

kubectl get pod $PODNAME -o yaml 

在元數據部分,將有足夠的信息。

我已附上進一步研究的參考資料。

garbage-collection

garbage-collection-k8s

1

您所遇到的不是普通Kubernetes垃圾回收已刪除的孤立的API資源對象,但kubelet's Image collection

每當節點經歷磁盤壓力,Kubelet守護程序將拼命嘗試通過刪除(據推測)未使用的映像來回收磁盤空間。閱讀source code表明,Kubelet將圖像從上次用於創建Pod之後的時間進行排序 - 如果所有圖像都在使用,Kubelet會嘗試將其刪除並失敗(這可能是發生了什麼事情給你)。

您可以使用Kubelet的--minimum-image-ttl-duration標誌來指定圖像在Kubelet嘗試將其刪除之前需要具備的最小年齡(儘管這不會阻止Kubelet嘗試去除所使用的圖像)。或者,查看您是否可以爲節點提供更多磁盤空間用於映像(或構建較小的映像)。