14 KiB
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
-
启动一个本地代理会话:
kubectl proxy --port=8080
-
使用
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 版本的文档。
-
启动一个本地代理会话:
kubectl proxy --port=8080
-
使用
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 %}} {{}}
使用后台级联删除
- 创建一个 Deployment 示例。
- 基于你的集群所运行的 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
-
启动一个本地代理会话:
kubectl proxy --port=8080
-
使用
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
-
启动一个本地代理会话:
kubectl proxy --port=8080
-
使用
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
-
启动一个本地代理会话:
kubectl proxy --port=8080
-
使用
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
-
启动一个本地代理会话:
kubectl proxy --port=8080
-
使用
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" %}}
- 了解 Kubernetes 中的属主与依赖
- 了解 Kubernetes finalizers
- 了解垃圾收集.