Kubernetes Finalizers

2022-04-28 14:26 更新

Finalizers

Finalizer 是帶有命名空間的鍵,告訴 Kubernetes 等到特定的條件被滿足后, 再完全刪除被標(biāo)記為刪除的資源。 Finalizer 提醒控制器清理被刪除的對(duì)象擁有的資源。

當(dāng)你告訴 Kubernetes 刪除一個(gè)指定了 Finalizer 的對(duì)象時(shí), Kubernetes API 通過填充 ?.metadata.deletionTimestamp? 來標(biāo)記要?jiǎng)h除的對(duì)象, 并返回?202?狀態(tài)碼 (HTTP "已接受") 使其進(jìn)入只讀狀態(tài)。 此時(shí)控制平面或其他組件會(huì)采取 Finalizer 所定義的行動(dòng), 而目標(biāo)對(duì)象仍然處于終止中(Terminating)的狀態(tài)。 這些行動(dòng)完成后,控制器會(huì)刪除目標(biāo)對(duì)象相關(guān)的 Finalizer。 當(dāng) ?metadata.finalizers? 字段為空時(shí),Kubernetes 認(rèn)為刪除已完成。

你可以使用 Finalizer 控制資源的垃圾收集。 例如,你可以定義一個(gè) Finalizer,在刪除目標(biāo)資源前清理相關(guān)資源或基礎(chǔ)設(shè)施。

你可以通過使用 Finalizers 提醒控制器 在刪除目標(biāo)資源前執(zhí)行特定的清理任務(wù), 來控制資源的垃圾收集。

Finalizers 通常不指定要執(zhí)行的代碼。 相反,它們通常是特定資源上的鍵的列表,類似于注解。 Kubernetes 自動(dòng)指定了一些 Finalizers,但你也可以指定你自己的。

Finalizers 如何工作 

當(dāng)你使用清單文件創(chuàng)建資源時(shí),你可以在 ?metadata.finalizers? 字段指定 Finalizers。 當(dāng)你試圖刪除該資源時(shí),處理刪除請(qǐng)求的 API 服務(wù)器會(huì)注意到 ?finalizers? 字段中的值, 并進(jìn)行以下操作:

  • 修改對(duì)象,將你開始執(zhí)行刪除的時(shí)間添加到 ?metadata.deletionTimestamp? 字段。
  • 禁止對(duì)象被刪除,直到其 ?metadata.finalizers? 字段為空。
  • 返回 ?202? 狀態(tài)碼(HTTP "Accepted")。

管理 finalizer 的控制器注意到對(duì)象上發(fā)生的更新操作,對(duì)象的 ?metadata.deletionTimestamp? 被設(shè)置,意味著已經(jīng)請(qǐng)求刪除該對(duì)象。然后,控制器會(huì)試圖滿足資源的 Finalizers 的條件。 每當(dāng)一個(gè) Finalizer 的條件被滿足時(shí),控制器就會(huì)從資源的 ?finalizers ?字段中刪除該鍵。 當(dāng) ?finalizers ?字段為空時(shí),?deletionTimestamp ?字段被設(shè)置的對(duì)象會(huì)被自動(dòng)刪除。 你也可以使用 Finalizers 來阻止刪除未被管理的資源。

一個(gè)常見的 Finalizer 的例子是 ?kubernetes.io/pv-protection?, 它用來防止意外刪除 ?PersistentVolume ?對(duì)象。 當(dāng)一個(gè) ?PersistentVolume ?對(duì)象被 Pod 使用時(shí), Kubernetes 會(huì)添加 ?pv-protection? Finalizer。 如果你試圖刪除 ?PersistentVolume?,它將進(jìn)入 ?Terminating ?狀態(tài), 但是控制器因?yàn)樵?nbsp;Finalizer 存在而無法刪除該資源。 當(dāng) Pod 停止使用 ?PersistentVolume ?時(shí), Kubernetes 清除 ?pv-protection? Finalizer,控制器就會(huì)刪除該卷。

屬主引用、標(biāo)簽和 Finalizers

與標(biāo)簽類似, 屬主引用 描述了 Kubernetes 中對(duì)象之間的關(guān)系,但它們作用不同。 當(dāng)一個(gè)控制器 管理類似于 Pod 的對(duì)象時(shí),它使用標(biāo)簽來跟蹤相關(guān)對(duì)象組的變化。 例如,當(dāng) Job 創(chuàng)建一個(gè)或多個(gè) Pod 時(shí), Job 控制器會(huì)給這些 Pod 應(yīng)用上標(biāo)簽,并跟蹤集群中的具有相同標(biāo)簽的 Pod 的變化。

Job 控制器還為這些 Pod 添加了屬主引用,指向創(chuàng)建 Pod 的 Job。 如果你在這些 Pod 運(yùn)行的時(shí)候刪除了 Job, Kubernetes 會(huì)使用屬主引用(而不是標(biāo)簽)來確定集群中哪些 Pod 需要清理。

當(dāng) Kubernetes 識(shí)別到要?jiǎng)h除的資源上的屬主引用時(shí),它也會(huì)處理 Finalizers。

在某些情況下,F(xiàn)inalizers 會(huì)阻止依賴對(duì)象的刪除, 這可能導(dǎo)致目標(biāo)屬主對(duì)象被保留的時(shí)間比預(yù)期的長,而沒有被完全刪除。 在這些情況下,你應(yīng)該檢查目標(biāo)屬主和附屬對(duì)象上的 Finalizers 和屬主引用,來排查原因。

在對(duì)象卡在刪除狀態(tài)的情況下,要避免手動(dòng)移除 Finalizers,以允許繼續(xù)刪除操作。 Finalizers 通常因?yàn)樘厥庠虮惶砑拥劫Y源上,所以強(qiáng)行刪除它們會(huì)導(dǎo)致集群出現(xiàn)問題。 只有了解 finalizer 的用途時(shí)才能這樣做,并且應(yīng)該通過一些其他方式來完成 (例如,手動(dòng)清除其余的依賴對(duì)象)。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)