終結器
Finalizer(終結器)是名稱空間鍵,它告訴 Kubernetes 在完全刪除標記為刪除的資源之前,需要等待滿足特定條件。Finalizer 會通知控制器清理被刪除物件所擁有的資源。
當你告訴 Kubernetes 刪除一個已指定 finalizer 的物件時,Kubernetes API 透過填充 `.`metadata.deletionTimestamp` 將該物件標記為待刪除,並返回 `202` 狀態碼(HTTP "Accepted")。目標物件在終止狀態中保持,而控制平面或其他元件則執行 finalizer 定義的操作。在這些操作完成後,控制器會從目標物件中移除相關的 finalizer。當 `metadata.finalizers` 欄位為空時,Kubernetes 認為刪除完成並刪除該物件。
你可以使用 finalizer 來控制資源的垃圾收集。例如,你可以定義一個 finalizer,以便在控制器刪除被終結的物件之前清理相關的API 資源或基礎設施。
你可以使用 finalizer 透過通知控制器在刪除目標資源之前執行特定的清理任務來控制垃圾收集物件。
Finalizer 通常不指定要執行的程式碼。相反,它們通常是特定資源上的鍵列表,類似於註解。Kubernetes 會自動指定一些 finalizer,但你也可以指定自己的 finalizer。
Finalizer 的工作原理
使用清單檔案建立資源時,可以在 `metadata.finalizers` 欄位中指定 finalizer。當您嘗試刪除資源時,處理刪除請求的 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,然後控制器會刪除該卷。
注意
當你 `DELETE` 一個物件時,Kubernetes 會為該物件新增刪除時間戳,然後立即開始限制對現在處於待刪除狀態的物件的 `.metadata.finalizers` 欄位的更改。你可以刪除現有的 finalizer(從 `finalizers` 列表中刪除一個條目),但不能新增新的 finalizer。一旦設定,你也不能修改物件的 `deletionTimestamp`。
請求刪除後,該物件無法恢復。唯一的方法是將其刪除並建立新的類似物件。
注意
自定義 finalizer 名稱**必須**是公共合格的 finalizer 名稱,例如 `example.com/finalizer-name`。Kubernetes 強制執行此格式;API 伺服器會拒絕寫入那些更改未對任何自定義 finalizer 使用合格 finalizer 名稱的物件。所有者引用、標籤和終結器
與標籤類似,所有者引用描述了 Kubernetes 中物件之間的關係,但用於不同的目的。當控制器管理 Pod 等物件時,它使用標籤來跟蹤相關物件組的變化。例如,當Job建立一個或多個 Pod 時,Job 控制器會將標籤應用於這些 Pod,並跟蹤叢集中具有相同標籤的任何 Pod 的變化。
Job 控制器還會將**所有者引用**新增到這些 Pod,指向建立這些 Pod 的 Job。如果你在這些 Pod 執行時刪除 Job,Kubernetes 會使用所有者引用(而不是標籤)來確定叢集中需要清理的 Pod。
當 Kubernetes 識別出目標刪除資源上的所有者引用時,它還會處理終結器。
在某些情況下,終結器可能會阻止從屬物件的刪除,這可能導致目標所有者物件停留的時間比預期更長而未被完全刪除。在這種情況下,您應該檢查目標所有者和從屬物件上的終結器和所有者引用,以排除故障。
注意
在物件卡在刪除狀態的情況下,請避免手動刪除終結器以允許刪除繼續。終結器通常出於某種原因被新增到資源中,因此強制刪除它們可能會導致叢集出現問題。只有在理解終結器目的並透過其他方式(例如,手動清理某些從屬物件)完成時,才應執行此操作。下一步
- 請閱讀 Kubernetes 部落格上的使用 Finalizer 控制刪除。