移除 PodDisruptionBudgets 封鎖的節點

解決 PodDisruptionBudget (PDB) 衝突後,您就能在刪除作業遭到封鎖時,完成從 Google Distributed Cloud 叢集移除節點的作業。如果 PDB 阻止系統淘汰 Pod,節點就無法清空,並會保留在叢集中,狀態為 Ready,SchedulingDisabled,即使您已從節點集區設定中移除該節點也一樣。如要完成移除節點,請找出並暫時停用衝突的政策。

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 團隊聯絡。您也可以參閱「取得支援」,進一步瞭解支援資源,包括:

  • 建立客服案件的需求條件。
  • 工具:協助您疑難排解,例如您的環境設定、記錄和指標。
  • 支援的元件。