Kubernetes 在集群中使用級(jí)聯(lián)刪除

2022-06-07 13:55 更新

在集群中使用級(jí)聯(lián)刪除

本頁(yè)面向你展示如何設(shè)置在你的集群執(zhí)行垃圾收集 時(shí)要使用的級(jí)聯(lián)刪除 類(lèi)型。

在開(kāi)始之前

你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個(gè)節(jié)點(diǎn)的集群上運(yùn)行本教程,且這些節(jié)點(diǎn)不作為控制平面主機(jī)。 如果你還沒(méi)有集群,你可以通過(guò) Minikube 構(gòu)建一個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:

你還需要?jiǎng)?chuàng)建一個(gè) Deployment 示例 以試驗(yàn)不同類(lèi)型的級(jí)聯(lián)刪除。你需要為每種級(jí)聯(lián)刪除類(lèi)型來(lái)重建 Deployment。

檢查 Pod 上的屬主引用 

檢查確認(rèn)你的 Pods 上存在 ?ownerReferences ?字段:

kubectl get pods -l app=nginx --output=yaml

輸出中包含 ?ownerReferences ?字段,類(lèi)似這樣:

apiVersion: v1
    ...
    ownerReferences:
    - apiVersion: apps/v1
      blockOwnerDeletion: true
      controller: true
      kind: ReplicaSet
      name: nginx-deployment-6b474476c4
      uid: 4fdcd81c-bd5d-41f7-97af-3a3b759af9a7
    ...

使用前臺(tái)級(jí)聯(lián)刪除 

默認(rèn)情況下,Kubernetes 使用后臺(tái)級(jí)聯(lián)刪除 以刪除依賴(lài)某對(duì)象的其他對(duì)象。取決于你的集群所運(yùn)行的 Kubernetes 版本, 你可以使用 kubectl 或者 Kubernetes API 來(lái)切換到前臺(tái)級(jí)聯(lián)刪除。要檢查版本,請(qǐng)輸入 ?kubectl version?。

  • Kubernetes 1.20.x 及更新版本
  • 你可以使用 ?kubectl ?或者 Kubernetes API 來(lái)基于前臺(tái)級(jí)聯(lián)刪除來(lái)刪除對(duì)象。

    使用 kubectl

    運(yùn)行下面的命令:

    kubectl delete deployment nginx-deployment --cascade=foreground
    

    使用 Kubernetes API

    1. 啟動(dòng)一個(gè)本地代理會(huì)話:
    2. kubectl proxy --port=8080
      
    3. 使用 ?curl ?來(lái)觸發(fā)刪除操作:
    4. 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, 類(lèi)似這樣:

      "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"
          ]
          ...
  • Kubernetes 1.20.x 之前的版本
  • 你可以通過(guò)調(diào)用 Kubernetes API 來(lái)基于前臺(tái)級(jí)聯(lián)刪除模式刪除對(duì)象。

    1. 啟動(dòng)一個(gè)本地代理會(huì)話:
    2. kubectl proxy --port=8080
      
    3. 使用 ?curl ?來(lái)觸發(fā)刪除操作:
    4. 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, 類(lèi)似這樣:

      "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"
          ]
          ...

使用后臺(tái)級(jí)聯(lián)刪除

  1. 創(chuàng)建一個(gè) Deployment 示例。
  2. 基于你的集群所運(yùn)行的 Kubernetes 版本,使用 ?kubectl ?或者 Kubernetes API 來(lái)刪除 Deployment。要檢查版本,請(qǐng)輸入 ?kubectl version?。
  • Kubernetes 1.20.x 及更新版本
  • 你可以使用 ?kubectl ?或者 Kubernetes API 來(lái)執(zhí)行后臺(tái)級(jí)聯(lián)刪除方式的對(duì)象刪除操作。

    Kubernetes 默認(rèn)采用后臺(tái)級(jí)聯(lián)刪除方式,如果你在運(yùn)行下面的命令時(shí)不指定 ?--cascade? 標(biāo)志或者 ?propagationPolicy ?參數(shù)時(shí),用這種方式來(lái)刪除對(duì)象。

    使用 kubectl

    運(yùn)行下面的命令:

    kubectl delete deployment nginx-deployment --cascade=background
    

    使用 Kubernetes API

    1. 啟動(dòng)一個(gè)本地代理會(huì)話:
    2. kubectl proxy --port=8080
      
    3. 使用 ?curl ?來(lái)觸發(fā)刪除操作:
    4. 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"

      輸出類(lèi)似于:

      "kind": "Status",
      "apiVersion": "v1",
      ...
      "status": "Success",
      "details": {
          "name": "nginx-deployment",
          "group": "apps",
          "kind": "deployments",
          "uid": "cc9eefb9-2d49-4445-b1c1-d261c9396456"
      }
  • Kubernetes 1.20.x 之前的版本
  • Kubernetes 默認(rèn)采用后臺(tái)級(jí)聯(lián)刪除方式,如果你在運(yùn)行下面的命令時(shí)不指定 ?--cascade? 標(biāo)志或者 ?propagationPolicy ?參數(shù)時(shí),用這種方式來(lái)刪除對(duì)象。

    使用 kubectl

    運(yùn)行下面的命令:

    kubectl delete deployment nginx-deployment --cascade=true
    

    使用 Kubernetes API

    1. 啟動(dòng)一個(gè)本地代理會(huì)話:
    2. kubectl proxy --port=8080
      
    3. 使用 ?curl ?來(lái)觸發(fā)刪除操作:
    4. 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"

      輸出類(lèi)似于:

      "kind": "Status",
      "apiVersion": "v1",
      ...
      "status": "Success",
      "details": {
          "name": "nginx-deployment",
          "group": "apps",
          "kind": "deployments",
          "uid": "cc9eefb9-2d49-4445-b1c1-d261c9396456"
      }

刪除屬主對(duì)象和孤立的依賴(lài)對(duì)象 

默認(rèn)情況下,當(dāng)你告訴 Kubernetes 刪除某個(gè)對(duì)象時(shí), 控制器 也會(huì)刪除依賴(lài)該對(duì)象 的其他對(duì)象。 取決于你的集群所運(yùn)行的 Kubernetes 版本,你也可以使用 ?kubectl ?或者 Kubernetes API 來(lái)讓 Kubernetes 孤立 這些依賴(lài)對(duì)象。要檢查版本,請(qǐng)輸入 ?kubectl version?。

  • Kubernetes 1.20.x 及更新版本
  • 使用 kubectl

    運(yùn)行下面的命令:

    kubectl delete deployment nginx-deployment --cascade=orphan
    

    使用 Kubernetes API

    1. 啟動(dòng)一個(gè)本地代理會(huì)話:
    2. kubectl proxy --port=8080
      
    3. 使用 ?curl ?來(lái)觸發(fā)刪除操作:
    4. 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"
      ],
      ...
  • Kubernetes 1.20.x 之前的版本
  • 使用 kubectl

    運(yùn)行下面的命令:

    kubectl delete deployment nginx-deployment --cascade=orphan
    

    使用 Kubernetes API

    1. 啟動(dòng)一個(gè)本地代理會(huì)話:
    2. kubectl proxy --port=8080
      
    3. 使用 ?curl ?來(lái)觸發(fā)刪除操作:
    4. 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 仍然處于運(yùn)行狀態(tài):

kubectl get pods -l app=nginx


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)