所有者和依赖项

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

所有权和终结器

当您告诉 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)