所有者与依赖项

在 Kubernetes 中,一些对象是其他对象的所有者。 例如,ReplicaSet是一组 Pod 的所有者。 这些被拥有的对象是其所有者的依赖项

所有权与一些资源也使用的标签和选择器机制不同。 例如,考虑创建一个 EndpointSlice 对象的 Service。 Service 使用标签,使控制平面可以确定哪些 EndpointSlice 对象用于该 Service。 除了标签之外,每个代表 Service 管理的 EndpointSlice 都有一个所有者引用。 所有者引用帮助 Kubernetes 的不同部分避免干扰它们不控制的对象。

对象规范中的所有者引用

依赖对象具有一个 metadata.ownerReferences 字段,该字段引用其所有者对象。 有效的所有者引用由对象名称和与依赖对象位于同一命名空间中的UID组成。 对于作为其他对象(如 ReplicaSet、DaemonSet、Deployment、Job 和 CronJob 以及 ReplicationController)的依赖项的对象,Kubernetes 会自动设置此字段的值。 你还可以通过更改此字段的值来手动配置这些关系。 但是,你通常不需要这样做,并且可以允许 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)