所有者和依赖项

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

所有权与某些资源也使用的标签和选择器机制不同。例如,考虑一个创建 EndpointSlice 对象的服务。该服务使用标签 来允许控制平面确定哪些 EndpointSlice 对象用于该服务。除了标签之外,每个代表服务管理的 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 上有 kubernetes.io/pv-protection 终结器。相反,该 将保持在 Terminating 状态,直到 Kubernetes 清除终结器,而这只有在 PersistentVolume 不再绑定到 Pod 后才会发生。

当您使用前台或孤儿级联删除时,Kubernetes 还会向所有者资源添加终结器。在前台删除中,它会添加 foreground 终结器,以便控制器必须在删除所有者之前删除同样具有 ownerReferences.blockOwnerDeletion=true 的依赖项资源。如果您指定了孤儿删除策略,则 Kubernetes 会添加 orphan 终结器,以便控制器在删除所有者对象后忽略依赖项资源。

下一步

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