解決 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 叢集:管理員、混合、獨立和使用者叢集。
所有叢集類型都適用相同的一般程序。不過,從管理員叢集節點集區 (適用於管理員、混合或獨立叢集) 刪除節點的特定指令,與從使用者叢集節點集區刪除節點的指令略有不同。
為方便閱讀,下列指令會使用
${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-xPod,系統會重新建立這些 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 團隊聯絡。您也可以參閱「取得支援」,進一步瞭解支援資源,包括: