在集群中使用级联删除

本页面向你展示如何设置在你的集群执行垃圾收集 时要使用的级联删除 类型。

Before you begin

你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

你还需要创建一个 Deployment 示例 以试验不同类型的级联删除。你需要为每种级联删除类型来重建 Deployment。

检查 Pod 上的属主引用

检查确认你的 Pods 上存在 ownerReferences 字段:

  1. kubectl get pods -l app=nginx --output=yaml

输出中包含 ownerReferences 字段,类似这样:

  1. apiVersion: v1
  2. ...
  3. ownerReferences:
  4. - apiVersion: apps/v1
  5. blockOwnerDeletion: true
  6. controller: true
  7. kind: ReplicaSet
  8. name: nginx-deployment-6b474476c4
  9. uid: 4fdcd81c-bd5d-41f7-97af-3a3b759af9a7
  10. ...

使用前台级联删除

默认情况下,Kubernetes 使用后台级联删除 以删除依赖某对象的其他对象。取决于你的集群所运行的 Kubernetes 版本, 你可以使用 kubectl 或者 Kubernetes API 来切换到前台级联删除。 To check the version, enter kubectl version.

你可以使用 kubectl 或者 Kubernetes API 来基于前台级联删除来删除对象。

使用 kubectl

运行下面的命令:

  1. kubectl delete deployment nginx-deployment --cascade=foreground

使用 Kubernetes API

  1. 启动一个本地代理会话:

    1. kubectl proxy --port=8080
  2. 使用 curl 来触发删除操作:

    1. curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-deployment \
    2. -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Foreground"}' \
    3. -H "Content-Type: application/json"

    输出中包含 foregroundDeletion finalizer, 类似这样:

    1. "kind": "Deployment",
    2. "apiVersion": "apps/v1",
    3. "metadata": {
    4. "name": "nginx-deployment",
    5. "namespace": "default",
    6. "uid": "d1ce1b02-cae8-4288-8a53-30e84d8fa505",
    7. "resourceVersion": "1363097",
    8. "creationTimestamp": "2021-07-08T20:24:37Z",
    9. "deletionTimestamp": "2021-07-08T20:27:39Z",
    10. "finalizers": [
    11. "foregroundDeletion"
    12. ]
    13. ...

你可以通过调用 Kubernetes API 来基于前台级联删除模式删除对象。

进一步的细节,可阅读特定于你的 Kubernetes 版本的文档

  1. 启动一个本地代理会话:

    1. kubectl proxy --port=8080
  2. 使用 curl 来触发删除操作:

    1. curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-deployment \
    2. -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Foreground"}' \
    3. -H "Content-Type: application/json"

    输出中包含 foregroundDeletion finalizer, 类似这样:

    1. "kind": "Deployment",
    2. "apiVersion": "apps/v1",
    3. "metadata": {
    4. "name": "nginx-deployment",
    5. "namespace": "default",
    6. "uid": "d1ce1b02-cae8-4288-8a53-30e84d8fa505",
    7. "resourceVersion": "1363097",
    8. "creationTimestamp": "2021-07-08T20:24:37Z",
    9. "deletionTimestamp": "2021-07-08T20:27:39Z",
    10. "finalizers": [
    11. "foregroundDeletion"
    12. ]
    13. ...

使用后台级联删除

  1. 创建一个 Deployment 示例
  2. 基于你的集群所运行的 Kubernetes 版本,使用 kubectl 或者 Kubernetes API 来删除 Deployment。 To check the version, enter kubectl version.

你可以使用 kubectl 或者 Kubernetes API 来执行后台级联删除方式的对象删除操作。

Kubernetes 默认采用后台级联删除方式,如果你在运行下面的命令时不指定 --cascade 标志或者 propagationPolicy 参数时,用这种方式来删除对象。

使用 kubectl

运行下面的命令:

  1. kubectl delete deployment nginx-deployment --cascade=background

使用 Kubernetes API

  1. 启动一个本地代理会话:

    1. kubectl proxy --port=8080
  2. 使用 curl 来触发删除操作:

    1. curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-deployment \
    2. -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Background"}' \
    3. -H "Content-Type: application/json"

    输出类似于:

    1. "kind": "Status",
    2. "apiVersion": "v1",
    3. ...
    4. "status": "Success",
    5. "details": {
    6. "name": "nginx-deployment",
    7. "group": "apps",
    8. "kind": "deployments",
    9. "uid": "cc9eefb9-2d49-4445-b1c1-d261c9396456"
    10. }

Kubernetes 默认采用后台级联删除方式,如果你在运行下面的命令时不指定 --cascade 标志或者 propagationPolicy 参数时,用这种方式来删除对象。

进一步的细节,可阅读特定于你的 Kubernetes 版本的文档

使用 kubectl

运行下面的命令:

  1. kubectl delete deployment nginx-deployment --cascade=true

使用 Kubernetes API

  1. 启动一个本地代理会话:

    1. kubectl proxy --port=8080
  2. 使用 curl 来触发删除操作:

    1. curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-deployment \
    2. -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Background"}' \
    3. -H "Content-Type: application/json"

    输出类似于:

    1. "kind": "Status",
    2. "apiVersion": "v1",
    3. ...
    4. "status": "Success",
    5. "details": {
    6. "name": "nginx-deployment",
    7. "group": "apps",
    8. "kind": "deployments",
    9. "uid": "cc9eefb9-2d49-4445-b1c1-d261c9396456"
    10. }

删除属主对象和孤立的依赖对象

默认情况下,当你告诉 Kubernetes 删除某个对象时, 控制器 也会删除依赖该对象 的其他对象。 取决于你的集群所运行的 Kubernetes 版本,你也可以使用 kubectl 或者 Kubernetes API 来让 Kubernetes 孤立 这些依赖对象。 To check the version, enter kubectl version.

使用 kubectl

运行下面的命令:

  1. kubectl delete deployment nginx-deployment --cascade=orphan

使用 Kubernetes API

  1. 启动一个本地代理会话:

    1. kubectl proxy --port=8080
  2. 使用 curl 来触发删除操作:

    1. curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-deployment \
    2. -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Orphan"}' \
    3. -H "Content-Type: application/json"

    输出中在 finalizers 字段中包含 orphan,如下所示:

    1. "kind": "Deployment",
    2. "apiVersion": "apps/v1",
    3. "namespace": "default",
    4. "uid": "6f577034-42a0-479d-be21-78018c466f1f",
    5. "creationTimestamp": "2021-07-09T16:46:37Z",
    6. "deletionTimestamp": "2021-07-09T16:47:08Z",
    7. "deletionGracePeriodSeconds": 0,
    8. "finalizers": [
    9. "orphan"
    10. ],
    11. ...

进一步的细节,可阅读特定于你的 Kubernetes 版本的文档

使用 kubectl

运行下面的命令:

  1. kubectl delete deployment nginx-deployment --cascade=orphan

使用 Kubernetes API

  1. 启动一个本地代理会话:

    1. kubectl proxy --port=8080
  2. 使用 curl 来触发删除操作:

    1. curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-deployment \
    2. -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Orphan"}' \
    3. -H "Content-Type: application/json"

    输出中在 finalizers 字段中包含 orphan,如下所示:

    1. "kind": "Deployment",
    2. "apiVersion": "apps/v1",
    3. "namespace": "default",
    4. "uid": "6f577034-42a0-479d-be21-78018c466f1f",
    5. "creationTimestamp": "2021-07-09T16:46:37Z",
    6. "deletionTimestamp": "2021-07-09T16:47:08Z",
    7. "deletionGracePeriodSeconds": 0,
    8. "finalizers": [
    9. "orphan"
    10. ],
    11. ...

你可以检查 Deployment 所管理的 Pods 仍然处于运行状态:

  1. kubectl get pods -l app=nginx

What’s next

最后修改 April 23, 2022 at 2:37 PM PST: [zh] fix the wrong link in use-cascading-deletion.md (f13a63baf)