在集群中使用级联删除
本页面展示了如何指定在集群 垃圾收集 期间使用的 级联删除 类型。
准备工作
你需要拥有一个 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
启动本地代理会话
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` 终结器,如下所示:
"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" ] ...
使用后台级联删除
- 创建一个示例 Deployment.
- 使用 `kubectl` 或 Kubernetes API 删除 Deployment,具体取决于你的集群运行的 Kubernetes 版本。
要检查版本,请输入
kubectl version
。
你可以使用 `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" }
删除属主对象并孤立依赖项
默认情况下,当你告诉 Kubernetes 删除一个对象时,控制器 也会删除依赖对象。你可以使用 `kubectl` 或 Kubernetes API 让 Kubernetes 孤立这些依赖项,具体取决于你的集群运行的 Kubernetes 版本。
要检查版本,请输入 kubectl version
。
使用 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" ], ...
你可以检查由 Deployment 管理的 Pod 是否仍在运行。
kubectl get pods -l app=nginx