所有者和从属

在 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 准入控制器根据所有者的删除权限控制用户更改从属资源此字段的访问权限。此控制可防止未经授权的用户延迟所有者对象的删除。

所有权和终结器

当你告诉 Kubernetes 删除一个资源时,API 服务器允许管理控制器处理该资源的任何终结器规则终结器可以防止你的集群可能仍然需要正常运行的资源被意外删除。例如,如果你尝试删除一个 Pod 仍在使用的PersistentVolume,删除不会立即发生,因为该 PersistentVolume 上有 kubernetes.io/pv-protection 终结器。相反,会保持在 Terminating 状态,直到 Kubernetes 清除终结器,这只会在 PersistentVolume 不再绑定到 Pod 之后发生。

当你使用前台或孤儿级联删除时,Kubernetes 还会为所有者资源添加终结器。在前台删除中,它会添加 foreground 终结器,以便控制器必须先删除也具有 ownerReferences.blockOwnerDeletion=true 的从属资源,然后才能删除所有者。如果你指定孤儿删除策略,Kubernetes 会添加 orphan 终结器,以便控制器在删除所有者对象后忽略从属资源。

下一步

上次修改时间:2022 年 1 月 8 日下午 6:09 PST:重新组织“使用 Kubernetes 对象”部分 (634c17f61c)