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