Kubernetes是一个强大的容器编排平台,它提供了许多功能来管理集群中的资源。其中之一就是级联删除,它可以帮助我们在删除一个对象时自动删除与之关联的其他对象。那么,如何在Kubernetes集群执行垃圾收集时使用的级联删除呢?
一、准备
必须拥有一个 Kubernetes 的集群,同时必须配置 kubectl 命令行工具与集群通信。 建议在至少有两个不作为控制平面主机的节点的集群上运行本教程。 如果还没有集群,可以通过 Minikube 构建一个自己的集群,或者可以使用下面的 Kubernetes 练习环境之一:
- Killercoda;
- 玩转 Kubernetes。
还需要创建一个 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 来切换到前台级联删除。 要获知版本信息,请输入 kubectl version.
可以使用 kubectl 或者 Kubernetes API 来基于前台级联删除来删除对象。
1、使用 kubectl
运行下面的命令:
kubectl delete deployment nginx-deployment --cascade=foreground
2、使用 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 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" ] ...
四、使用后台级联删除
1、创建一个 Deployment 示例。
2、基于集群所运行的 Kubernetes 版本,使用 kubectl 或者 Kubernetes API 来删除 Deployment。 要获知版本信息,请输入 kubectl version.
可以使用 kubectl 或者 Kubernetes API 来执行后台级联删除方式的对象删除操作。Kubernetes 默认采用后台级联删除方式,如果在运行下面的命令时不指定 –cascade 标志或者 propagationPolicy 参数时,用这种方式来删除对象。
(1)使用 kubectl
运行下面的命令:
kubectl delete deployment nginx-deployment --cascade=background
(2)使用 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 删除某个对象时, 控制器 也会删除依赖该对象 的其他对象。 取决于集群所运行的 Kubernetes 版本,也可以使用 kubectl 或者 Kubernetes API 来让 Kubernetes 孤立 这些依赖对象。 要获知版本信息,请输入 kubectl version.
1、使用 kubectl
运行下面的命令:
kubectl delete deployment nginx-deployment --cascade=orphan
2、使用 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 所管理的 Pods 仍然处于运行状态:
kubectl get pods -l app=nginx