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