所有者与依赖项
在 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 准入控制器根据所有者的删除权限控制用户对依赖资源更改此字段的访问。 此控制可防止未经授权的用户延迟所有者对象的删除。
注意
跨命名空间的所有者引用在设计上是不允许的。 命名空间范围的依赖项可以指定集群范围或命名空间范围的所有者。 命名空间范围的所有者**必须**与依赖项存在于同一命名空间中。 如果不存在,则所有者引用被视为不存在,并且一旦所有所有者都经过验证不存在,则依赖项将被删除。
集群范围的依赖项只能指定集群范围的所有者。 在 v1.20+ 中,如果集群范围的依赖项指定命名空间类型作为所有者,则将其视为具有无法解析的所有者引用,并且无法进行垃圾回收。
在 v1.20+ 中,如果垃圾回收器检测到无效的跨命名空间 ownerReference
,或者具有引用命名空间类型的 ownerReference
的集群范围的依赖项,则会报告一个 Reason 为 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 参考。