Finalizers

Finalizers 是命名空間的鍵,告訴 Kubernetes 在完全刪除標記為刪除的資源之前,要等到滿足特定條件。 Finalizers 提醒控制器清理已刪除物件所擁有的資源。

當您告訴 Kubernetes 刪除具有指定 Finalizers 的物件時,Kubernetes API 會透過填入 .metadata.deletionTimestamp 將物件標記為刪除,並傳回 202 狀態代碼 (HTTP "已接受")。 在控制平面或其他組件執行 Finalizers 定義的動作時,目標物件會保持在終止狀態。 在這些動作完成後,控制器會從目標物件移除相關的 Finalizers。 當 metadata.finalizers 欄位為空時,Kubernetes 會將刪除視為完成並刪除物件。

您可以使用 Finalizers 來控制資源的垃圾收集。 例如,您可以定義 Finalizer 以在控制器刪除目標資源之前,清理相關的資源或基礎架構。

您可以使用 Finalizers 來控制垃圾收集物件,方法是提醒控制器在刪除目標資源之前執行特定的清理任務。

Finalizers 通常不會指定要執行的程式碼。 相反地,它們通常是特定資源上類似於註解的鍵清單。 Kubernetes 會自動指定一些 Finalizers,但您也可以指定自己的 Finalizers。

Finalizers 的運作方式

當您使用 Manifest 檔案建立資源時,可以在 metadata.finalizers 欄位中指定 Finalizers。 當您嘗試刪除資源時,處理刪除請求的 API 伺服器會注意到 finalizers 欄位中的值,並執行以下操作:

  • 修改物件以新增 metadata.deletionTimestamp 欄位,其中包含您開始刪除的時間。
  • 防止物件被移除,直到其 metadata.finalizers 欄位中的所有項目都被移除為止
  • 傳回 202 狀態碼 (HTTP "Accepted")

管理該 finalizer 的控制器會注意到物件更新,設定了 metadata.deletionTimestamp,表示已請求刪除物件。然後,控制器會嘗試滿足為該資源指定的 finalizer 的需求。每次滿足 finalizer 條件時,控制器都會從資源的 finalizers 欄位中移除該鍵。當 finalizers 欄位清空時,設定了 deletionTimestamp 欄位的物件會自動刪除。您也可以使用 finalizer 來防止刪除未受管理的資源。

finalizer 的常見範例是 kubernetes.io/pv-protection,它可以防止意外刪除 PersistentVolume 物件。當 PersistentVolume 物件正在被 Pod 使用時,Kubernetes 會新增 pv-protection finalizer。如果您嘗試刪除 PersistentVolume,它會進入 Terminating 狀態,但由於 finalizer 存在,控制器無法刪除它。當 Pod 停止使用 PersistentVolume 時,Kubernetes 會清除 pv-protection finalizer,而控制器會刪除該 Volume。

Owner references、標籤 (labels) 和 finalizer

就像標籤 (labels) 一樣,Owner references 描述 Kubernetes 中物件之間的關係,但用於不同的目的。當控制器 (controller) 管理 Pod 等物件時,它會使用標籤 (labels) 來追蹤相關物件群組的變更。例如,當 Job 建立一個或多個 Pod 時,Job 控制器會將標籤 (labels) 應用於這些 Pod,並追蹤叢集中具有相同標籤 (label) 的任何 Pod 的變更。

Job 控制器也會將 *Owner references* 新增至這些 Pod,指向建立 Pod 的 Job。如果您在這些 Pod 執行時刪除 Job,Kubernetes 會使用 Owner references (而非標籤 (labels)) 來判斷叢集中哪些 Pod 需要清理。

當 Kubernetes 識別出目標為刪除資源的 Owner references 時,它也會處理 finalizer。

在某些情況下,finalizer 會阻止刪除依賴物件,這可能會導致目標 Owner 物件在未完全刪除的情況下保留比預期更長的時間。在這些情況下,您應該檢查目標 Owner 物件和依賴物件上的 finalizer 和 Owner references,以找出原因。

接下來

上次修改時間:2023 年 8 月 14 日上午 11:26 PST:Updating Finalizers information (5f8e3d7e2c)