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

本文說明如何對 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 會在維護作業完成後移除該標籤。維護作業完成後,您可以在「記錄」中找到含有下列訊息的記錄:

      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:建議的節點集區自動升級目標。詳情請參閱「取得標準叢集節點集區的升級資訊」。如果叢集沒有建議的自動升級目標,請查看 GKE 版本資訊中的最新「版本更新」項目。
    • CONTROL_PLANE_LOCATION:叢集控制平面的位置。

刪除並重新建立節點

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

  1. 刪除節點集區:

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