新聞中心
垃圾收集
垃圾收集是 Kubernetes 用于清理集群資源的各種機(jī)制的統(tǒng)稱。 垃圾收集允許系統(tǒng)清理如下資源:

成都創(chuàng)新互聯(lián)公司從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元會昌做網(wǎng)站,已為上家服務(wù),為會昌各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792
- 失敗的 Pod
- 已完成的 Job
- 不再存在屬主引用的對象
- 未使用的容器和容器鏡像
- 動態(tài)制備的、StorageClass 回收策略為 Delete 的 PV 卷
- 阻滯或者過期的 CertificateSigningRequest (CSRs)
- 在以下情形中刪除了的節(jié)點(diǎn)對象:
- 當(dāng)集群使用云控制器管理器運(yùn)行于云端時;
- 當(dāng)集群使用類似于云控制器管理器的插件運(yùn)行在本地環(huán)境中時。
- 節(jié)點(diǎn)租約對象
屬主與依賴
Kubernetes 中很多對象通過屬主引用 鏈接到彼此。屬主引用(Owner Reference)可以告訴控制面哪些對象依賴于其他對象。 Kubernetes 使用屬主引用來為控制面以及其他 API 客戶端在刪除某對象時提供一個 清理關(guān)聯(lián)資源的機(jī)會。在大多數(shù)場合,Kubernetes 都是自動管理屬主引用的。
屬主關(guān)系與某些資源所使用的的標(biāo)簽和選擇算符 不同。例如,考慮一個創(chuàng)建 ?EndpointSlice ?對象的 Service 對象。Service 對象使用標(biāo)簽來允許控制面確定哪些 ?EndpointSlice ?對象被該 Service 使用。除了標(biāo)簽,每個被 Service 托管的 ?EndpointSlice ?對象還有一個屬主引用屬性。 屬主引用可以幫助 Kubernetes 中的不同組件避免干預(yù)并非由它們控制的對象。
根據(jù)設(shè)計,系統(tǒng)不允許出現(xiàn)跨名字空間的屬主引用。名字空間作用域的依賴對象可以指定集群作用域或者名字空間作用域的屬主。 名字空間作用域的屬主必須存在于依賴對象所在的同一名字空間。 如果屬主位于不同名字空間,則屬主引用被視為不存在,而當(dāng)檢查發(fā)現(xiàn)所有屬主都已不存在時, 依賴對象會被刪除。
集群作用域的依賴對象只能指定集群作用域的屬主。 在 1.20 及更高版本中,如果一個集群作用域的依賴對象指定了某個名字空間作用域的類別作為其屬主, 則該對象被視為擁有一個無法解析的屬主引用,因而無法被垃圾收集處理。
在 1.20 及更高版本中,如果垃圾收集器檢測到非法的跨名字空間 ?
ownerReference?, 或者某集群作用域的依賴對象的 ?
ownerReference?引用某名字空間作用域的類別, 系統(tǒng)會生成一個警告事件,其原因?yàn)?nbsp;?
OwnerRefInvalidNamespace?,?
involvedObject?設(shè)置為非法的依賴對象。你可以通過運(yùn)行 ?
kubectl get events -A --field-selector=reason=OwnerRefInvalidNamespace? 來檢查是否存在這類事件。
級聯(lián)刪除
Kubernetes 會檢查并刪除那些不再擁有屬主引用的對象,例如在你刪除了 ReplicaSet 之后留下來的 Pod。當(dāng)你刪除某個對象時,你可以控制 Kubernetes 是否要通過一個稱作 級聯(lián)刪除(Cascading Deletion)的過程自動刪除該對象的依賴對象。 級聯(lián)刪除有兩種類型,分別如下:
- 前臺級聯(lián)刪除
- 后臺級聯(lián)刪除
你也可以使用 Kubernetes Finalizers 來控制垃圾收集機(jī)制如何以及何時刪除包含屬主引用的資源。
前臺級聯(lián)刪除
在前臺級聯(lián)刪除中,正在被你刪除的對象首先進(jìn)入 deletion in progress 狀態(tài)。 在這種狀態(tài)下,針對屬主對象會發(fā)生以下事情:
- Kubernetes API 服務(wù)器將對象的 ?
metadata.deletionTimestamp? 字段設(shè)置為對象被標(biāo)記為要刪除的時間點(diǎn)。 - Kubernetes API 服務(wù)器也會將 ?
metadata.finalizers? 字段設(shè)置為 ?foregroundDeletion?。 - 在刪除過程完成之前,通過 Kubernetes API 仍然可以看到該對象。
當(dāng)屬主對象進(jìn)入刪除過程中狀態(tài)后,控制器刪除其依賴對象??刂破髟趧h除完所有依賴對象之后, 刪除屬主對象。這時,通過 Kubernetes API 就無法再看到該對象。
在前臺級聯(lián)刪除過程中,唯一的可能阻止屬主對象被刪除的依賴對象是那些帶有 ?ownerReference.blockOwnerDeletion=true? 字段的對象。
后臺級聯(lián)刪除
在后臺級聯(lián)刪除過程中,Kubernetes 服務(wù)器立即刪除屬主對象,控制器在后臺清理所有依賴對象。 默認(rèn)情況下,Kubernetes 使用后臺級聯(lián)刪除方案,除非你手動設(shè)置了要使用前臺刪除, 或者選擇遺棄依賴對象。
被遺棄的依賴對象
當(dāng) Kubernetes 刪除某個屬主對象時,被留下來的依賴對象被稱作被遺棄的(Orphaned)對象。 默認(rèn)情況下,Kubernetes 會刪除依賴對象。
未使用容器和鏡像的垃圾收集
kubelet 會每五分鐘對未使用的鏡像執(zhí)行一次垃圾收集, 每分鐘對未使用的容器執(zhí)行一次垃圾收集。 你應(yīng)該避免使用外部的垃圾收集工具,因?yàn)橥獠抗ぞ呖赡軙茐?nbsp;kubelet 的行為,移除應(yīng)該保留的容器。
要配置對未使用容器和鏡像的垃圾收集選項(xiàng),可以使用一個 配置文件,基于 KubeletConfiguration 資源類型來調(diào)整與垃圾搜集相關(guān)的 kubelet 行為。
容器鏡像生命期
Kubernetes 通過其鏡像管理器(Image Manager)來管理所有鏡像的生命周期, 該管理器是 kubelet 的一部分,工作時與 cadvisor 協(xié)同。 kubelet 在作出垃圾收集決定時會考慮如下磁盤用量約束:
- ?
HighThresholdPercent? - ?
LowThresholdPercent?
磁盤用量超出所配置的 ?HighThresholdPercent ?值時會觸發(fā)垃圾收集, 垃圾收集器會基于鏡像上次被使用的時間來按順序刪除它們,首先刪除的是最老的鏡像。 kubelet 會持續(xù)刪除鏡像,直到磁盤用量到達(dá) ?LowThresholdPercent ?值為止。
容器垃圾收集
kubelet 會基于如下變量對所有未使用的容器執(zhí)行垃圾收集操作,這些變量都是你可以定義的:
- ?
MinAge?:kubelet 可以垃圾回收某個容器時該容器的最小年齡。設(shè)置為 ?0? 表示禁止使用此規(guī)則。 - ?
MaxPerPodContainer?:每個 Pod 可以包含的已死亡的容器個數(shù)上限。設(shè)置為小于 ?0? 的值表示禁止使用此規(guī)則。 - ?
MaxContainers?:集群中可以存在的已死亡的容器個數(shù)上限。設(shè)置為小于 ?0? 的值意味著禁止應(yīng)用此規(guī)則。
除以上變量之外,kubelet 還會垃圾收集除無標(biāo)識的以及已刪除的容器,通常從最老的容器開始。
當(dāng)保持每個 Pod 的最大數(shù)量的容器(?MaxPerPodContainer?)會使得全局的已死亡容器個數(shù)超出上限 (?MaxContainers?)時,?MaxPerPodContainer ?和 ?MaxContainers ?之間可能會出現(xiàn)沖突。 在這種情況下,kubelet 會調(diào)整 ?MaxPerPodContainer ?來解決這一沖突。 最壞的情形是將 ?MaxPerPodContainer ?降格為 ?1?,并驅(qū)逐最老的容器。 此外,當(dāng)隸屬于某已被刪除的 Pod 的容器的年齡超過 ?MinAge ?時,它們也會被刪除。
kubelet 僅會回收由它所管理的容器。
配置垃圾收集
你可以通過配置特定于管理資源的控制器來調(diào)整資源的垃圾收集行為。
新聞標(biāo)題:創(chuàng)新互聯(lián)kubernetes教程:Kubernetes垃圾收集
瀏覽路徑:http://www.5511xx.com/article/coopddi.html


咨詢
建站咨詢
