[zh] concept of owners and dependents (#30325)
* [zh] concept of owners and dependents * update shell example * Update owners-dependents.md
This commit is contained in:
@@ -0,0 +1,169 @@
|
||||
---
|
||||
title: 属主与附属
|
||||
content_type: concept
|
||||
weight: 60
|
||||
---
|
||||
<!--
|
||||
title: Owners and Dependents
|
||||
content_type: concept
|
||||
weight: 60
|
||||
-->
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
|
||||
<!--
|
||||
In Kubernetes, some objects are *owners* of other objects. For example, a
|
||||
{{<glossary_tooltip text="ReplicaSet" term_id="replica-set">}} is the owner of a set of Pods. These owned objects are *dependents*
|
||||
of their owner.
|
||||
-->
|
||||
|
||||
在 Kubernetes 中,一些对象是其他对象的*属主(Owner)*。
|
||||
例如,{{<glossary_tooltip text="ReplicaSet" term_id="replica-set">}} 是一组 Pod 的属主。
|
||||
具有属主的对象是属主的*附属(Dependent)* 。
|
||||
|
||||
<!--
|
||||
Ownership is different from the [labels and selectors](/docs/concepts/overview/working-with-objects/labels/)
|
||||
mechanism that some resources also use. For example, consider a Service that
|
||||
creates `EndpointSlice` objects. The Service uses labels to allow the control plane to
|
||||
determine which `EndpointSlice` objects are used for that Service. In addition
|
||||
to the labels, each `EndpointSlice` that is managed on behalf of a Service has
|
||||
an owner reference. Owner references help different parts of Kubernetes avoid
|
||||
interfering with objects they don’t control.
|
||||
-->
|
||||
属主关系不同于一些资源使用的[标签和选择算符](/zh/docs/concepts/overview/working-with-objects/labels/)机制。
|
||||
例如,有一个创建 `EndpointSlice` 对象的 Service,
|
||||
该 Service 使用标签来让控制平面确定,哪些 `EndpointSlice` 对象属于该 Service。
|
||||
除开标签,每个代表 Service 所管理的 `EndpointSlice` 都有一个属主引用。
|
||||
属主引用避免 Kubernetes 的不同部分干扰到不受它们控制的对象。
|
||||
|
||||
<!--
|
||||
## Owner references in object specifications
|
||||
|
||||
Dependent objects have a `metadata.ownerReferences` field that references their
|
||||
owner object. A valid owner reference consists of the object name and a UID
|
||||
within the same namespace as the dependent object. Kubernetes sets the value of
|
||||
this field automatically for objects that are dependents of other objects like
|
||||
ReplicaSets, DaemonSets, Deployments, Jobs and CronJobs, and ReplicationControllers.
|
||||
You can also configure these relationships manually by changing the value of
|
||||
this field. However, you usually don't need to and can allow Kubernetes to
|
||||
automatically manage the relationships.
|
||||
-->
|
||||
## 对象规约中的属主引用 {#owner-references-in-object-specifications}
|
||||
|
||||
附属对象有一个 `metadata.ownerReferences` 字段,用于引用其属主对象。
|
||||
一个有效的属主引用,包含与附属对象同在一个命名空间下的对象名称和一个 UID。
|
||||
Kubernetes 自动为一些对象的附属资源设置属主引用的值,
|
||||
这些对象包含 ReplicaSet、DaemonSet、Deployment、Job、CronJob、ReplicationController 等。
|
||||
你也可以通过改变这个字段的值,来手动配置这些关系。
|
||||
然而,你通常不需要这么做,你可以让 Kubernetes 自动管理附属关系。
|
||||
|
||||
<!--
|
||||
Dependent objects also have an `ownerReferences.blockOwnerDeletion` field that
|
||||
takes a boolean value and controls whether specific dependents can block garbage
|
||||
collection from deleting their owner object. Kubernetes automatically sets this
|
||||
field to `true` if a {{<glossary_tooltip text="controller" term_id="controller">}}
|
||||
(for example, the Deployment controller) sets the value of the
|
||||
`metadata.ownerReferences` field. You can also set the value of the
|
||||
`blockOwnerDeletion` field manually to control which dependents block garbage
|
||||
collection.
|
||||
|
||||
A Kubernetes admission controller controls user access to change this field for
|
||||
dependent resources, based on the delete permissions of the owner. This control
|
||||
prevents unauthorized users from delaying owner object deletion.
|
||||
-->
|
||||
附属对象还有一个 `ownerReferences.blockOwnerDeletion` 字段,该字段使用布尔值,
|
||||
用于控制特定的附属对象是否可以阻止垃圾收集删除其属主对象。
|
||||
如果{{<glossary_tooltip text="控制器" term_id="controller">}}(例如 Deployment 控制器)
|
||||
设置了 `metadata.ownerReferences` 字段的值,Kubernetes 会自动设置
|
||||
`blockOwnerDeletion` 的值为 `true`。
|
||||
你也可以手动设置 `blockOwnerDeletion` 字段的值,以控制哪些附属对象会阻止垃圾收集。
|
||||
|
||||
{{< note >}}
|
||||
<!--
|
||||
Cross-namespace owner references are disallowed by design.
|
||||
Namespaced dependents can specify cluster-scoped or namespaced owners.
|
||||
A namespaced owner **must** exist in the same namespace as the dependent.
|
||||
If it does not, the owner reference is treated as absent, and the dependent
|
||||
is subject to deletion once all owners are verified absent.
|
||||
|
||||
Cluster-scoped dependents can only specify cluster-scoped owners.
|
||||
In v1.20+, if a cluster-scoped dependent specifies a namespaced kind as an owner,
|
||||
it is treated as having an unresolvable owner reference, and is not able to be garbage collected.
|
||||
|
||||
In v1.20+, if the garbage collector detects an invalid cross-namespace `ownerReference`,
|
||||
or a cluster-scoped dependent with an `ownerReference` referencing a namespaced kind, a warning Event
|
||||
with a reason of `OwnerRefInvalidNamespace` and an `involvedObject` of the invalid dependent is reported.
|
||||
You can check for that kind of Event by running
|
||||
`kubectl get events -A --field-selector=reason=OwnerRefInvalidNamespace`.
|
||||
-->
|
||||
根据设计,kubernetes 不允许跨名字空间指定属主。
|
||||
名字空间范围的附属可以指定集群范围的或者名字空间范围的属主。
|
||||
名字空间范围的属主**必须**和该附属处于相同的名字空间。
|
||||
如果名字空间范围的属主和附属不在相同的名字空间,那么该属主引用就会被认为是缺失的,
|
||||
并且当附属的所有属主引用都被确认不再存在之后,该附属就会被删除。
|
||||
|
||||
集群范围的附属只能指定集群范围的属主。
|
||||
在 v1.20+ 版本,如果一个集群范围的附属指定了一个名字空间范围类型的属主,
|
||||
那么该附属就会被认为是拥有一个不可解析的属主引用,并且它不能够被垃圾回收。
|
||||
|
||||
在 v1.20+ 版本,如果垃圾收集器检测到无效的跨名字空间的属主引用,
|
||||
或者一个集群范围的附属指定了一个名字空间范围类型的属主,
|
||||
那么它就会报告一个警告事件。该事件的原因是 `OwnerRefInvalidNamespace`,
|
||||
`involvedObject` 属性中包含无效的附属。
|
||||
你可以运行 `kubectl get events -A --field-selector=reason=OwnerRefInvalidNamespace`
|
||||
来获取该类型的事件。
|
||||
{{< /note >}}
|
||||
|
||||
<!--
|
||||
## Ownership and finalizers
|
||||
|
||||
When you tell Kubernetes to delete a resource, the API server allows the
|
||||
managing controller to process any [finalizer rules](/docs/concepts/overview/working-with-objects/finalizers/)
|
||||
for the resource. {{<glossary_tooltip text="Finalizers" term_id="finalizer">}}
|
||||
prevent accidental deletion of resources your cluster may still need to function
|
||||
correctly. For example, if you try to delete a `PersistentVolume` that is still
|
||||
in use by a Pod, the deletion does not happen immediately because the
|
||||
`PersistentVolume` has the `kubernetes.io/pv-protection` finalizer on it.
|
||||
Instead, the volume remains in the `Terminating` status until Kubernetes clears
|
||||
the finalizer, which only happens after the `PersistentVolume` is no longer
|
||||
bound to a Pod.
|
||||
-->
|
||||
## 属主关系与 Finalizer {#ownership-and-finalizers}
|
||||
|
||||
当你告诉 Kubernetes 删除一个资源,API 服务器允许管理控制器处理该资源的任何
|
||||
[Finalizer 规则](/zh/docs/concepts/overview/working-with-objects/finalizers/)。
|
||||
{{<glossary_tooltip text="Finalizer" term_id="finalizer">}}
|
||||
防止意外删除你的集群所依赖的、用于正常运作的资源。
|
||||
例如,如果你试图删除一个仍被 Pod 使用的 `PersistentVolume`,该资源不会被立即删除,
|
||||
因为 `PersistentVolume` 有 `kubernetes.io/pv-protection` Finalizer。
|
||||
相反,它将进入 `Terminating` 状态,直到 Kubernetes 清除这个 Finalizer,
|
||||
而这种情况只会发生在 `PersistentVolume` 不再被挂载到 Pod 上时。
|
||||
|
||||
<!--
|
||||
Kubernetes also adds finalizers to an owner resource when you use either
|
||||
[foreground or orphan cascading deletion](/docs/concepts/architecture/garbage-collection/#cascading-deletion).
|
||||
In foreground deletion, it adds the `foreground` finalizer so that the
|
||||
controller must delete dependent resources that also have
|
||||
`ownerReferences.blockOwnerDeletion=true` before it deletes the owner. If you
|
||||
specify an orphan deletion policy, Kubernetes adds the `orphan` finalizer so
|
||||
that the controller ignores dependent resources after it deletes the owner
|
||||
object.
|
||||
-->
|
||||
当你使用[前台或孤立级联删除](/zh/docs/concepts/architecture/garbage-collection/#cascading-deletion)时,
|
||||
Kubernetes 也会向属主资源添加 Finalizer。
|
||||
在前台删除中,会添加 `foreground` Finalizer,这样控制器必须在删除了拥有
|
||||
`ownerReferences.blockOwnerDeletion=true` 的附属资源后,才能删除属主对象。
|
||||
如果你指定了孤立删除策略,Kubernetes 会添加 `orphan` Finalizer,
|
||||
这样控制器在删除属主对象后,会忽略附属资源。
|
||||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
<!--
|
||||
* Learn more about [Kubernetes finalizers](/docs/concepts/overview/working-with-objects/finalizers/).
|
||||
* Learn about [garbage collection](/docs/concepts/architecture/garbage-collection).
|
||||
* Read the API reference for [object metadata](/docs/reference/kubernetes-api/common-definitions/object-meta/#System).
|
||||
-->
|
||||
* 了解更多关于 [Kubernetes Finalizer](/zh/docs/concepts/overview/working-with-objects/finalizers/)。
|
||||
* 了解关于[垃圾收集](/zh/docs/concepts/architecture/garbage-collection)。
|
||||
* 阅读[对象元数据](/docs/reference/kubernetes-api/common-definitions/object-meta/#System)的 API 参考文档。
|
||||
Reference in New Issue
Block a user