在特定情況下,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 叢集:管理員、混合式、獨立和使用者叢集。
一般程序適用於所有叢集類型。不過,從管理員叢集節點集區刪除節點 (適用於管理員、混合或獨立叢集) 的特定指令,與從使用者叢集節點集區刪除節點的指令略有不同。
為方便閱讀,下列指令使用
${KUBECONFIG}
變數。視叢集類型而定,將管理員叢集 kubeconfig (
ADMIN_KUBECONFIG
) 或使用者叢集 kubeconfig (USER_CLUSTER_CONFIG
) 路徑匯出至$(KUBECONFIG)
,然後完成下列步驟:- 如要從使用者叢集刪除節點,請設定
export KUBECONFIG=USER_CLUSTER_CONFIG
- 如要從管理員叢集刪除節點,請設定
export KUBECONFIG=ADMIN_KUBECONFIG
。
- 如要從使用者叢集刪除節點,請設定
選用:如要從使用者叢集節點集區刪除節點,請執行下列指令,擷取使用者叢集 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
:使用者叢集設定檔的路徑。
從節點集區移除節點後,請檢查節點狀態。受影響的節點會回報
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
檢查叢集中的 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
檢查 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"}}}
找出符合 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
確認受影響的 Pod 後,請備份 PDB 政策。以下範例會備份
log-aggregator
政策:kubectl get pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system \ -o yaml >> log-aggregator.yaml
刪除特定 PDB 政策。同樣地,以下範例會刪除
log-aggregator
政策:kubectl delete pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system
刪除 PDB 政策後,節點會繼續排空。不過,節點最多可能需要 30 分鐘才能完全刪除。繼續檢查節點狀態,確認程序是否已順利完成。
如要永久移除節點,並移除與節點相關聯的儲存空間資源,可以在還原 PDB 政策前執行這項操作。詳情請參閱「移除儲存空間資源」。
從副本還原 PDB 政策:
kubectl apply -f log-aggregator.yaml --kubeconfig ${KUBECONFIG}
確認已成功重新建立已刪除的 Pod。在這個範例中,如果存在兩個
stackdriver-log-aggregator-x
Pod,系統就會重新建立這些 Pod:kubectl get pods -o wide --kubeconfig ${KUBECONFIG} -A
如要還原節點,請編輯適當的節點集區設定,並還原節點 IP 位址。
從永久刪除的節點中移除儲存空間資源
如果永久刪除節點,且不想將節點還原至系統,也可以刪除與該節點相關聯的儲存空間資源。
檢查並取得與節點相關聯的永久磁碟區 (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}'
刪除與節點相關聯的 PV:
kubectl delete pv PV_NAME --kubeconfig ${KUBECONFIG}
將
PV_NAME
替換為要刪除的永久磁碟名稱。
後續步驟
如需其他協助,請與 Cloud Customer Care 團隊聯絡。如要進一步瞭解支援資源,包括下列項目,請參閱「取得支援」: