所有者和依赖项

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

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

对象规范中的所有者引用

依赖对象具有一个 metadata.ownerReferences 字段,该字段引用其所有者对象。有效的拥有者引用包括对象名称和相同的 UID 以及依赖对象所在的 命名空间。Kubernetes 会自动为 ReplicaSet、DaemonSet、Deployment、Job 和 CronJob 以及 ReplicationController 等对象的依赖对象设置此字段的值。您也可以通过更改此字段的值手动配置这些关系。但是,通常不需要这样做,并且可以允许 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)