所有者和從屬
在 Kubernetes 中,一些物件是其他物件的“所有者”(owner)。例如,一個ReplicaSet 是一組 Pod 的所有者。這些被擁有的物件是其所有者的“從屬”(dependent)。
所有權不同於某些資源也使用的標籤和選擇器機制。例如,考慮一個建立 EndpointSlice
物件的 Service。Service 使用標籤來允許控制平面確定哪些 EndpointSlice
物件用於該 Service。除了標籤之外,每個代表 Service 管理的 EndpointSlice
都有一個所有者引用。所有者引用有助於 Kubernetes 的不同部分避免干擾它們不控制的物件。
物件規範中的所有者引用
從屬物件有一個 metadata.ownerReferences
欄位,它引用了其所有者物件。一個有效的所有者引用包括物件名稱和與從屬物件在同一名稱空間中的UID。Kubernetes 會自動為 ReplicaSets、DaemonSets、Deployments、Jobs、CronJobs 和 ReplicationControllers 等其他物件的從屬物件設定此欄位的值。你也可以透過手動更改此欄位的值來配置這些關係。但是,通常你不需要這樣做,可以允許 Kubernetes 自動管理這些關係。
從屬物件還有一個 ownerReferences.blockOwnerDeletion
欄位,它接受一個布林值,並控制特定的從屬是否可以阻止垃圾回收刪除其所有者物件。如果控制器(例如,Deployment 控制器)設定 metadata.ownerReferences
欄位的值,Kubernetes 會自動將此欄位設定為 true
。你也可以手動設定 blockOwnerDeletion
欄位的值來控制哪些從屬阻止垃圾回收。
Kubernetes 准入控制器根據所有者的刪除許可權控制使用者更改從屬資源此欄位的訪問許可權。此控制可防止未經授權的使用者延遲所有者物件的刪除。
注意
跨名稱空間所有者引用是故意不允許的。名稱空間的從屬可以指定叢集作用域或名稱空間的所有者。名稱空間的所有者**必須**與從屬位於同一個名稱空間中。如果不是,則所有者引用被視為不存在,一旦所有所有者都被驗證不存在,從屬將受到刪除的影響。
叢集作用域的從屬只能指定叢集作用域的所有者。在 v1.20+ 中,如果叢集作用域的從屬指定名稱空間型別作為所有者,則它被視為具有無法解析的所有者引用,並且無法被垃圾回收。
在 v1.20+ 中,如果垃圾收集器檢測到無效的跨名稱空間 ownerReference
,或者叢集作用域的從屬引用了名稱空間型別的所有者,則會報告一個警告事件,其原因為 OwnerRefInvalidNamespace
,並且 involvedObject
為無效從屬。你可以透過執行 kubectl get events -A --field-selector=reason=OwnerRefInvalidNamespace
來檢查此類事件。
所有權和終結器
當你告訴 Kubernetes 刪除一個資源時,API 伺服器允許管理控制器處理該資源的任何終結器規則。終結器可以防止你的叢集可能仍然需要正常執行的資源被意外刪除。例如,如果你嘗試刪除一個 Pod 仍在使用的PersistentVolume,刪除不會立即發生,因為該 PersistentVolume
上有 kubernetes.io/pv-protection
終結器。相反,卷會保持在 Terminating
狀態,直到 Kubernetes 清除終結器,這隻會在 PersistentVolume
不再繫結到 Pod 之後發生。
當你使用前臺或孤兒級聯刪除時,Kubernetes 還會為所有者資源新增終結器。在前臺刪除中,它會新增 foreground
終結器,以便控制器必須先刪除也具有 ownerReferences.blockOwnerDeletion=true
的從屬資源,然後才能刪除所有者。如果你指定孤兒刪除策略,Kubernetes 會新增 orphan
終結器,以便控制器在刪除所有者物件後忽略從屬資源。
下一步
- 瞭解更多關於Kubernetes 終結器。
- 瞭解垃圾回收。
- 閱讀物件元資料的 API 參考。