擁有者與依賴物件
在 Kubernetes 中,某些 物件 是其他物件的擁有者。 例如,ReplicaSet 是一組 Pod 的擁有者。 這些擁有的物件是其擁有者的從屬。
所有權與某些資源也使用的 標籤和選擇器 機制不同。 例如,考慮建立 EndpointSlice
物件的服務。 服務使用 標籤,讓控制平面能夠判斷哪些 EndpointSlice
物件用於該服務。 除了標籤之外,每個代表服務管理的 EndpointSlice
都有一個擁有者參考。 擁有者參考有助於 Kubernetes 的不同部分避免干擾它們不控制的物件。
物件規格中的擁有者參考
從屬物件會有一個 metadata.ownerReferences
欄位,參考到它們的擁有者物件。一個有效的擁有者參考包含物件名稱以及一個 UID,該 UID 必須與從屬物件在同一個命名空間 內。Kubernetes 會自動為其他物件的從屬物件設定此欄位的值,例如 ReplicaSets、DaemonSets、Deployments、Jobs、CronJobs 和 ReplicationControllers。您也可以透過變更此欄位的值來手動設定這些關係。然而,您通常不需要這樣做,可以讓 Kubernetes 自動管理這些關係。
從屬物件也有一個 ownerReferences.blockOwnerDeletion
欄位,該欄位接受布林值,並控制特定的從屬物件是否可以阻止垃圾收集刪除它們的擁有者物件。如果控制器(例如,Deployment 控制器)設定了 metadata.ownerReferences
欄位的值,Kubernetes 會自動將此欄位設定為 true
。您也可以手動設定 blockOwnerDeletion
欄位的值,以控制哪些從屬物件阻止垃圾收集。
Kubernetes 許可控制器根據擁有者的刪除權限,控制使用者變更從屬資源的這個欄位的存取權限。此控制機制可防止未經授權的使用者延遲擁有者物件的刪除。
注意
跨命名空間的擁有者參考在設計上是不允許的。命名空間作用域的從屬物件可以指定叢集作用域或命名空間作用域的擁有者。命名空間作用域的擁有者必須與從屬物件存在於同一個命名空間中。如果不是,則擁有者參考將被視為不存在,並且一旦所有擁有者都被驗證為不存在,從屬物件將會被刪除。
叢集作用域的從屬物件只能指定叢集作用域的擁有者。在 v1.20+ 版本中,如果叢集作用域的從屬物件指定命名空間作用域的種類作為擁有者,則會被視為具有無法解析的擁有者參考,並且無法被垃圾收集。
在 v1.20+ 版本中,如果垃圾收集器偵測到無效的跨命名空間 ownerReference
,或叢集作用域的從屬物件的 ownerReference
參考了命名空間作用域的種類,則會報告一個警告 Event,其原因為 OwnerRefInvalidNamespace
,且 involvedObject
為無效的從屬物件。您可以執行 kubectl get events -A --field-selector=reason=OwnerRefInvalidNamespace
來檢查這種類型的 Event。
所有權與 Finalizers
當您告訴 Kubernetes 刪除資源時,API 伺服器允許管理控制器處理該資源的任何 finalizer 規則。Finalizers 可以防止意外刪除您的叢集可能仍然需要正常運作的資源。例如,如果您嘗試刪除仍然被 Pod 使用的 PersistentVolume,則刪除不會立即發生,因為 PersistentVolume
上有 kubernetes.io/pv-protection
finalizer。相反地,volume 會保持在 Terminating
狀態,直到 Kubernetes 清除 finalizer 為止,而這只會在 `PersistentVolume` 不再綁定到 Pod 之後才會發生。
當您使用前景或孤立級聯刪除時,Kubernetes 也會將 finalizer 新增到擁有者資源。在前景刪除中,它會新增 foreground
finalizer,以便控制器在刪除擁有者之前,必須先刪除也具有 ownerReferences.blockOwnerDeletion=true
的從屬資源。如果您指定孤立刪除策略,Kubernetes 會新增 orphan
finalizer,以便控制器在刪除擁有者物件後忽略從屬資源。
下一步
- 進一步瞭解 Kubernetes finalizers。
- 瞭解關於 垃圾收集。
- 閱讀 物件 metadata 的 API 參考文件。