所有者和依赖项
在 Kubernetes 中,某些 对象 是其他对象的所有者。例如,ReplicaSet 是一组 Pod 的所有者。这些被拥有的对象是其所有者的依赖项。
所有权不同于某些资源也使用的 标签和选择器 机制。例如,考虑一个创建 EndpointSlice
对象的服务。该服务使用 标签 来允许控制平面确定哪些 EndpointSlice
对象用于该服务。除了标签之外,每个代表服务管理的 EndpointSlice
都有一个所有者引用。所有者引用有助于 Kubernetes 的不同部分避免干扰它们不控制的对象。
对象规范中的所有者引用
依赖对象具有一个 metadata.ownerReferences
字段,该字段引用其所有者对象。有效的拥有者引用包含对象名称和 UID,该名称和 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,则删除不会立即发生,因为 PersistentVolume
上有 kubernetes.io/pv-protection
终结器。相反,该 卷 将保持在 Terminating
状态,直到 Kubernetes 清除终结器,这只有在 PersistentVolume
不再绑定到 Pod 后才会发生。
当您使用 前台或孤儿级联删除 时,Kubernetes 还会将终结器添加到所有者资源。在前台删除中,它会添加 foreground
终结器,以便控制器必须删除也具有 ownerReferences.blockOwnerDeletion=true
的依赖资源,然后才能删除所有者。如果您指定孤儿删除策略,Kubernetes 会添加 orphan
终结器,以便控制器在删除所有者对象后忽略依赖资源。
下一步
- 详细了解 Kubernetes 终结器。
- 了解 垃圾回收。
- 阅读 对象元数据 的 API 参考。