所有者和依赖项
在 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 准入控制器根据所有者的删除权限控制用户更改依赖资源的此字段的权限。这种控制可以防止未经授权的用户延迟所有者对象的删除。
说明
出于设计原因,不允许跨命名空间的所有者引用。命名空间依赖项可以指定集群范围或命名空间范围的所有者。命名空间所有者 必须 存在于与依赖项相同的命名空间中。如果不是,则将所有者引用视为不存在,并且一旦验证所有所有者都已不存在,依赖项将被删除。
集群范围的依赖项只能指定集群范围的所有者。在 v1.20+ 中,如果集群范围的依赖项将命名空间种类指定为所有者,则将其视为具有无法解析的所有者引用,并且无法进行垃圾回收。
在 v1.20+ 中,如果垃圾回收器检测到无效的跨命名空间 ownerReference,或者集群范围的依赖项引用了命名空间种类作为所有者,则会报告一个带有原因 OwnerRefInvalidNamespace 和 involvedObject 为无效依赖项的警告事件。您可以通过运行 kubectl get events -A --field-selector=reason=OwnerRefInvalidNamespace 来检查此类事件。
所有权和终结器
当您告诉 Kubernetes 删除资源时,API 服务器允许管理控制器处理资源的任何 终结器规则。 终结器 可以防止意外删除集群可能仍然需要才能正常运行的资源。例如,如果您尝试删除仍然被 Pod 使用的 PersistentVolume,则删除不会立即发生,因为 PersistentVolume 上有 kubernetes.io/pv-protection 终结器。相反,该 卷 仍处于 Terminating 状态,直到 Kubernetes 清除终结器,这仅在 PersistentVolume 不再绑定到 Pod 后才会发生。
当您使用 前向或孤立级联删除 时,Kubernetes 也会将终结器添加到所有者资源。在前向删除中,它添加了 foreground 终结器,以便控制器必须删除也具有 ownerReferences.blockOwnerDeletion=true 的依赖资源,然后才能删除所有者。如果您指定孤立删除策略,Kubernetes 会添加 orphan 终结器,以便控制器在删除所有者对象后忽略依赖资源。
接下来
- 了解更多关于 Kubernetes 终结器 的信息。
- 了解关于 垃圾回收 的信息。
- 阅读 对象元数据 的 API 参考。