在集群中使用级联删除

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

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

    检查 Pod 上的属主引用

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

    输出中包含 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 来切换到前台级联删除。 要获知版本信息,请输入 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. "deletionTimestamp": "2021-07-08T20:27:39Z",
      9. "finalizers": [
      10. "foregroundDeletion"
      11. ...

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

    进一步的细节,可阅读。

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

      1. kubectl proxy --port=8080
      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. 创建一个 Deployment 示例
    2. 基于你的集群所运行的 Kubernetes 版本,使用 kubectl 或者 Kubernetes API 来删除 Deployment。 要获知版本信息,请输入 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 参数时,用这种方式来删除对象。

    进一步的细节,可阅读。

    使用 kubectl

    运行下面的命令:

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

    使用 Kubernetes API

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

        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"

        输出类似于:

      默认情况下,当你告诉 Kubernetes 删除某个对象时, 控制器 也会删除依赖该对象 的其他对象。 取决于你的集群所运行的 Kubernetes 版本,你也可以使用 kubectl 或者 Kubernetes API 来让 Kubernetes 孤立 这些依赖对象。 要获知版本信息,请输入 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. ...

      进一步的细节,可阅读。

      使用 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,如下所示:

      接下来

      • 了解 Kubernetes 中的
      • 了解 Kubernetes finalizers