移除 PodDisruptionBudgets 封鎖的節點

在特定情況下,PodDisruptionBudgets (PDB) 政策可能會導致節點無法從節點集區中順利移除。在這些情況下,節點狀態會回報 Ready,SchedulingDisabled,即使節點已移除也一樣。本文說明如何從目前因 PDB 問題而遭到封鎖的 Google Distributed Cloud 叢集中移除節點。

本頁內容適用於管理基礎技術架構生命週期,以及在服務等級目標 (SLO) 未達成或應用程式失敗時,回應快訊和頁面的管理員、架構師和營運人員。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。 Google Cloud

PDB 與可用的 Pod 數量發生衝突

當您變更系統時,PDB 政策可防止 Pod 同時停止運作,確保應用程式效能。因此,PDB 政策會限制備用應用程式中可同時無法使用的 Pod 數量。

不過,如果您刪除節點會違反 PDB 政策,有時就無法刪除節點。

舉例來說,PDB 政策可以定義系統中應一律有兩個可用的 Pod (.spec.minAvailable 為 2)。但如果您只有兩個 Pod,並嘗試移除其中一個 Pod 所在的節點,PDB 政策就會生效,並禁止移除節點。

同樣地,如果 PDB 政策定義不得有任何 Pod 無法使用 (.spec.maxUnavailable 為 0),政策也會禁止刪除任何相關聯的節點。即使您嘗試一次移除一個 Pod,PDB 政策也會禁止您刪除受影響的節點。

停用並重新啟用 PDB 政策

如要解決 PDB 衝突,請備份並移除 PDB 政策。成功刪除 PDB 後,節點會排空,相關聯的 Pod 也會移除。接著進行所需變更,然後重新啟用 PDB 政策。

以下範例說明如何刪除此情況下的節點,這可能會影響所有類型的 Google Distributed Cloud 叢集:管理員、混合式、獨立和使用者叢集。

一般程序適用於所有叢集類型。不過,從管理員叢集節點集區刪除節點 (適用於管理員、混合或獨立叢集) 的特定指令,與從使用者叢集節點集區刪除節點的指令略有不同。

  1. 為方便閱讀,下列指令使用 ${KUBECONFIG} 變數。

    視叢集類型而定,將管理員叢集 kubeconfig (ADMIN_KUBECONFIG) 或使用者叢集 kubeconfig (USER_CLUSTER_CONFIG) 路徑匯出至 $(KUBECONFIG),然後完成下列步驟:

    • 如要從使用者叢集刪除節點,請設定 export KUBECONFIG=USER_CLUSTER_CONFIG
    • 如要從管理員叢集刪除節點,請設定 export KUBECONFIG=ADMIN_KUBECONFIG
  2. 選用:如要從使用者叢集節點集區刪除節點,請執行下列指令,擷取使用者叢集 kubeconfig 檔案:

    kubectl --kubeconfig ADMIN_KUBECONFIG -n cluster-USER_CLUSTER_NAME \
      get secret USER_CLUSTER_NAME-kubeconfig  \
      -o 'jsonpath={.data.value}' | base64 -d > USER_CLUSTER_CONFIG
    

    請將下列項目替換為叢集環境專屬的資訊:

    • ADMIN_KUBECONFIG:管理員叢集 kubeconfig 檔案的路徑。
    • CLUSTER_NAME:要建立快照的叢集名稱。
    • USER_CLUSTER_CONFIG:使用者叢集設定檔的路徑。
  3. 從節點集區移除節點後,請檢查節點狀態。受影響的節點會回報 Ready, SchedulingDisabled

    kubectl get nodes --kubeconfig ${KUBECONFIG}
    

    節點狀態會與下列範例輸出內容類似:

    NAME   STATUS                    ROLES      AGE      VERSION
    CP2    Ready                     Master     11m      v.1.18.6-gke.6600
    CP3    Ready,SchedulingDisabled  <none>     9m22s    v.1.18.6-gke.6600
    CP4    Ready                     <none>     9m18s    v.1.18.6-gke.6600
    
  4. 檢查叢集中的 PDB:

    kubectl get pdb --kubeconfig ${KUBECONFIG} -A
    

    系統會回報類似下列範例的 PDB:

    NAMESPACE     NAME             MIN AVAILABLE    MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
    gke-system    istio-ingress    1                N/A               1                     19m
    gke-system    istiod           1                N/A               1                     19m
    kube-system   coredns          1                N/A               0                     19m
    kube-system   log-aggregator   N/A              0                 0                     19m
    kube-system   prometheus       N/A              0                 0                     19m
    
  5. 檢查 PDB。找出 PDB 內的 Pod 標籤與節點中相符的 Pod。這項比對可確保您停用正確的 PDB,順利移除節點:

    kubectl --kubeconfig ${KUBECONFIG} get pdb log-aggregator -n kube-system -o 'jsonpath={.spec}'
    

    系統會在 PDB 政策中傳回相符的標籤結果:

    {"maxUnavailable":0,"selector":{"matchLabels":{"app":"stackdriver-log-aggregator"}}}
    
  6. 找出符合 PDB 政策標籤的 Pod:

    kubectl --kubeconfig ${KUBECONFIG} get pods -A --selector=app=stackdriver-log-aggregator  \
      -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.nodeName}{"\n"}{end}'
    

    這項指令會傳回與 PDB 標籤相符的 Pod 清單,並驗證您需要移除的 PDB 政策:

    stackdriver-log-aggregator-0    CP3
    stackdriver-log-aggregator-1    CP3
    
  7. 確認受影響的 Pod 後,請備份 PDB 政策。以下範例會備份 log-aggregator 政策:

    kubectl get pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system  \
      -o yaml >> log-aggregator.yaml
    
  8. 刪除特定 PDB 政策。同樣地,以下範例會刪除 log-aggregator 政策:

    kubectl delete pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system
    

    刪除 PDB 政策後,節點會繼續排空。不過,節點最多可能需要 30 分鐘才能完全刪除。繼續檢查節點狀態,確認程序是否已順利完成。

    如要永久移除節點,並移除與節點相關聯的儲存空間資源,可以在還原 PDB 政策前執行這項操作。詳情請參閱「移除儲存空間資源」。

  9. 從副本還原 PDB 政策:

    kubectl apply -f log-aggregator.yaml --kubeconfig ${KUBECONFIG}
    
  10. 確認已成功重新建立已刪除的 Pod。在這個範例中,如果存在兩個 stackdriver-log-aggregator-x Pod,系統就會重新建立這些 Pod:

    kubectl get pods -o wide --kubeconfig ${KUBECONFIG} -A
    
  11. 如要還原節點,請編輯適當的節點集區設定,並還原節點 IP 位址。

從永久刪除的節點中移除儲存空間資源

如果永久刪除節點,且不想將節點還原至系統,也可以刪除與該節點相關聯的儲存空間資源。

  1. 檢查並取得與節點相關聯的永久磁碟區 (PV) 名稱:

    kubectl get pv --kubeconfig ${KUBECONFIG}  \
      -A -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{.spec.claimRef.name}{":\t"}  \
      {.spec.nodeAffinity.required.nodeSelectorTerms[0].matchExpressions[0].values}{"\n"}{end}'
    
  2. 刪除與節點相關聯的 PV:

    kubectl delete pv PV_NAME --kubeconfig ${KUBECONFIG}
    

    PV_NAME 替換為要刪除的永久磁碟名稱。

後續步驟

如需其他協助,請與 Cloud Customer Care 團隊聯絡。如要進一步瞭解支援資源,包括下列項目,請參閱「取得支援」: