關於自訂運算類別


本頁說明如何使用自訂運算類別,控管 Google Kubernetes Engine (GKE) 在自動調度叢集資源時佈建的節點屬性。本文適用於平台管理員,他們想以宣告方式定義節點的自動調度設定檔,以便在符合需求的硬體上執行特定工作負載。

運算類別總覽

在 GKE 中,運算類別是設定檔,包含一組節點屬性,GKE 會在自動調度事件期間,使用這些屬性佈建節點來執行工作負載。運算類別可針對特定最佳化目標,例如佈建高效能節點,或優先採用成本最佳化設定,以降低執行成本。自訂運算類別可讓您定義設定檔,GKE 隨後會使用這些設定檔自動調度節點,以盡量滿足特定工作負載的需求。

在 1.30.3-gke.1451000 以上版本中,您可以在 GKE Autopilot 模式和 GKE 標準模式中使用自訂運算類別,並以宣告式方法定義節點屬性和自動調度優先順序。根據預設,您可以在所有符合資格的 GKE 叢集中設定及使用自訂運算類別。

自訂運算類別的優點

自訂運算類別具有下列優點:

  • 備援運算優先順序:在每個運算類別中定義節點設定的階層,供 GKE 判斷優先順序。如果最偏好的設定無法使用,GKE 會自動選擇階層中的下一個設定。這個備援模型可確保即使運算資源無法使用,工作負載仍可在最佳化硬體上執行,且排程延遲時間最短。
  • 精細的自動調度資源控制:定義最適合特定工作負載的節點設定。在擴縮期間建立節點時,GKE 會優先採用這些設定。
  • 宣告式基礎架構設定:採用宣告式基礎架構管理方法,讓 GKE 自動建立符合特定工作負載需求的節點。
  • 主動遷移:如果所在位置有更合適的機器設定可用的運算資源,GKE 會自動將工作負載遷移至使用偏好設定的新節點。
  • 成本最佳化:優先採用高成本效益的節點類型,例如 Spot VM,以減少叢集支出。
  • 命名空間的預設運算類別:在每個 Kubernetes 命名空間中設定預設運算類別,即使工作負載未要求特定運算類別,也能在最佳化硬體上執行。
  • 自訂節點合併門檻:定義節點的自訂資源用量門檻。如果特定節點的資源用量低於門檻,GKE 會嘗試將工作負載整合到類似的可用節點,並縮減資源用量不足的節點。

自訂運算類別的用途

在下列情境中,建議使用自訂運算類別:

  • 您想在特定 GPU 或 TPU 設定上執行 AI/機器學習工作負載。
  • 您想為特定團隊執行的工作負載設定預設硬體設定,以減輕應用程式運算子的負擔。
  • 您執行的工作負載在特定 Compute Engine 機器系列或硬體設定上,可發揮最佳效能。
  • 您想宣告符合特定業務需求的硬體設定,例如高效能、最佳化成本或高可用性。
  • 您希望 GKE 在運算資源無法使用時,以階層式方式回退至使用特定硬體設定,確保工作負載一律在符合需求的機器上執行。
  • 您希望集中決定企業機群的最佳設定,以便更準確地預測費用,並更可靠地執行工作負載。
  • 您想集中指定 GKE 應使用哪些 Compute Engine 容量預留項目,為特定工作負載佈建新節點。

自訂運算類別的運作方式

自訂運算類別是 Kubernetes 自訂資源,可佈建Google Cloud 基礎架構。您可以在叢集中定義 ComputeClass 物件,然後在工作負載中要求該運算類別,或將該運算類別設為 Kubernetes 命名空間的預設值。當相符的工作負載需要新的基礎架構時,GKE 會根據您在運算類別定義中設定的優先順序,佈建新的節點。

您在運算類別中設定的屬性,會定義 GKE 如何設定新節點來執行工作負載。修改現有運算類別時,GKE 為該運算類別建立的所有後續節點都會使用修改後的設定。GKE 不會追溯變更現有節點的設定,以符合您的修改內容。

為確保自訂運算類別能為車隊提供最佳效能,請參考下列規範:

  • 瞭解機群的運算需求,包括任何應用程式專屬的硬體需求。
  • 決定主題,引導各個運算類別的設計。舉例來說,效能最佳化運算類別可能會有備援策略,只使用高 CPU 機器類型。
  • 決定最符合工作負載需求的 Compute Engine 機器系列和機器類型。詳情請參閱機器系列資源與比較指南
  • 在每個運算類別中規劃備援策略,確保工作負載一律在採用類似機器設定的節點上執行。舉例來說,如果 N4 機器系列無法使用,您可以改用 N2 機器。

查看完整的自訂資源定義

如要查看 ComputeClass 自訂資源的最新自訂資源定義 (CRD),包括所有欄位及其關係,請參閱 ComputeClass 參考說明文件

您也可以執行下列指令,查看叢集中的 CRD:

kubectl describe crd computeclasses.cloud.google.com

規劃自訂運算類別

如要在叢集中有效規劃、部署及使用自訂運算類別,請按照下列步驟操作:

  1. 選擇備援運算優先順序:定義一系列規則,控管 GKE 為運算類別建立的節點屬性。
  2. 設定 GKE Standard 節點集區和運算類別:如果是 Standard 模式叢集,請執行必要設定步驟,以便搭配節點集區使用運算類別。
  3. 定義沒有優先順序規則適用時的擴縮行為: 選擇性地告知 GKE,如果無法佈建符合優先順序規則的節點,該怎麼做。
  4. 設定節點整併的自動調度資源參數:告知 GKE 何時整併工作負載,以及移除使用率偏低的節點。
  5. 設定主動遷移至優先順序較高的節點:(選用) 在硬體可用時,告知 GKE 將工作負載移至偏好的節點。
  6. 使用 Compute Engine 預留項目:視需要告知 GKE 在建立新節點時,使用現有的 Compute Engine 可用區預留項目。

選擇備用運算優先順序

使用自訂運算類別的主要優點是,當偏好的節點因資源耗盡和配額限制等因素而無法使用時,您可以控管備援策略。

如要建立備援策略,請在自訂運算類別中定義優先順序規則清單。當叢集需要擴充時,GKE 會優先建立符合優先順序最高規則的節點。如果 GKE 無法建立這些節點,就會改用下一個優先順序規則,重複這個程序,直到 GKE 成功擴充叢集,或用盡所有規則為止。如果所有規則都用盡,GKE 會根據定義沒有優先順序規則時的縮放行為一文所述的預設或指定行為建立節點。

不同的 Compute Engine 機器系列支援不同的技術和功能。較舊的機器系列可能不支援與新一代相同的儲存空間類型。如果您執行依賴永久資料的有狀態工作負載,請避免使用跨多代機器系列的運算類別。如果 GKE 將工作負載放在不支援該儲存空間類型的機器類型上,工作負載可能就無法存取持續性資料。如要瞭解詳情,請在機器系列比較表中,篩選出特定儲存空間類型。

優先順序規則

您可以在自訂資源的 ComputeClass spec.priorities 欄位中定義優先順序規則priorities 欄位中的每項規則都會說明要佈建的節點屬性。GKE 會依序處理 priorities 欄位,也就是說,欄位中的第一個項目是節點佈建的最高優先順序。

優先順序規則分為兩種類型:

  • 宣告式規則類型:使用節點特徵描述要佈建的節點

  • 節點集區規則類型:在 GKE Standard 叢集中,提供與 GKE 應佈建節點的運算類別相關聯的手動建立節點集區清單。

宣告式優先順序規則

透過宣告式優先順序規則,您可以指定機器屬性,例如機器系列或類型、Spot VM、加速器選項、儲存空間選項預留項目和資源下限,供 GKE 在佈建節點時使用。如需支援的完整欄位集,請參閱 ComputeClass CRD 參考資料

machineFamily 設定

machineFamily 欄位接受 Compute Engine 機器系列,例如 n2c3。如未指定,則預設值為 e2

您可以搭配 machineFamily 欄位使用其他 spec.priorities fields,以宣告方式定義運算需求,例如:

  • spot:Spot VM。預設值為 false
  • minCores:每個節點的最低 vCPU 數。預設值為 0
  • minMemoryGb:每個節點的最低記憶體容量。預設值為 0
  • storage.bootDiskKMSKey:用於開機磁碟加密的 Cloud Key Management Service 金鑰路徑。
  • storage.secondaryBootDisks:用於預先載入 GKE 節點資料的永久磁碟,例如機器學習 (ML) 模型或容器映像檔。需要 GKE 1.31.2-gke.1105000 以上版本。如要為叢集設定次要開機磁碟,請參閱設定次要開機磁碟
    • storage.secondaryBootDisks.diskImageName:要預先載入的磁碟映像檔名稱。
    • storage.secondaryBootDisks.project:磁碟映像檔所屬的專案名稱。如未指定這個值,預設值為叢集專案。
    • storage.secondaryBootDisks.mode:應使用次要開機磁碟的模式。如果這個值設為 CONTAINER_IMAGE_CACHE,次要開機磁碟會做為容器映像檔快取。這個值必須等於 CONTAINER_IMAGE_CACHEMODE_UNSPECIFIED。如未指定此值,預設值為 MODE_UNSPECIFIED

以下範例顯示使用 machineFamily 的優先順序規則:

priorities:
- machineFamily: n2
  spot: true
  minCores: 16
  minMemoryGb: 64
  storage:
    bootDiskKMSKey: projects/example/locations/us-central1/keyRings/example/cryptoKeys/key-1
    secondaryBootDisks:
    - diskImageName: pytorch-mnist
      project: k8s-staging-jobset
machineType 設定

machineType 欄位接受 Compute Engine 預先定義的機器類型,例如 n2-standard-32

除了 machineType 欄位,您也可以指定其他 spec.priorities 欄位,以宣告方式定義運算需求,例如:

  • spot:使用 Spot VM。預設值為 false
  • storage:設定節點儲存空間。
    • storage.bootDiskType:開機磁碟類型。
    • storage.bootDiskKMSKey:用於開機磁碟加密的 Cloud KMS 金鑰路徑。
    • storage.bootDiskSize:節點開機磁碟的大小 (單位為 GB)。
    • storage.localSSDCount:要附加至節點的本機 SSD 數量。如要指定,不得小於 1

以下範例顯示使用 machineType 佈建 n2-standard-32 機器類型的優先順序規則:

priorities:
- machineType: n2-standard-32
  spot: true
  storage:
    bootDiskType: pd-balanced
    bootDiskSize: 250
    localSSDCount: 2
    bootDiskKMSKey: projects/example/locations/us-central1/keyRings/example/cryptoKeys/key-1
GPU 設定

如要在優先順序規則中選取 GPU,請在優先順序規則的 gpu 欄位中,指定 GPU 的類型、數量和 driverVersion (選用)。系統支援下列欄位:

  • gpu.type:GPU 類型,例如 nvidia-l4。詳情請參閱「使用 Autopilot 或 Standard 選擇 GPU 支援」。
  • gpu.count:要附加的 GPU 數量。如要瞭解各 GPU 類型支援的數量,請參閱支援的 GPU 數量
  • gpu.driverVersion:要安裝的 NVIDIA 驅動程式版本。必須為 defaultlatest。需要 GKE 1.31.1-gke.1858000 以上版本。

您也可以一併指定其他 spec.priorities 欄位,例如 Spot VM、儲存空間選項預訂,與 gpu 欄位搭配使用。

以下範例顯示 GPU 的規則:

priorities:
- gpu:
    type: nvidia-l4
    count: 1
  storage:
    secondaryBootDisks:
    - diskImageName: big-llm
      project: k8s-llm
  spot: true
TPU 設定

需要 GKE 1.31.2-gke.1518000 以上版本

如要在優先規則中選取 TPU,請在優先規則的 tpu 欄位中指定 TPU 的類型、數量和拓撲。以下均為必填欄位:

您也可以在優先順序規則中,於 tpu 欄位旁指定其他 spec.priorities 欄位,例如:

  • spot:使用 Spot VM。預設值為 false
  • storage:設定節點儲存空間。
    • storage.bootDiskType:開機磁碟類型。
    • storage.bootDiskKMSKey:用於開機磁碟加密的 Cloud KMS 金鑰路徑。
    • storage.bootDiskSize:節點開機磁碟的大小 (單位為 GB)。
  • reservations:使用 Compute Engine 預留項目。詳情請參閱「使用 Compute Engine 預留資源」一節。

以下範例顯示 TPU 的規則:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: tpu-class
spec:
  priorities:
  - tpu:
      type: tpu-v5p-slice
      count: 4
      topology: 4x4x4
    reservations:
      specific:
      - name: tpu-reservation
        project: reservation-project
      affinity: Specific
  - spot: true
    tpu:
      type: tpu-v5p-slice
      count: 4
      topology: 4x4x4
  nodePoolAutoCreation:
    enabled: true

這個範例定義了下列備援行為:

  1. GKE 會嘗試從 reservation-project 專案取用名為 tpu-reservation 的共用 Compute Engine 預留項目,佈建 16 節點的多主機 TPU v5p 節點。
  2. 如果預留項目沒有可用的 TPU,GKE 會嘗試在 Spot VM 上佈建 16 節點的多主機 TPU v5p 配量。
  3. 如果無法滿足上述任何規則,GKE 會遵循「定義不適用優先順序規則時的縮放行為」一節中的邏輯。

將 TPU 自訂運算類別部署至叢集後,請在工作負載中選取該自訂運算類別:

加速器和機器形狀規格

除非您搭配預訂使用,否則宣告式加速器設定不需要明確指定 machineTypemachineFamily 欄位。

節點集區優先順序規則

nodepools 欄位會取得現有節點集區的清單,GKE 會嘗試在這些節點集區中建立待處理的 Pod。GKE 不會依序處理這個欄位中的值。您無法在同一優先級規則項目中,將其他 spec.priorities 欄位與 nodepools 欄位搭配使用,因為含有 nodepools 欄位的規則本質上並非宣告式。這個欄位僅支援 GKE Standard 模式。如需使用詳情,請參閱在運算類別定義中指定節點集區

GKE 如何使用優先順序規則建立節點

部署要求運算類別的工作負載時,如果需要新節點,GKE 會依序處理 ComputeClass 規格的 priorities 欄位中的規則清單。

舉例來說,請參考下列規格:

spec:
  ...
  priorities:
  - machineFamily: n2
    spot: true
    minCores: 64
  - machineFamily: n2
    spot: true
  - machineFamily: n2
    spot: false

部署要求具有這些優先順序規則的運算類別的工作負載時,GKE 會依下列方式比對節點:

  1. GKE 會將 Pod 放置在與這個運算類別相關聯的任何現有節點上。
  2. 如果現有節點無法容納 Pod,GKE 會佈建使用 N2 系列機器的全新節點,這些節點是 Spot VM,且至少有 64 個 vCPU。
  3. 如果區域中沒有至少 64 個 vCPU 的 N2 Spot VM,GKE 會佈建新的節點,使用可容納 Pod 的 N2 Spot VM,不論核心數量為何。
  4. 如果該區域沒有可用的 N2 Spot VM,GKE 會佈建新的隨選 N2 VM。
  5. 如果無法滿足上述任何規則,GKE 會遵循「定義不適用優先順序規則時的縮放行為」一節中的邏輯。

優先規則的預設值

您可以為 ComputeClass 規格優先順序規則中的部分欄位設定預設值。如果特定規則中省略了對應的欄位,系統就會套用這些預設值。您可以在 ComputeClass 規格中使用 priorityDefaults 欄位,設定這些預設值。

priorityDefaults 欄位有下列限制:

  • 需要 GKE 1.32.1-gke.1729000 以上版本。
  • 不相容於不含任何欄位的 nodepools 優先順序規則。

如要進一步瞭解可設定的預設值類型,請參閱 ComputeClass CustomResourceDefinition 中的 priorityDefaults 一節。

GKE Standard 節點集區和運算類別

如果您使用 GKE 標準模式,可能必須手動設定,才能確保運算類別 Pod 依預期排定時間。

設定手動建立的節點集區,以供運算級別使用

如果 GKE Standard 叢集有您手動建立的節點集區,且未啟用節點自動佈建功能,您必須設定這些節點集區,將其與特定運算類別建立關聯。GKE 只會在與特定運算類別相關聯的節點集區中,排定要求該運算類別的 Pod。節點自動佈建功能建立的 GKE Autopilot 模式和 GKE Standard 模式節點集區,會自動為您執行這項設定。

如要將手動建立的節點集區與運算類別建立關聯,請在建立或更新節點集區時,指定 --node-labels 旗標和 --node-taints 旗標,將節點標籤節點汙點新增至節點集區,如下所示:

  • 節點標籤cloud.google.com/compute-class=COMPUTE_CLASS
  • Taintcloud.google.com/compute-class=COMPUTE_CLASS:NoSchedule

在這些屬性中,COMPUTE_CLASS 是自訂運算類別的名稱。

舉例來說,下列指令會一併更新現有節點集區,並將節點集區與 dev-class 計算機類別建立關聯:

gcloud container node-pools update dev-pool \
    --cluster=example-cluster \
    --node-labels="cloud.google.com/compute-class=dev-class"

gcloud container node-pools update dev-pool \
    --cluster=example-cluster \
    --node-taints="cloud.google.com/compute-class=dev-class:NoSchedule"

您可以將叢集中的每個節點集區與一個自訂運算類別建立關聯。GKE 在這些手動建立的節點集區上排程的 Pod,只會在自動調度資源事件期間,觸發這些節點集區內的節點建立作業。

節點自動佈建和運算級別

您可以搭配自訂運算類別使用節點自動佈建功能,讓 GKE 根據優先順序規則自動建立及刪除節點集區。

如要搭配運算類別使用節點自動佈建功能,請完成下列步驟:

  1. 確認您已在叢集中啟用節點自動佈建功能。
  2. nodePoolAutoCreation 欄位和 enabled: true 值新增至 ComputeClass 規格。

GKE 接著就能將使用運算類別的 Pod 放置到新節點集區,並設定節點自動佈建。GKE 會根據叢集大小和 Pod 需求等因素,決定要擴充現有節點集區,還是建立新的節點集區。如果 Pod 的運算級別未設定節點自動佈建功能,則只會繼續擴充現有節點集區。

您可以在同一個叢集中,同時使用與節點自動佈建互動的運算類別,以及與手動建立節點集區互動的運算類別。

請參考下列與節點自動佈建的互動:

  • 您無法使用機器系列Spot VM 節點選取器,因為這些選取器與運算類別行為衝突。如果 Pod 要求運算類別,同時要求 Spot VM 或特定機型系列,GKE 會拒絕這類 Pod。
  • 您可以為使用 nodepools 欄位參照現有節點集區的運算類別,設定節點自動佈建功能。節點自動佈建功能會依序處理優先順序,並嘗試向上擴充現有節點集區,以放置 Pod。

假設叢集同時具有手動建立的節點集區和節點自動佈建功能,請參考下列範例:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: my-class
spec:
  priorities:
  - nodepools: [manually-created-pool]
  - machineFamily: n2
  - machineFamily: n2d
  nodePoolAutoCreation:
    enabled: true

在本範例中,GKE 會嘗試執行下列操作:

  1. manually-created-pool 節點集區中建立新節點。
  2. 在現有的 N2 節點集區中佈建 N2 節點,或建立新的節點集區。
  3. 如果 GKE 無法建立 N2 節點,會嘗試擴大現有 N2D 節點集區,或建立新的 N2D 節點集區。

在運算類別定義中指定特定節點集區

priorities.nodepools 欄位可讓您指定手動建立的節點集區清單,GKE 會嘗試在這些集區中排定 Pod,但不會指定順序。這適用於使用叢集自動調度資源的 GKE Standard 叢集。這個欄位僅支援節點集區清單,您無法在同一優先順序規則中指定其他機器屬性,例如機器系列。部署要求具備具名節點集區的運算類別的工作負載時,GKE 會嘗試在這些節點集區中排定待處理的 Pod。GKE 可能會在這些節點集區中建立新節點,以放置 Pod。

您在 priorities.nodepools 欄位中指定的節點集區必須與該運算類別建立關聯,方法是使用節點標籤和節點汙點,如「為運算類別設定手動建立的節點集區」一節所述。

您在 nodepools 欄位中指定的節點集區清單沒有優先順序。如要設定具名節點集區的回溯順序,您必須指定多個個別的 priorities.nodepools 項目。舉例來說,請考量下列規格:

spec:
  ...
  priorities:
  - nodepools: [pool1, pool2]
  - nodepools: [pool3]

在本例中,GKE 會先嘗試將要求這個運算類別的待處理 Pod,放置在標示有該運算類別的節點集區現有節點上。如果現有節點無法使用,GKE 會嘗試在 pool1pool2 中佈建新節點。如果 GKE 無法在這些節點集區中佈建新節點,GKE 會嘗試在 pool3 中佈建新 Pod。

定義不適用任何優先順序規則時的縮放行為

如果沒有任何節點符合優先順序規則,您可以透過 ComputeClass 自訂資源指定 GKE 應執行的動作。規格中的 whenUnsatisfiable 欄位支援下列值。

  • ScaleUpAnyway:建立使用叢集預設機器設定的新節點。在 1.33 之前的 GKE 版本中,如果省略這個欄位,系統會預設採用這種行為。

    GKE 會採取下列其中一項動作:

    • 在 Autopilot 叢集中,無論節點機器設定為何,GKE 都會將 Pod 放在新節點或現有節點上。
    • 在未使用節點自動佈建功能的 Standard 叢集中,GKE 會嘗試調度資源,擴充任何手動建立的節點集區,這些節點集區定義的標籤和汙點與指定的運算類別相符。
    • 在啟用節點自動佈建功能的 Standard 叢集中,GKE 可能會建立使用預設 E2 系列機器的節點集區,以放置 Pod。
  • DoNotScaleUp:將 Pod 留在 Pending 狀態,直到有符合運算類別需求的節點可用為止。在 GKE 1.33 以上版本中,如果省略這個欄位,系統會預設採用這種行為。

設定節點整併的自動調度資源參數

根據預設,GKE 會移除工作負載執行量偏低的節點,並將這些工作負載整合到有容量的其他節點。對於所有運算級別,這都是預設行為,因為使用運算級別的所有叢集都必須使用叢集自動調度器,或是 Autopilot 叢集。在節點整合期間,GKE 會清空使用率偏低的節點,在其他節點上重新建立工作負載,然後刪除清空的節點。

節點移除的時間和條件取決於自動調度資源設定檔。您可以在自訂運算類別定義中使用 autoscalingPolicy 區段,微調資源使用率不足的觸發門檻,以移除節點並整合工作負載。您可以微調下列參數:

  • consolidationDelayMinutes:GKE 移除使用率不足的節點前等待的分鐘數
  • consolidationThreshold:CPU 和記憶體的使用率門檻,以節點可用資源的百分比表示。只有在資源使用率低於這個門檻時,GKE 才會考慮移除節點。
  • gpuConsolidationThreshold:GPU 使用率門檻,以節點可用資源的百分比表示。只有在資源使用率低於這個門檻時,GKE 才會考慮移除節點。建議將此值設為 1000,讓 GKE 整合所有未充分運用所連 GPU 的節點。

請見如下範例:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: my-class
spec:
  priorities:
  - machineFamily: n2
  - machineFamily: n2d
  autoscalingPolicy:
    consolidationDelayMinutes: 5
    consolidationThreshold: 70

在這個設定中,GKE 會在五分鐘後移除未使用的節點,且只有在節點的 CPU 和記憶體使用率都低於 70% 時,才會成為整併候選節點。

設定主動遷移至優先順位較高的節點

在自訂運算類別中,您可以選擇啟用主動遷移功能,讓系統自動將運算類別備援優先順序清單中優先順序較低的現有節點,替換為優先順序較高的新節點。即使 GKE 原本必須在較不偏好的節點上執行這些 Pod,這項設定也能確保所有執行的 Pod 最終都會在該運算類別最偏好的節點上執行。

進行中的遷移作業會根據運算類別優先順序規則建立新節點,然後排空並刪除過時的低優先順序節點。為盡量減少工作負載中斷情形,遷移作業會逐步進行。 使用即時遷移功能時,請注意以下幾點:

  • 進行中的遷移作業不會遷移儲存在永久儲存空間中的資料,例如 Compute Engine 永久磁碟。為盡量降低資料遺失風險,請勿在有狀態工作負載使用的運算類別中啟用主動遷移。
  • 如果您在 Standard 叢集上啟用節點自動佈建功能,當現有節點集區不符合自訂運算類別中定義的較高優先順序條件時,主動遷移作業可能會觸發新節點集區的建立作業。
  • 為避免重要工作負載中斷,進行中的遷移作業不會移動下列 Pod:
    • 如果移動 Pod 會超出 PodDisruptionBudget,則無法移動已設定 PodDisruptionBudget 的 Pod。
    • 具有 cluster-autoscaler.kubernetes.io/safe-to-evict: "false" 註解的 Pod。
  • 使用永久磁碟區和區域資源 (例如 Hyperdisk) 的工作負載可能無法順利進行主動遷移。區域限制和部分 Hyperdisk 產品的機器類型限制,可能會降低有效遷移的成效。此外,部分有狀態的工作負載可能無法承受主動遷移作業造成的干擾。

請參考下列運算類別規格範例,其中 N2 節點的優先順序高於 N2D 節點:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: my-class
spec:
  priorities:
  - machineFamily: n2
  - machineFamily: n2d
  activeMigration:
    optimizeRulePriority: true

如果您使用這個運算類別部署 Pod 時,N2 節點無法使用,GKE 會改用 N2D 節點。如果稍後可佈建 N2 節點 (例如配額增加,或 N2 VM 在您所在位置推出),GKE 會建立新的 N2 節點,並逐步將 Pod 從現有 N2D 節點遷移至新的 N2 節點。GKE 隨即會刪除過時的 N2D 節點。

使用 Compute Engine 預留項目

適用於 GKE 1.31.1-gke.2105000 以上版本

如果您使用 Compute Engine 容量預留,確保特定Google Cloud 區域的硬體可用性,則可以在自訂運算類別中設定每個備援優先順序,讓 GKE 在建立新節點時使用預留容量。

在自訂運算類別中使用預留資源時,必須符合下列條件:

  • 標準模式叢集必須使用節點自動佈建功能,GKE 才能使用預留項目建立新節點。詳情請參閱「節點自動佈建和運算類別」一節。在叢集中手動建立節點集區時,您也可以繼續使用預留項目。
  • 只有在定義 machineTypemachineFamily 時,才能使用非 TPU 預留項目。
  • 設定本機 SSD 的運算類別必須使用 machineType 優先順序規則,而非 machineFamily。詳情請參閱「machineType 規則類型」一節。
  • 指定 machineType 保留項目的運算類別必須明確包含 localSSDCount: 欄位,該類別已附加本機 SSD。

請參考下列運算類別規格範例,其中優先使用特定共用預留項目,以便佈建 a3-highgpu-1g 執行個體。如果優先順序較高的執行個體類型無法使用,GKE 會改用規格中任何相符的預訂:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: accelerator-reservations
spec:
  nodePoolAutoCreation:
    enabled: true
  priorities:
  - machineType: a3-highgpu-1g
    storage:
      localSSDCount: 2
    gpu:
      type: nvidia-h100-80gb
      count: 1
    reservations:
      specific:
      - name: a3-shared-reservation
        project: reservation-project
      affinity: Specific
  - machineType: a3-highgpu-1g
    storage:
      localSSDCount: 2
    gpu:
      type: nvidia-h100-80gb
      count: 1
    reservations:
      affinity: AnyBestEffort
  whenUnsatisfiable: DoNotScaleUp

如果您部署使用 accelerator-reservations 計算機類型的 Pod,GKE 會先嘗試使用 a3-shared-reservation 預留項目,建立新的 a3-highgpu-1g 執行個體來執行 Pod。如果這個特定預留項目沒有可用容量,GKE 會嘗試使用任何相符的預留項目,擴充 a3-highgpu-1g 個執行個體。如果無法存取任何預訂項目,GKE 會改用 a3-highgpu-1g Spot VM。最後,如果沒有可用的 Spot VM,擴充作業就會失敗。

在本範例中,由於 a3-highgpu-1g 機型包含本機 SSD,因此兩個優先順序規則都明確參照保留項目,且都需要 localSSDCount: 欄位。

以下範例顯示共用的特定預留項目,該項目會依序改用 Spot VM,最後再改用隨需 VM:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: shared-specific-reservations
spec:
  nodePoolAutoCreation:
    enabled: true
  priorities:
  - machineFamily: n2
    reservations:
      specific:
      - name: n2-shared-reservation
        project: reservation-project
      affinity: Specific
  - machineFamily: n2
    spot: true
  - machineFamily: n2
  whenUnsatisfiable: DoNotScaleUp

您可以使用的預訂類型如下:

  • 特定單一專案預留項目:設定下列欄位:

    • reservations.specific.name:預訂名稱。
    • reservations.affinity:必須為 Specific
  • 特定共用預留項目:設定下列欄位:

    • reservations.specific.name:預訂名稱。
    • reservations.specific.project:擁有預留資源的專案 ID。
    • reservations.affinity:必須為 Specific
  • 任何相符的預訂:設定下列欄位:

    • reservations.affinity:必須為 AnyBestEffort
    • 請勿設定預留名稱或專案。

TPU 預訂需要特定親和性。系統不支援 reservations.affinity: AnyBestEffort

如果 GKE 無法在預留項目中找到可用容量,結果會因在運算類別優先順序規則中選取的預留項目類型而異,如下所示:

  • 特定預留項目:GKE 會嘗試運算類別中的下一個優先順序規則。
  • 任何相符的預留項目:GKE 會嘗試佈建符合該優先順序規則需求的隨選節點。如果 GKE 無法佈建隨選節點,GKE 會嘗試運算類別中的下一個優先順序規則。

如果 GKE 無法滿足任何優先順序規則的運算類別需求,就會發生沒有規則適用時的行為

使用特定預留項目模塊

從 GKE 1.31.4-gke.1072000 版開始,您可以在硬體支援的預留項目中,指定特定預留區塊。這項功能適用於 A3 UltraA4 機型。

如要使用特定預訂區塊,請按照這個範例設定 ComputeClass 資源:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: specific-reservations
spec:
  nodePoolAutoCreation:
    enabled: true
  priorities:
  - machineFamily: a3
    gpu:
      type: nvidia-h200-141gb
      count: 8
    reservations:
      specific:
      - name: a3ultra-specific-reservation
        reservationBlock:
          name: RESERVATION_BLOCK_NAME
      affinity: Specific

RESERVATION_BLOCK_NAME 替換為目標預訂區塊名稱。

使用這項功能時,請注意下列事項:

  • 這項功能僅適用於單一或共用專案中的特定預訂

自訂節點系統設定

您可以在 ComputeClass 規格中使用 nodeSystemConfig 欄位,自訂 kubelet 和 Linux 核心中的特定參數。您可以在定義 Compute Engine 機器系列或機器類型的任何優先順序規則中,指定這個欄位。您也可以為優先規則中省略的任何節點系統設定欄位,設定預設全域值,方法是在運算類別的 priorityDefaults 欄位中加入 nodeSystemConfig 欄位。

這項功能適用於 GKE 1.32.1-gke.1729000 以上版本。

如需詳細資訊,請參閱以下頁面:

在工作負載中要求運算類別

如要使用自訂運算類別,Pod 必須在 Pod 規格中透過 nodeSelector 明確要求該運算類別。您可以選擇將運算類別設為特定 Kubernetes 命名空間的預設值。除非 Pod 要求使用其他運算類別,否則該命名空間中的 Pod 會使用該運算類別。

舉例來說,下列資訊清單會要求 cost-optimized 計算類別:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: custom-workload
spec:
  replicas: 2
  selector:
    matchLabels:
      app: custom-workload
  template:
    metadata:
      labels:
        app: custom-workload
    spec:
      nodeSelector:
        cloud.google.com/compute-class: cost-optimized
      containers:
      - name: test
        image: gcr.io/google_containers/pause
        resources:
          requests:
            cpu: 1.5
            memory: "4Gi"

後續步驟