本文說明如何對 Google Kubernetes Engine (GKE) 叢集節點的基礎 Compute Engine 執行個體執行主機維護作業。您只需要針對特定類型的 Compute Engine 執行個體 (包括搭載 GPU 和 TPU 的執行個體) 主動管理這項維護作業,因為這些執行個體不會進行即時遷移。本文所述策略適用於訓練和推論工作負載。如果您只需要對個別節點手動執行主機維護作業,或工作負載可容許自動主機維護作業,請參閱「瞭解如何在 GKE 上執行主機維護作業」。
這些策略會為節點群組執行主機維護作業,並視需要啟動 GKE 叢集升級。
如果工作負載節點可接受單一停機期,例如訓練工作負載的節點,請使用平行策略。如果工作負載節點可接受分批停機,同時維持大部分資源的可用性,例如推論工作負載的節點,請使用輪替策略。
使用平行策略更新訓練工作負載的節點
這項策略會同時為使用加速器的節點群組執行變更。您可以將這項策略用於訓練工作負載,也可以用於其他類型的工作負載。在這些工作負載中,執行變更時干擾最少的方法,就是讓群組中的所有節點和在這些節點上執行的工作負載,在單一時間範圍內完全停機。
這項策略包含下列高階步驟:
- 停止工作負載:選取節點集區,然後停止在這些節點集區上執行的工作負載,或將工作負載移至其他可用的節點。
- 觸發主機維護:同時將維護標籤套用至所有選取的節點,並等待所有節點完成程序。
- 升級 GKE 版本:變更節點的 GKE 版本。
- 重新啟動工作負載:所有主機維護和升級作業完成後,請重新啟動工作負載。
提供的操作說明會針對單一節點集區進行變更。不過,您可以調整步驟,同時對多個節點集區進行變更。請確保在開始這些步驟前,至少有幾個小時的時間,這些節點不需要執行這項工作負載。
為盡量減少中斷時間,同時接收基礎 Compute Engine 執行個體和 GKE 節點的重要變更,請利用這段停機時間執行主機維護和 GKE 版本升級。不過,如果您不想升級 GKE 節點版本,可以只執行主機維護作業。
使用前注意事項
開始前,請先詳閱下列注意事項:
- 避免重新部署工作負載:為避免因 PodDisruptionBudgets 造成不必要的延遲,請完成所有步驟後再重新部署工作負載。
- 規劃中斷時間:確保工作負載可中斷一段時間。這些步驟需要數小時才能完成,主要是因為主機維護需要時間。
同時更新所有節點
如要執行主機維護作業,並視需要升級 GKE 版本,請完成下列步驟:
- 準備工作負載:停止工作負載,或確保工作負載已建立近期快照或檢查點。
開始主機維護:將維護標籤套用至所選節點集區中的所有節點:
kubectl label nodes -l cloud.google.com/gke-nodepool=NODE_POOL_NAME cloud.google.com/perform-maintenance=true --overwriteCompute Engine 會開始排空並更新基礎執行個體。這個程序可能需要幾小時才能完成。詳情請參閱「正常終止程序」。
監控主機維護狀態:維護作業完成後,GKE 會移除維護標籤。維護作業完成後,您可以在 Cloud Logging 中找到含有下列訊息的記錄:
Maintenance window has completed for this instance. All maintenance notifications on the instance have been removed.選用:升級 GKE 節點版本:按照操作說明升級節點的 GKE 版本。
使用滾動策略更新推論工作負載的節點
這項策略說明如何手動維護執行推論工作負載的 GKE 節點。這項作業會分批更新節點,以維持服務可用性。此方法最適合可容許一定比例的副本暫時離線的工作負載。
這項策略包含下列高階步驟:
- 找出節點並分批處理:選擇要更新的節點集區,然後根據工作負載的容錯能力,將節點分組為適當大小的批次。
- 逐一處理批次:針對每個批次套用維護標籤,並監控節點批次,直到標籤移除為止。
- 升級 GKE 版本:所有批次完成主機維護後,請變更 GKE 節點版本。
使用前注意事項
開始前,請先詳閱下列注意事項:
- 瞭解部署作業:如要順利部署,您必須詳細瞭解工作負載分配、副本放置位置和失敗網域。請確保整個過程都有足夠的服務容量。
- 規劃批次大小:分批更新節點。每個批次的大小取決於工作負載的容錯能力。請考慮下列因素:
- 每個服務模型可用的備用資源數量。
- 副本在節點和故障網域間的分配情形。
- PodDisruptionBudgets 可協助強制執行同時停機的 Pod 數量上限。
- 建議:為簡化管理作業,請考慮為不同副本集區專門配置不同節點集區,以便在節點集區層級隔離故障域。
- 計算時間限制:請考量下列時間因素:
- 每個批次可能需要數小時才能完成主機維護步驟。
- 計算最小批量,確保所有維護作業都能在期限內完成:
MAINTENANCE_BLOCKS = floor(HOURS_TO_MAINTENANCE / 4)(其中HOURS_TO_MAINTENANCE是可用總時間)。MIN_PER_BATCH = TOTAL_NODE_COUNT / MAINTENANCE_BLOCKS
- 所選批量必須大於或等於
MIN_PER_BATCH。
- 查看特定工作負載類型:針對各個設定類型,請考慮下列事項:
- 專家混合 (MOE):確保批次處理策略為每個模型維持最低副本數。
- 分散式服務:規劃批次時,請務必追蹤分散式設定中涉及的所有副本。
- 多主機節點集區 (TPU、MNNVL):對於這些設定,您可能會一次關閉整個節點集區。請據此規劃多個節點集區的故障網域。
分批執行滾動式更新
如要執行滾動更新,請完成下列步驟:
找出要維護的節點:找出所有要維護的節點,並儲存這份清單。如要識別節點,請使用下列任一方法,或手動選取節點:
取得叢集中使用加速器 (TPU 或 GPU) 的所有節點:
kubectl get nodes -o json | jq -r '.items[] | select(.spec.taints[]? | select(.key=="nvidia.com/gpu" or .key=="google.com/tpu")) | .metadata.name'取得特定節點集區中的所有節點:
kubectl get nodes -l cloud.google.com/gke-nodepool=NODE_POOL_NAME --no-headers -o custom-columns=":metadata.name"將
NODE_POOL_NAME替換為節點集區名稱。取得具有特定標籤的所有節點:
kubectl get nodes -l LABEL -o jsonpath='{.items[*].metadata.name}'將
LABEL替換為節點標籤。
將節點分成批次:將識別出的節點分成等量的批次。使用先前「開始前請先考量」一節中「計算時間限制」清單項目所述的公式,判斷批量。
執行主機維護作業:針對每個批次,完成下列步驟:
選取一批節點,然後套用維護標籤:
kubectl label nodes LIST_OF_NODES_IN_BATCH cloud.google.com/perform-maintenance=true --overwrite將
LIST_OF_NODES_IN_BATCH替換為批次中的節點清單 (以空格分隔)。例如:node-1 node-2 node-3。監控主機維護狀態。維護作業完成後,GKE 會移除維護標籤。維護作業完成後,您可以在「記錄」中找到含有下列訊息的記錄:
Maintenance window has completed for this instance. All maintenance notifications on the instance have been removed.針對每個剩餘批次重複前兩個步驟,直到完成所有批次的主機維護作業為止。
選用:升級 GKE 節點版本:只有在所有節點完成主機維護後,才執行這個步驟,以免 GKE 節點部署在尚未完成維護的主機上。請參閱下一節的說明。
升級節點的 GKE 版本
請考量要同時升級的節點數量。使用平行策略時,您會同時對整個節點集區或多個節點集區執行主機維護作業。使用滾動策略時,您會分批執行主機維護作業。請根據節點群組的大小,決定要使用哪種升級方法:
- 平行策略:如果節點集區在每個區域的節點數不超過 20 個,請使用大量升級。如果每個節點集區在每個可用區的節點數都超過 20 個,請刪除並重新建立節點集區。
- 輪流策略:如果批次在每個可用區、每個節點集區或更少,有 20 個節點,請使用大量升級。如果每個節點集區的每個可用區有超過 20 個節點,請刪除並重新建立節點。
使用節點數擴充升級功能
設定突增升級:使用
maxUnavailable設定,決定節點集區中每個區域可同時無法使用的節點數量。舉例來說,如果節點集區中某個區域有 18 個節點,請將maxUnavailable欄位的值設為18。如果預留容量沒有多餘空間,建議使用這項設定。如要進一步瞭解使用這項設定的原因,請參閱「在資源受限的環境中升級」。
執行下列指令,升級節點集區。如要升級多個節點集區,請針對每個節點集區執行下列指令:
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool NODE_POOL_NAME \ --cluster-version VERSION \ --location CONTROL_PLANE_LOCATION \ --quiet更改下列內容:
CLUSTER_NAME:叢集名稱。NODE_POOL_NAME:節點集區的名稱。VERSION:節點集區的建議自動升級目標。詳情請參閱「取得 Standard 叢集節點集區的升級資訊」。如果叢集沒有建議的自動升級目標,請查看 GKE 版本資訊中的最新「版本更新」項目。CONTROL_PLANE_LOCATION:叢集控制層的位置。
刪除並重新建立節點
刪除節點集區,然後使用較新版本重新建立:
刪除節點集區:
gcloud container node-pools delete NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --location CONTROL_PLANE_LOCATION重新建立節點集區,並使用
--cluster-version標記傳遞新版本。傳遞節點集區的建議自動升級目標。詳情請參閱「取得標準叢集節點集區的升級資訊」。如果叢集沒有建議的自動升級目標,請查看 GKE 版本資訊中的最新「版本更新」項目。