在叢集中使用串聯刪除
準備開始
您需要有一個 Kubernetes 叢集,且必須將 kubectl 命令列工具設定為與您的叢集通訊。建議在至少有兩個節點且未充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用以下 Kubernetes 實驗環境
您還需要建立範例 Deployment,以實驗不同類型的串聯刪除。您需要為每種類型重新建立 Deployment。
檢查 Pod 上的擁有者參考
檢查 ownerReferences
欄位是否存在於您的 Pod 上
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
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" ] ...
使用背景串聯刪除
- 建立範例 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 刪除一個物件時,控制器也會刪除相依物件。您可以讓 Kubernetes *孤立* 這些相依物件,方法是使用 kubectl
或 Kubernetes API,取決於您的叢集運行的 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
接下來
- 瞭解 Kubernetes 中的擁有者與相依者。
- 瞭解 Kubernetes finalizers。
- 瞭解 垃圾收集。