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

本文說明如何對 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. 啟動及監控主機維護作業:

    • 使用分組維護排程的預留項目子模塊:使用對應的 gcloud compute reservations 子指令,觸發預留項目、預留項目模塊或預留項目子模塊的維護作業。舉例來說,下列指令會啟動子區塊的維護作業:

      gcloud compute reservations sub-blocks perform-maintenance RESERVATION_NAME \
          --block-name=BLOCK_NAME \
          --sub-block-name=SUB_BLOCK_NAME \
          --zone=ZONE
      

      更改下列內容:

      • RESERVATION_NAME:預留項目名稱。
      • BLOCK_NAME:預留區塊的名稱。
      • SUB_BLOCK_NAME:預留子區塊的名稱。
      • ZONE:預留項目所在的可用區。

      Compute Engine 會同時開始排除及更新子區塊中的所有執行個體。這項程序可能需要幾小時。

      如要監控,請查看預留資源中的 upcomingGroupMaintenance 中繼資料欄位,瞭解維護狀態。詳情請參閱「查看維護狀態」。

    • 使用獨立維護排程的執行個體:將 cloud.google.com/perform-maintenance=true 標籤套用至節點集區中的節點,為隨需執行個體或不使用子區塊的預留項目觸發維護作業:

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

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

      如要監控維護狀態,請查看節點。維護作業完成後,GKE 會移除維護標籤 (如有套用)。維護作業完成後,您可以在 Cloud Logging 中找到包含下列訊息的記錄:

      Maintenance window has completed for this instance. All maintenance
      notifications on the instance have been removed.
      
  3. 選用:升級 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. 找出要維護的預留項目:找出容量預留項目名稱,以及 GKE 叢集使用的預留項目區塊或預留項目子區塊。如要執行這項操作,請使用 GKE 節點標籤和 gcloud compute reservations 指令執行查詢:

    1. 列出預留項目名稱,以及節點集區中節點的實體區塊和子區塊拓撲 ID:

      kubectl get nodes -l cloud.google.com/gke-nodepool=NODE_POOL_NAME \
          -o custom-columns='NAME:.metadata.name,RESERVATION:.metadata.labels.cloud\.google\.com/reservation-name,BLOCK_ID:.metadata.labels.cloud\.google\.com/gce-topology-block,SUBBLOCK_ID:.metadata.labels.cloud\.google\.com/gce-topology-subblock'
      

      將 NODE_POOL_NAME 替換為節點集區名稱。

      請記下輸出值:預留項目名稱 (例如 nvidia-gb300-m7kp2xq9vd4j1)、區塊 ID (例如 3f2a8c9b1d4e0756f8a2b3c1d9e4f0a5) 和子區塊 ID (例如 e7b91f4a3c2d58069e1a4b7f3d2c8056)。

    2. 如要找出預留項目區塊資源名稱,請使用預留項目名稱查詢 Compute Engine 預留項目區塊清單,並依區塊 ID 篩選:

      gcloud compute reservations blocks list RESERVATION_NAME \
          --zone=ZONE \
          --project=PROJECT_ID \
          --filter="physicalTopology.block=BLOCK_ID"
      

      更改下列內容:

      • RESERVATION_NAME:預留項目名稱。
      • ZONE:預留項目所在的可用區。
      • PROJECT_ID:預留項目所在的專案 ID。
      • BLOCK_ID:從節點標籤擷取的區塊 ID。

      記下輸出內容中的區塊名稱。

    3. 如要找出預留項目子模塊資源名稱,請使用預留項目名稱和模塊名稱查詢預留項目子模塊清單,並依子模塊 ID 篩選:

      gcloud compute reservations sub-blocks list RESERVATION_NAME \
          --block-name=BLOCK_NAME \
          --zone=ZONE \
          --project=PROJECT_ID \
          --filter="physicalTopology.subBlock=SUBBLOCK_ID"
      

      更改下列內容:

      • RESERVATION_NAME:預留項目名稱。
      • BLOCK_NAME:預留區塊資源名稱。
      • ZONE:預留項目所在的可用區。
      • PROJECT_ID:預留項目所在的專案 ID。
      • SUBBLOCK_ID:從節點標籤擷取的子模塊 ID。

      輸出內容會顯示相符預留子區塊的詳細資料,包括資源名稱。

  2. 將預留項目分成多個批次:將確定的運算資源預留項目子區塊分成多個等量批次。請使用先前「開始前的注意事項」一節中「計算時間限制」清單項目所述的公式,決定批次大小。每個批次對應一或多個預留子區塊,且每個批次的大小至少須與子區塊相同。

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

    1. 選取一批預留子區塊,並觸發主機維護作業。您可以對預留項目、預留項目區塊或預留項目子模塊觸發維護作業。如果是 A4X、A4X Max、TPU v6e 和 TPU7x 等機型,您必須透過這種方式觸發維護作業。維護作業會以子模塊群組為單位執行。使用 gcloud compute reservations sub-blocks perform-maintenance 指令:

      gcloud compute reservations sub-blocks perform-maintenance RESERVATION_NAME \
          --block-name=BLOCK_NAME \
          --sub-block-name=SUB_BLOCK_NAME \
          --zone=ZONE
      

      更改下列內容:

      • RESERVATION_NAME:預留項目名稱。
      • BLOCK_NAME:預留區塊的名稱。
      • SUB_BLOCK_NAME:預留子區塊的名稱。
      • ZONE:預留項目所在的可用區。

      Compute Engine 會同時開始排除及更新子區塊中的所有執行個體。這項程序可能需要幾小時。

    2. 如要監控維護狀態,請查看預留資源中的 upcomingGroupMaintenance 中繼資料欄位。詳情請參閱「查看預留項目的維護狀態」。

    3. 針對其餘各批次重複上述步驟,直到所有批次的主機維護作業都完成為止。

  4. 選用:升級 GKE 節點版本:請務必等到所有預留子區塊的主機維護作業完成後,再執行這個步驟,以免 GKE 節點部署在尚未完成維護作業的主機上。請按照操作說明升級節點的 GKE 版本。

批次更新節點

如要對不支援子區塊的隨需執行個體或預留項目,分批執行主機滾動式維護作業,請完成下列步驟:

  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. 選取一批節點,並使用 instances API 套用維護標籤,在執行個體層觸發維護作業:

      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。

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

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

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

  4. 選用:升級 GKE 節點版本:請務必等到所有節點的主機維護作業完成後,再執行這個步驟,以免 GKE 節點部署在尚未完成維護作業的主機上。請按照操作說明升級節點的 GKE 版本。

升級節點的 GKE 版本

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

  • 平行策略:如果節點集區在每個可用區的節點數量不超過 100 個,請使用激增升級。如果每個節點集區在各可用區的節點數量超過 100 個,請刪除並重新建立節點集區。
  • 滾動式策略:如果每個可用區、每個節點集區或更小範圍的批次有 100 個節點,請使用激增升級。如果每個可用區、每個節點集區的批次超過 100 個節點,請刪除並重新建立節點。

使用突增升級

  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 旗標傳遞新版本。傳遞節點集區的建議自動升級目標。詳情請參閱「取得 Standard 叢集節點集區的升級資訊」。如果叢集沒有建議的自動升級目標,請查看 GKE 版本資訊中的最新版本更新項目。