【K8s概念】叢集管理 -- 容器映象的垃圾收集
參考:https://kubernetes.io/zh/docs/concepts/cluster-administration/kubelet-garbage-collection/
垃圾回收是 kubelet 的一個有用功能,它將清理未使用的映象和容器。 Kubelet 將每分鐘對容器執行一次垃圾回收,每五分鐘對映象執行一次垃圾回收。
不建議使用外部垃圾收集工具,因為這些工具可能會刪除原本期望存在的容器進而破壞 kubelet 的行為。
映象回收
Kubernetes 藉助於 cadvisor 通過 imageManager 來管理所有映象的生命週期。
映象垃圾回收策略只考慮兩個因素:HighThresholdPercent 和 LowThresholdPercent。 磁碟使用率超過上限閾值(HighThresholdPercent)將觸發垃圾回收。 垃圾回收將刪除最近最少使用的映象,直到磁碟使用率滿足下限閾值(LowThresholdPercent)。
容器回收
容器垃圾回收策略考慮三個使用者定義變數。 MinAge 是容器可以被執行垃圾回收的最小生命週期。 MaxPerPodContainer 是每個 pod 內允許存在的死亡容器的最大數量。 MaxContainers 是全部死亡容器的最大數量。 可以分別獨立地通過將 MinAge 設定為 0,以及將 MaxPerPodContainer 和 MaxContainers 設定為小於 0 來禁用這些變數。
kubelet 將處理無法辨識的、已刪除的以及超出前面提到的引數所設定範圍的容器。 最老的容器通常會先被移除。 MaxPerPodContainer 和 MaxContainer 在某些場景下可能會存在衝突, 例如在保證每個 pod 內死亡容器的最大數量(MaxPerPodContainer)的條件下可能會超過 允許存在的全部死亡容器的最大數量(MaxContainer)。 MaxPerPodContainer 在這種情況下會被進行調整: 最壞的情況是將 MaxPerPodContainer 降級為 1,並驅逐最老的容器。 此外,pod 內已經被刪除的容器一旦年齡超過 MinAge 就會被清理。
不被 kubelet 管理的容器不受容器垃圾回收的約束。
使用者配置
使用者可以使用以下 kubelet 引數調整相關閾值來優化映象垃圾回收:
1. image-gc-high-threshold,觸發映象垃圾回收的磁碟使用率百分比。預設值為 85%。
2. image-gc-low-threshold,映象垃圾回收試圖釋放資源後達到的磁碟使用率百分比。預設值為 80%。
我們還允許使用者通過以下 kubelet 引數自定義垃圾收集策略:
1. minimum-container-ttl-duration,完成的容器在被垃圾回收之前的最小年齡,預設是 0 分鐘。 這意味著每個完成的容器都會被執行垃圾回收。 2. maximum-dead-containers-per-container,每個容器要保留的舊例項的最大數量。預設值為 1。 3. maximum-dead-containers,要全域性保留的舊容器例項的最大數量。 預設值是 -1,意味著沒有全侷限制。
容器可能會在其效用過期之前被垃圾回收。這些容器可能包含日誌和其他對故障診斷有用的資料。 強烈建議為 maximum-dead-containers-per-container 設定一個足夠大的值,以便每個預期容器至少保留一個死亡容器。 由於同樣的原因,maximum-dead-containers 也建議使用一個足夠大的值。
查閱這個 Issue 獲取更多細節。
棄用
這篇文件中的一些 kubelet 垃圾收集(Garbage Collection)功能將在未來被 kubelet 驅逐回收(eviction)所替代。
包括: