為執行訓練和推論工作負載的節點執行主機維護作業

本文說明如何對 Google Kubernetes Engine (GKE) 叢集節點的基礎 Compute Engine 執行個體執行主機維護作業。您只需要針對特定類型的 Compute Engine 執行個體 (包括搭載 GPU 和 TPU 的執行個體) 主動管理這項維護作業,因為這些執行個體不會進行即時遷移。本文所述策略適用於訓練和推論工作負載。如果您只需要對個別節點手動執行主機維護作業,或工作負載可容許自動主機維護作業,請參閱「瞭解如何在 GKE 上執行主機維護作業」。

這些策略會為節點群組執行主機維護作業,並視需要啟動 GKE 叢集升級。

如果工作負載節點可接受單一停機期,例如訓練工作負載的節點,請使用平行策略。如果工作負載節點可接受分批停機,同時維持大部分資源的可用性,例如推論工作負載的節點,請使用輪替策略。

使用平行策略更新訓練工作負載的節點

這項策略會同時為使用加速器的節點群組執行變更。您可以將這項策略用於訓練工作負載,也可以用於其他類型的工作負載。在這些工作負載中,執行變更時干擾最少的方法,就是讓群組中的所有節點和在這些節點上執行的工作負載,在單一時間範圍內完全停機。

這項策略包含下列高階步驟:

  1. 停止工作負載:選取節點集區,然後停止在這些節點集區上執行的工作負載,或將工作負載移至其他可用的節點。
  2. 觸發主機維護:同時將維護標籤套用至所有選取的節點,並等待所有節點完成程序。
  3. 升級 GKE 版本:變更節點的 GKE 版本。
  4. 重新啟動工作負載:所有主機維護和升級作業完成後,請重新啟動工作負載。

提供的操作說明會針對單一節點集區進行變更。不過,您可以調整步驟,同時對多個節點集區進行變更。請確保在開始這些步驟前,至少有幾個小時的時間,這些節點不需要執行這項工作負載。

為盡量減少中斷時間,同時接收基礎 Compute Engine 執行個體和 GKE 節點的重要變更,請利用這段停機時間執行主機維護和 GKE 版本升級。不過,如果您不想升級 GKE 節點版本,可以只執行主機維護作業。

使用前注意事項

開始前,請先詳閱下列注意事項:

  • 避免重新部署工作負載:為避免因 PodDisruptionBudgets 造成不必要的延遲,請完成所有步驟後再重新部署工作負載。
  • 規劃中斷時間:確保工作負載可中斷一段時間。這些步驟需要數小時才能完成,主要是因為主機維護需要時間。

同時更新所有節點

如要執行主機維護作業,並視需要升級 GKE 版本,請完成下列步驟:

  1. 準備工作負載:停止工作負載,或確保工作負載已建立近期快照或檢查點。
  2. 開始主機維護:將維護標籤套用至所選節點集區中的所有節點:

    kubectl label nodes -l cloud.google.com/gke-nodepool=NODE_POOL_NAME cloud.google.com/perform-maintenance=true --overwrite
    

    Compute Engine 會開始排空並更新基礎執行個體。這個程序可能需要幾小時才能完成。詳情請參閱「正常終止程序」。

  3. 監控主機維護狀態:維護作業完成後,GKE 會移除維護標籤。維護作業完成後,您可以在 Cloud Logging 中找到含有下列訊息的記錄:

    Maintenance window has completed for this instance. All maintenance
    notifications on the instance have been removed.
    
  4. 選用:升級 GKE 節點版本:按照操作說明升級節點的 GKE 版本

使用滾動策略更新推論工作負載的節點

這項策略說明如何手動維護執行推論工作負載的 GKE 節點。這項作業會分批更新節點,以維持服務可用性。此方法最適合可容許一定比例的副本暫時離線的工作負載。

這項策略包含下列高階步驟:

  1. 找出節點並分批處理:選擇要更新的節點集區,然後根據工作負載的容錯能力,將節點分組為適當大小的批次。
  2. 逐一處理批次:針對每個批次套用維護標籤,並監控節點批次,直到標籤移除為止。
  3. 升級 GKE 版本:所有批次完成主機維護後,請變更 GKE 節點版本。

使用前注意事項

開始前,請先詳閱下列注意事項:

  • 瞭解部署作業:如要順利部署,您必須詳細瞭解工作負載分配、副本放置位置和失敗網域。請確保整個過程都有足夠的服務容量。
  • 規劃批次大小:分批更新節點。每個批次的大小取決於工作負載的容錯能力。請考慮下列因素:
    • 每個服務模型可用的備用資源數量。
    • 副本在節點和故障網域間的分配情形。
    • PodDisruptionBudgets 可協助強制執行同時停機的 Pod 數量上限。
    • 建議:為簡化管理作業,請考慮為不同副本集區專門配置不同節點集區,以便在節點集區層級隔離故障域。
  • 計算時間限制:請考量下列時間因素:
    • 每個批次可能需要數小時才能完成主機維護步驟。
    • 計算最小批量,確保所有維護作業都能在期限內完成:
      1. MAINTENANCE_BLOCKS = floor(HOURS_TO_MAINTENANCE / 4) (其中 HOURS_TO_MAINTENANCE 是可用總時間)。
      2. MIN_PER_BATCH = TOTAL_NODE_COUNT / MAINTENANCE_BLOCKS
    • 所選批量必須大於或等於 MIN_PER_BATCH
  • 查看特定工作負載類型:針對各個設定類型,請考慮下列事項:
    • 專家混合 (MOE):確保批次處理策略為每個模型維持最低副本數。
    • 分散式服務:規劃批次時,請務必追蹤分散式設定中涉及的所有副本。
    • 多主機節點集區 (TPU、MNNVL):對於這些設定,您可能會一次關閉整個節點集區。請據此規劃多個節點集區的故障網域。

分批執行滾動式更新

如要執行滾動更新,請完成下列步驟:

  1. 找出要維護的節點:找出所有要維護的節點,並儲存這份清單。如要識別節點,請使用下列任一方法,或手動選取節點:

    • 取得叢集中使用加速器 (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 替換為節點標籤。

  2. 將節點分成批次:將識別出的節點分成等量的批次。使用先前「開始前請先考量」一節中「計算時間限制」清單項目所述的公式,判斷批量。

  3. 執行主機維護作業:針對每個批次,完成下列步驟:

    1. 選取一批節點,然後套用維護標籤:

      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

    2. 監控主機維護狀態。維護作業完成後,GKE 會移除維護標籤。維護作業完成後,您可以在「記錄」中找到含有下列訊息的記錄:

      Maintenance window has completed for this instance. All maintenance
      notifications on the instance have been removed.
      
    3. 針對每個剩餘批次重複前兩個步驟,直到完成所有批次的主機維護作業為止。

  4. 選用:升級 GKE 節點版本:只有在所有節點完成主機維護後,才執行這個步驟,以免 GKE 節點部署在尚未完成維護的主機上。請參閱下一節的說明。

升級節點的 GKE 版本

請考量要同時升級的節點數量。使用平行策略時,您會同時對整個節點集區或多個節點集區執行主機維護作業。使用滾動策略時,您會分批執行主機維護作業。請根據節點群組的大小,決定要使用哪種升級方法:

  • 平行策略:如果節點集區在每個區域的節點數不超過 20 個,請使用大量升級。如果每個節點集區在每個可用區的節點數都超過 20 個,請刪除並重新建立節點集區。
  • 輪流策略:如果批次在每個可用區、每個節點集區或更少,有 20 個節點,請使用大量升級。如果每個節點集區的每個可用區有超過 20 個節點,請刪除並重新建立節點。

使用節點數擴充升級功能

  1. 設定突增升級:使用 maxUnavailable 設定,決定節點集區中每個區域可同時無法使用的節點數量。舉例來說,如果節點集區中某個區域有 18 個節點,請將 maxUnavailable 欄位的值設為 18

    如果預留容量沒有多餘空間,建議使用這項設定。如要進一步瞭解使用這項設定的原因,請參閱「在資源受限的環境中升級」。

  2. 執行下列指令,升級節點集區。如要升級多個節點集區,請針對每個節點集區執行下列指令:

    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:叢集控制層的位置。

刪除並重新建立節點

刪除節點集區,然後使用較新版本重新建立:

  1. 刪除節點集區:

    gcloud container node-pools delete NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location CONTROL_PLANE_LOCATION
    
  2. 重新建立節點集區,並使用 --cluster-version 標記傳遞新版本。傳遞節點集區的建議自動升級目標。詳情請參閱「取得標準叢集節點集區的升級資訊」。如果叢集沒有建議的自動升級目標,請查看 GKE 版本資訊中的最新「版本更新」項目。