website/content/zh/docs/tasks/administer-cluster/use-cascading-deletion.md

14 KiB
Raw Permalink Blame History

title content_type
在集群中使用级联删除 task

本页面向你展示如何设置在你的集群执行{{<glossary_tooltip text="垃圾收集" term_id="garbage-collection">}} 时要使用的级联删除 类型。

{{% heading "prerequisites" %}}

{{< include "task-tutorial-prereqs.md" >}}

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

检查 Pod 上的属主引用

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

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

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

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

使用前台级联删除

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

{{}} {{% tab name="Kubernetes 1.20.x 及更新版本" %}}

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

使用 kubectl

运行下面的命令:

kubectl delete deployment nginx-deployment --cascade=foreground

使用 Kubernetes API

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

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

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

    输出中包含 foregroundDeletion {{<glossary_tooltip text="finalizer" term_id="finalizer">}} 类似这样:

    "kind": "Deployment",
    "apiVersion": "apps/v1",
    "metadata": {
        "name": "nginx-deployment",
        "namespace": "default",
        "uid": "d1ce1b02-cae8-4288-8a53-30e84d8fa505",
        "resourceVersion": "1363097",
        "creationTimestamp": "2021-07-08T20:24:37Z",
        "deletionTimestamp": "2021-07-08T20:27:39Z",
        "finalizers": [
          "foregroundDeletion"
        ]
        ...
    

{{% /tab %}} {{% tab name="Kubernetes 1.20.x 之前的版本" %}}

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

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

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

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

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

    输出中包含 foregroundDeletion {{<glossary_tooltip text="finalizer" term_id="finalizer">}} 类似这样:

    "kind": "Deployment",
    "apiVersion": "apps/v1",
    "metadata": {
        "name": "nginx-deployment",
        "namespace": "default",
        "uid": "d1ce1b02-cae8-4288-8a53-30e84d8fa505",
        "resourceVersion": "1363097",
        "creationTimestamp": "2021-07-08T20:24:37Z",
        "deletionTimestamp": "2021-07-08T20:27:39Z",
        "finalizers": [
          "foregroundDeletion"
        ]
        ...
    

{{% /tab %}} {{}}

使用后台级联删除

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

{{}} {{% tab name="Kubernetes 1.20.x 及更新版本" %}}

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

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

使用 kubectl

运行下面的命令:

kubectl delete deployment nginx-deployment --cascade=background

使用 Kubernetes API

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

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

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

    输出类似于:

    "kind": "Status",
    "apiVersion": "v1",
    ...
    "status": "Success",
    "details": {
        "name": "nginx-deployment",
        "group": "apps",
        "kind": "deployments",
        "uid": "cc9eefb9-2d49-4445-b1c1-d261c9396456"
    }
    

{{% /tab %}} {{% tab name="Kubernetes 1.20.x 之前的版本" %}}

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

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

使用 kubectl

运行下面的命令:

kubectl delete deployment nginx-deployment --cascade=true

使用 Kubernetes API

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

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

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

    输出类似于:

    "kind": "Status",
    "apiVersion": "v1",
    ...
    "status": "Success",
    "details": {
        "name": "nginx-deployment",
        "group": "apps",
        "kind": "deployments",
        "uid": "cc9eefb9-2d49-4445-b1c1-d261c9396456"
    }
    

{{% /tab %}} {{}}

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

默认情况下,当你告诉 Kubernetes 删除某个对象时, {{<glossary_tooltip text="控制器" term_id="controller">}} 也会删除依赖该对象 的其他对象。 取决于你的集群所运行的 Kubernetes 版本,你也可以使用 kubectl 或者 Kubernetes API 来让 Kubernetes 孤立 这些依赖对象。{{}}

{{}} {{% tab name="Kubernetes 1.20.x 及更新版本" %}}

使用 kubectl

运行下面的命令:

kubectl delete deployment nginx-deployment --cascade=orphan

使用 Kubernetes API

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

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

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

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

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

{{% /tab %}} {{% tab name="Kubernetes 1.20.x 之前的版本" %}}

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

使用 kubectl

运行下面的命令:

kubectl delete deployment nginx-deployment --cascade=orphan

使用 Kubernetes API

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

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

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

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

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

{{% /tab %}} {{}}

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

kubectl get pods -l app=nginx

{{% heading "whatsnext" %}}