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


咨詢
建站咨詢
