運維應如何配置Kubernetes的垃圾回收
垃圾回收是指清理 Kubernetes 集群資源的機制,這對于集群的運行狀況非常重要。垃圾回收可以清理資源,例如終止的 Pod、已完成的作業、未使用的容器等。
垃圾回收可維護 Kubernetes 集群的運行狀況。管理員首先要確定他們應使用默認的自動清理,還是手動配置垃圾回收。
垃圾回收配置
有幾種配置可以幫助組織獲得對垃圾回收的控制權。
例如,一個部署擁有一個 ReplicaSet,該 ReplicaSet 擁有該 ReplicaSet 中的 Pod。因此,當 admin 或 K8s 之外的其他工具刪除部署時,ReplicaSet 和 pod 也會通過引用刪除。
可以通過將metadata.blockOwnerDeletion字段設置為 true 來更改此行為。如果設置為 true,則在刪除父資源后,資源將保持不變。
鏡像
默認情況下,在每個節點上運行的 kubelet 每兩分鐘刪除一次未使用的鏡像。要配置此設置,請使用 kubelet 配置文件并為imageMinimumGCAge字段提供持續時間值。
為了觸發圖像垃圾回收,kubelet 會考慮磁盤使用情況。使用兩個可配置字段 HighThresholdPercent 和 LowThresholdPercent,根據上次使用圖像的時間刪除圖像。當磁盤空間達到 HighThresholdPercent 中設置的值時,kublet 將從最早的圖像開始。在達到 LowThresholdPercent 中設置的值之前,kubelet 將繼續刪除圖片。
容器
未使用的容器每五分鐘清理一次。通過使用標志 --maximum-dead-containers-per-container和containers--minimum-container-ttl-duration 來控制清理的特定行為。
--maximum-dead-containers-per-container全局設置在垃圾回收移除或刪除已停止的容器之前要保留的最大容器數。在 kubelet 啟動時,默認情況下將其設置為 -1,或者管理員可以手動設置它。這意味著在觸發垃圾回收之前,集群上允許的已停止容器數量沒有限制。
containers--minimum-container-ttl-duration設置每個容器要保留的舊容器實例數。此值的默認值設置為 1。控制容器垃圾回收前的持續時間。此值設置為 0,表示默認情況下此設置處于禁用狀態。
Kubernetes 作業
Kubernetes 作業完成后,除非默認情況下觸發了其他垃圾回收條件,否則已完成的作業和 pod 將保持不變。例如,如果觸發了 kube-controller-manager 的 terminated-pod-gc-threshold 設置,則在垃圾回收開始刪除 Pod 之前,終止的 Pod 數量有限。在大多數情況下,終止的 Pod 將保留一段時間,因為默認值設置為 12,500 個 Pod。
設置作業的字段以控制此行為。此字段確定在作業完成后經過多少秒,然后 TTL 控制器才會刪除該作業。建議使用此字段,因為替代項是 的默認刪除策略。使用 ,作業完成后,由 Jobs 啟動的 pod 將被孤立。如果建立多個孤立的 Pod,這可能會導致性能下降。設置一個值以確保 Pod 在作業完成后刪除。
終結器
要向 Kubernetes 指示在資源刪除之前要執行特定操作,請使用清單文件創建一個資源并設置metadata.finalizers字段。
終結器類似于注釋。真正的魔力在于管理終結器的控制器。例如,在使用 PersistentVolume 時,通常使用kubernetes.io/pv-protection 的終結器。這樣可以防止 PersistentVolume 被管理員刪除,或者可以防止在刪除終結器之前刪除 pod 的自動化進程。如果 Pod 正在使用被刪除的 PersistentVolume,則資源會被標記為 Terminating,但在刪除終結器鍵之前無法刪除。持久卷控制器只會在 Pod 停止使用 PersistentVolume 時清除終結器,這讓控制器可以刪除 PersistentVolume。