在叢集中使用串聯刪除

本頁面說明如何在串聯刪除中指定叢集中使用的垃圾收集類型。

準備開始

您需要有一個 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

  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 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. 使用 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 刪除一個物件時,控制器也會刪除相依物件。您可以讓 Kubernetes *孤立* 這些相依物件,方法是使用 kubectl 或 Kubernetes API,取決於您的叢集運行的 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"
    

    輸出結果會在 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

接下來

最後修改時間為 2023 年 1 月 11 日上午 11:12 PST:更新 /tasks/administer-cluster 區段中的頁面權重 (b1202c78ff)