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。
註記
當您
DELETE
物件時,Kubernetes 會為該物件新增刪除時間戳記,然後立即開始限制對目前正在等待刪除的物件的 `.metadata.finalizers` 欄位進行變更。您可以移除現有的 finalizer (從finalizers
列表中刪除項目),但您無法新增新的 finalizer。一旦設定了物件的deletionTimestamp
,您也無法修改它。在請求刪除後,您無法恢復此物件。唯一的方法是將其刪除並建立一個新的類似物件。
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,以找出原因。
註記
如果物件卡在刪除狀態,請避免手動移除 finalizer 以允許繼續刪除。finalizer 通常是基於某種原因新增到資源的,因此強行移除它們可能會導致叢集出現問題。只有在理解 finalizer 的目的,並以其他方式完成 (例如,手動清理某些依賴物件) 時,才應這樣做。接下來
- 閱讀 Kubernetes 部落格上的 Using Finalizers to Control Deletion。