在集群中使用级联删除

此页面展示了如何在集群中进行 级联删除 时指定要使用的类型 垃圾回收

开始之前

您需要拥有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议您在至少包含两个节点的集群上运行本教程,这些节点不充当控制平面主机。如果您还没有集群,可以使用 minikube 创建一个,或者可以使用以下 Kubernetes 游乐场之一

您还需要 创建一个示例 Deployment 以便使用不同类型的级联删除进行实验。您需要为每种类型重新创建 Deployment。

检查 Pod 上的所有者引用

检查您的 Pod 上是否存在 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 使用 后台级联删除 来删除对象的依赖项。您可以使用 kubectl 或 Kubernetes API 切换到前台级联删除,具体取决于您的集群运行的 Kubernetes 版本。要检查版本,请输入 kubectl version

您可以使用 kubectl 或 Kubernetes API 使用前台级联删除删除对象。

使用 kubectl

运行以下命令

kubectl delete deployment nginx-deployment --cascade=foreground

使用 Kubernetes API

  1. 启动本地代理会话

    kubectl proxy --port=8080
    
  2. 使用 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 终结器

    "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"
        ]
        ...
    

使用后台级联删除

  1. 创建一个示例 Deployment.
  2. 使用 kubectl 或 Kubernetes API 删除 Deployment,具体取决于您的集群运行的 Kubernetes 版本。要检查版本,请输入 kubectl version

您可以使用 kubectl 或 Kubernetes API 使用后台级联删除删除对象。

Kubernetes 默认情况下使用后台级联删除,即使您运行以下命令时不使用 --cascade 标志或 propagationPolicy 参数也是如此。

使用 kubectl

运行以下命令

kubectl delete deployment nginx-deployment --cascade=background

使用 Kubernetes API

  1. 启动本地代理会话

    kubectl proxy --port=8080
    
  2. 使用 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"
    }
    

删除所有者对象并将依赖项孤立

默认情况下,当您告诉 Kubernetes 删除对象时,控制器 还会删除依赖项。您可以使用 kubectl 或 Kubernetes API 使 Kubernetes 孤立 这些依赖项,具体取决于您的集群运行的 Kubernetes 版本。要检查版本,请输入 kubectl version

使用 kubectl

运行以下命令

kubectl delete deployment nginx-deployment --cascade=orphan

使用 Kubernetes API

  1. 启动本地代理会话

    kubectl proxy --port=8080
    
  2. 使用 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"
    

    输出包含 orphan,类似于此的 finalizers 字段

    "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"
    ],
    ...
    

您可以检查 Deployment 管理的 Pod 是否仍在运行

kubectl get pods -l app=nginx

下一步

上次修改时间:2023 年 1 月 11 日 下午 11:12 PST:更新 /tasks/administer-cluster 部分中的页面权重 (b1202c78ff)