您可以建立自己的 ComputeClass,控管 Google Kubernetes Engine (GKE) 在叢集自動調度資源時佈建的節點屬性。本文適用於平台管理員,他們想以宣告方式定義節點的自動調整設定檔,確保特定工作負載在符合需求的硬體上執行。如要進一步瞭解 ComputeClass,請參閱「關於 GKE ComputeClass」。
ComputeClasses 總覽
在 GKE 中,ComputeClass 是由一組節點屬性組成的設定檔,GKE 會在自動調度資源事件期間,使用這些屬性佈建節點,以執行工作負載。ComputeClass 可指定特定最佳化項目,例如佈建高效能節點,或優先採用成本最佳化設定,以降低執行成本。自訂 ComputeClass 可讓您定義設定檔,GKE 隨後會使用這些設定檔自動調度節點,以盡量滿足特定工作負載的需求。
在 1.30.3-gke.1451000 以上版本中,您可以在 GKE Autopilot 模式和 GKE Standard 模式中使用自訂 ComputeClass,以宣告式方法定義節點屬性和自動調度優先順序。根據預設,您可以在所有符合資格的 GKE 叢集中設定及使用自訂運算類別。
自訂 ComputeClass 的優點
自訂 ComputeClass 具有下列優點:
- 備援運算優先順序:在每個 ComputeClass 中定義節點設定的階層,供 GKE 優先處理。如果最偏好的設定無法使用,GKE 會自動選擇階層中的下一個設定。這個備援模型可確保即使運算資源無法使用,工作負載仍可在最佳化硬體上執行,且排程延遲時間最短。
- 精細的自動調度資源控制:定義最適合特定工作負載的節點設定。在擴縮期間建立節點時,GKE 會優先採用這些設定。
- 宣告式基礎架構設定:採用宣告式基礎架構管理方法,讓 GKE 自動建立符合特定工作負載需求的節點。
- 主動遷移:如果所在位置有更合適的機器設定可供使用,GKE 會自動將工作負載遷移至使用偏好設定的新節點。
- 成本最佳化:優先使用成本效益高的節點類型 (例如 Spot VM),以降低叢集支出。
- 預設自訂 ComputeClass:將自訂 ComputeClass 設為整個叢集或特定 Kubernetes 命名空間的預設值,即使工作負載未要求特定 ComputeClass,也能在經過最佳化的硬體上執行。
- 自訂節點合併門檻:為節點定義自訂資源用量門檻。如果特定節點的資源用量低於門檻,GKE 會嘗試將工作負載整併到類似的可用節點,並縮減資源用量不足的節點。
自訂 ComputeClass 的用途
在下列情境中,建議使用自訂 ComputeClass:
- 您想在特定 GPU 或 TPU 設定上執行 AI/機器學習工作負載。
- 您想為特定團隊執行的工作負載設定預設硬體設定,以減輕應用程式運算子的負擔。
- 您執行的工作負載在特定 Compute Engine 機器系列或硬體設定上,可發揮最佳效能。
- 您想聲明符合特定業務需求的硬體設定,例如高效能、成本最佳化或高可用性。
- 您希望 GKE 在運算資源無法使用時,以階層式方式回退至使用特定硬體設定,確保工作負載一律在符合需求的機器上執行。
- 您希望集中決定企業機群的最佳設定,以便更準確地預測費用,並更可靠地執行工作負載。
- 您想集中指定 GKE 應使用哪些 Compute Engine 容量預留項目,為特定工作負載佈建新節點。
- 您想指定要搭配 GKE Autopilot 使用的密集配置政策。詳情請參閱精簡版位置。
自訂 ComputeClass 的運作方式
自訂 ComputeClass 是 Kubernetes 自訂資源,可佈建Google Cloud 基礎架構。您可以在叢集中定義 ComputeClass 物件,然後在工作負載中要求該 ComputeClass,或將該 ComputeClass 設為 Kubernetes 命名空間的預設值。當相符的工作負載需要新的基礎架構時,GKE 會根據您在 ComputeClass 定義中設定的優先順序,佈建新的節點。
您在 ComputeClass 中設定的屬性,會定義 GKE 如何設定新節點來執行工作負載。修改現有 ComputeClass 時,GKE 為該 ComputeClass 建立的所有未來節點都會使用修改後的設定。GKE 不會追溯變更現有節點的設定,以符合您的修改內容。
自訂 ComputeClass 會影響自動調度資源的決策,但 kube-scheduler 不會考量這點。在 Pod 排程期間,即使現有節點的優先順序各不相同,排程器也可能不會優先處理自訂 ComputeClass 優先順序較高的節點。
為確保自訂 ComputeClass 適合車隊,請參考下列規範:
- 瞭解機群的運算需求,包括任何應用程式專屬的硬體需求。
- 決定主題,做為設計每個 ComputeClass 的依據。舉例來說,效能最佳化 ComputeClass 可能會採用僅使用高 CPU 機器類型的備援策略。
- 決定最符合工作負載需求的 Compute Engine 機器系列和機器類型。詳情請參閱機器系列資源與比較指南。
- 在每個 ComputeClass 中規劃備援策略,確保工作負載一律在採用類似機器設定的節點上執行。舉例來說,如果 N4 系列機器無法使用,您可以改用 C3 機器。
查看完整的自訂資源定義
如要查看 ComputeClass 自訂資源的最新自訂資源定義 (CRD),包括所有欄位及其關係,請參閱 ComputeClass 參考說明文件。
您也可以執行下列指令,查看叢集中的 CRD:
kubectl describe crd computeclasses.cloud.google.com
規劃自訂 ComputeClass
如要在叢集中有效規劃、部署及使用自訂 ComputeClass,請完成下列步驟:
- 選擇備援運算優先順序:定義一系列規則,控管 GKE 為 ComputeClass 建立的節點屬性。
- 設定 GKE Standard 節點集區和 ComputeClass:如果是 Standard 模式叢集,請執行必要設定步驟,以便搭配節點集區使用 ComputeClass。
- 定義不適用優先順序規則時的縮放行為:(選用) 如果無法佈建符合優先順序規則的節點,請告知 GKE 該怎麼做。
- 設定節點整併的自動調度資源參數:告知 GKE 何時要整併工作負載,以及移除使用率偏低的節點。
- 設定主動遷移至優先順序較高的節點:(選用) 在硬體可用時,告知 GKE 將工作負載移至偏好的節點。
- 使用 Compute Engine 預留項目:視需要,在建立新節點時,告知 GKE 使用現有的 Compute Engine 可用區預留項目。
選擇備用運算優先順序
使用自訂 ComputeClass 的主要優點是,當偏好的節點因資源耗盡和配額限制等因素而無法使用時,您可以控管備援策略。
如要建立備援策略,請在自訂 ComputeClass 中定義優先順序規則清單。當叢集需要擴充時,GKE 會優先建立符合第一優先順序規則的節點。如果 GKE 無法建立這些節點,就會改用下一個優先順序規則,重複這個程序,直到 GKE 成功擴大叢集,或用盡所有規則為止。如果所有規則都已用盡,GKE 會根據「定義沒有優先順序規則時的縮放行為」一節所述的預設或指定行為建立節點。
不同 Compute Engine 機器系列支援的技術和功能各不相同。較舊的機器系列可能不支援與新一代相同的儲存空間類型。如果您執行的有狀態工作負載依賴永久資料,請避免使用跨多個世代的機器系列 ComputeClass。如果 GKE 將工作負載放在不支援該儲存空間類型的機器類型上,工作負載可能就無法存取持續性資料。如要瞭解詳情,請在機器系列比較表中,篩選出特定儲存空間類型。
優先順序規則
您可以在自訂資源的 ComputeClass spec.priorities 欄位中定義優先順序規則。priorities 欄位中的每條規則都會說明要佈建的節點屬性。GKE 會依序處理 priorities 欄位,也就是說,欄位中的第一個項目是節點佈建的最高優先順序。
優先順序規則分為兩種:
宣告式規則類型:使用節點特徵描述要佈建的節點
節點集區規則類型:在 GKE Standard 叢集中,提供與 ComputeClass 相關聯的手動建立節點集區清單,GKE 應在其中佈建節點。
宣告式優先順序規則
透過宣告式優先順序規則,您可以指定機器屬性,例如機器系列或類型、Spot VM、加速器選項、儲存空間選項、預留項目和最低資源需求,供 GKE 在佈建節點時使用。如需支援的完整欄位集,請參閱 ComputeClass CRD 參考資料。
machineFamily 設定
machineFamily 欄位接受 Compute Engine 機器系列,例如 n2 或 c3。如未指定,則預設值為 e2。使用 machineFamily 欄位時,GKE 會從該系列佈建節點,並使用足夠大的機器類型來執行 Pod。自動調度器演算法會根據所有待處理 Pod 的匯總資源要求,判斷最合適的大小。如要進一步控制確切的機器大小,請改用 machineType 欄位。
您可以搭配 machineFamily 欄位使用其他 spec.priorities 欄位,以宣告方式定義運算需求。例如:
spot:Spot VM。預設值為false。minCores:每個節點的最低 vCPU 數。預設值為0。這個欄位可防止建立不符合需求的節點。minMemoryGb:每個節點的記憶體容量下限。預設值為0。storage.bootDiskType:開機磁碟類型。在 Autopilot 叢集上,僅支援bootDiskType的pd-balanced類型。需要 GKE 1.34.1-gke.1431000 以上版本。storage.bootDiskSize:節點開機磁碟的大小 (單位為 GB)。需要 GKE 1.34.1-gke.1431000 以上版本。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_CACHE或MODE_UNSPECIFIED。如未指定此值,預設值為MODE_UNSPECIFIED。
placement:機器放置位置的詳細資料:
以下範例顯示使用 machineFamily 的優先順序規則:
priorities:
- machineFamily: n4
spot: true
minCores: 16
minMemoryGb: 64
storage:
bootDiskType: hyperdisk-balanced
bootDiskSize: 100
bootDiskKMSKey: projects/example/locations/us-central1/keyRings/example/cryptoKeys/key-1
secondaryBootDisks:
- diskImageName: pytorch-mnist
project: k8s-staging-jobset
machineType 設定
machineType 欄位接受 Compute Engine 預先定義的機器類型,例如 n4-standard-32,或是自訂機器類型字串,例如 n4-custom-8-20480。如要使用自訂機器類型,必須使用 GKE 1.33.2-gke.1111000 以上版本。
您可以指定 spec.priorities 欄位和 machineType 欄位,以宣告方式定義運算需求,例如:
spot:使用 Spot VM。預設值為false。storage:設定節點儲存空間。storage.bootDiskType:開機磁碟類型。在 Autopilot 上,僅支援bootDiskType的pd-balanced類型。storage.bootDiskKMSKey:用於開機磁碟加密的 Cloud KMS 金鑰路徑。storage.bootDiskSize:節點開機磁碟的大小 (單位為 GB)。storage.localSSDCount:要附加至節點的本機 SSD 數量。如要指定,不得小於1。
以下範例顯示使用 machineType 佈建 n4-standard-32 機器類型的優先順序規則:
priorities:
- machineType: n4-standard-32
spot: true
storage:
bootDiskType: hyperdisk-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 驅動程式版本。必須是default或latest。需要 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.type:TPU 類型,例如tpu-v5p-slice。詳情請參閱「GKE Autopilot 中的 TPU 可用性」。tpu.count:要附加的 TPU 數量。tpu.topology:要使用的 TPU 拓撲,例如"2x2x1"。詳情請參閱「選擇 Autopilot 的拓撲」。
您也可以在優先順序規則中,指定 tpu 欄位以外的其他 spec.priorities 欄位,例如:
spot:使用 Spot VM。預設值為false。storage:設定節點儲存空間。storage.bootDiskType:開機磁碟類型。storage.bootDiskKMSKey:用於開機磁碟加密的 Cloud KMS 金鑰路徑。storage.bootDiskSize:節點開機磁碟的大小 (單位為 GB)。
reservations:使用 Compute Engine 預留項目。詳情請參閱「使用 Compute Engine 預留資源」一節。location:
以下範例顯示 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
這個範例定義了下列備援行為:
- GKE 會嘗試從
reservation-project專案取用名為tpu-reservation的共用 Compute Engine 預留項目,佈建 16 節點的多主機 TPU v5p 區塊。 - 如果預留項目沒有可用的 TPU,GKE 會嘗試在 Spot VM 上佈建 16 節點的多主機 TPU v5p 配量。
- 如果無法滿足上述任何規則,GKE 會遵循「定義不適用優先順序規則時的縮放行為」一節中的邏輯。
將 TPU 自訂 ComputeClass 部署至叢集後,請在工作負載中選取該自訂 ComputeClass:
- Autopilot 工作負載:請參閱「使用自訂 ComputeClass 佈建 TPU」一節,瞭解如何在 GKE Autopilot 上部署 TPU 工作負載
- 標準工作負載:請參閱「使用自訂 ComputeClass 佈建 TPU」一節,瞭解如何在 GKE Standard 上部署 TPU 工作負載。
此外,您還可以針對 TPU 工作負載執行下列操作:
目標 AI 可用區
您也可以使用運算級別,為 Pod 指定 AI 可用區。AI 可用區是 Google Cloud 區域內的專門位置,經過最佳化調整,適用於 AI/機器學習工作負載。下列運算級別會設定優先順序清單,其中包含 AI 可用區:
apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: accelerator-ai-preferred spec: nodePoolAutoCreation: enabled: true priorities: # --- Priority 1: TPU in a specific AI zone (On-Demand) --- - tpu: type: tpu-v5p-slice count: 4 topology: 4x4x4 location: zones: - "us-central1-ai1a" # Specify your target AI zone # machineFamily: a3 # Optional # --- Priority 2: GPU in a specific Standard zone (On-Demand) --- - gpu: type: nvidia-tesla-a100 count: 1 location: zones: - "us-central1-a" # Fallback to a standard zone - "us-central1-b" whenUnsatisfiable: DoNotScaleUp
這個 ComputeClass 會設定 GKE,為工作負載佈建搭載 A100 GPU 的節點。節點具有下列偏好設定:
- 優先順序 1:嘗試在
us-central1-ai1aAI 區域中佈建 GPU。 - 優先順序 2:如果 AI 區域沒有 GPU,請嘗試在
us-central1-a或us-central1-b標準區域中佈建 GPU。 - 如果指定區域中沒有 A100 GPU,GKE 就不會擴充節點集區。
加速器和機器形狀規格
除非您搭配預訂使用,否則宣告式加速器設定不需要明確指定 machineType 或 machineFamily 欄位。
節點集區優先順序規則
nodepools 欄位會取得現有節點集區清單,GKE 會嘗試在這些節點集區中建立待處理的 Pod。GKE 不會依序處理這個欄位中的值。您無法在同一優先級規則項目中,搭配 nodepools 欄位使用其他 spec.priorities 欄位,因為含有 nodepools 欄位的規則本質上並非宣告式。這個欄位僅支援 GKE Standard 模式。如需使用詳細資料,請參閱「在 ComputeClass 定義中指定節點集區」。
GKE 如何使用優先順序規則建立節點
部署要求 ComputeClass 的工作負載時,如果需要新節點,GKE 會依序處理 ComputeClass 規格的 priorities 欄位中的規則清單。
舉例來說,請參考下列規格:
spec:
...
priorities:
- machineFamily: n4
spot: true
minCores: 64
- machineFamily: n4
spot: true
- machineFamily: n4
spot: false
部署工作負載時,如果要求使用具有這些優先順序規則的 ComputeClass,GKE 會依下列方式比對節點:
- GKE 會將 Pod 放置在與這個 ComputeClass 相關聯的任何現有節點上。
- 如果現有節點無法容納 Pod,GKE 會佈建使用 N4 系列機器的全新節點,這些節點是 Spot VM,且至少有 64 個 vCPU。
- 如果區域中沒有至少 64 個 vCPU 的 N4 Spot VM,GKE 會佈建使用 N4 Spot VM 的新節點,以容納 Pod,不論核心數量為何。
- 如果區域中沒有可用的 N4 Spot VM,GKE 會佈建新的隨選 N4 VM。
- 如果無法滿足上述任何規則,GKE 會遵循「定義不適用優先順序規則時的縮放行為」一節中的邏輯。
優先規則的預設值
您可以為 ComputeClass 規格優先順序規則中的部分欄位設定預設值。如果特定規則中省略了對應的欄位,系統就會套用這些預設值。您可以在 ComputeClass 規格中使用 priorityDefaults 欄位,設定這些預設值。
priorityDefaults 欄位有下列限制:
- 需要 GKE 1.32.1-gke.1729000 以上版本。
- 不相容於
nodepools優先順序規則,因為該規則不含任何欄位。
如要進一步瞭解可設定的預設值類型,請參閱 ComputeClass CustomResourceDefinition 中的 priorityDefaults 區段。
GKE Standard 節點集區和 ComputeClass
如果您使用 GKE 標準模式,可能必須手動設定,確保 ComputeClass Pod 會如預期排程。
- 自動建立的節點集區:無須手動設定。GKE 會自動為您執行 ComputeClass 設定步驟。詳情請參閱「節點集區自動建立和 ComputeClass」。
- 手動建立的節點集區:必須手動設定。您必須在手動建立的節點集區中新增節點標籤和節點汙點,才能將節點與特定 ComputeClass 建立關聯。詳情請參閱「設定手動建立的節點集區,以供 ComputeClass 使用」。
設定手動建立的節點集區,以使用 ComputeClass
如果 GKE Standard 叢集有您手動建立的節點集區,您必須設定這些節點集區,將其與特定 ComputeClass 建立關聯。GKE 只會將要求特定 ComputeClass 的 Pod 排程到與該 ComputeClass 相關聯的節點集區節點上。如果您將 ComputeClass 設定為叢集層級預設值,則不適用這項規定。
在 GKE Standard 模式中,GKE Autopilot 模式和自動建立的節點集區會為您執行這項設定。
如要將手動建立的節點集區與 ComputeClass 建立關聯,請在建立或更新節點集區時,指定 --node-labels 旗標和 --node-taints 旗標,將節點標籤和節點汙點新增至節點集區,如下所示:
- 節點標籤:
cloud.google.com/compute-class=COMPUTE_CLASS - Taint:
cloud.google.com/compute-class=COMPUTE_CLASS:NoSchedule
在這些屬性中,COMPUTE_CLASS 是自訂 ComputeClass 的名稱。
舉例來說,下列指令會一併更新現有節點集區,並將節點集區與 dev-class ComputeClass 建立關聯:
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"
您可以將叢集中的每個節點集區與一個自訂 ComputeClass 建立關聯。GKE 在這些手動建立的節點集區中排定的 Pod,只會在自動調度資源事件期間,觸發這些節點集區內的節點建立作業。
節點集區自動建立和 ComputeClass
您可以搭配自訂 ComputeClass 使用節點集區自動建立功能,讓 GKE 根據優先順序規則自動建立及刪除節點集區。
如要讓 GKE 自動為 ComputeClass 建立節點集區,請完成下列步驟:
- 將
nodePoolAutoCreation欄位和enabled: true值新增至ComputeClass規格。 - 如果叢集執行的版本早於 GKE 1.33.3-gke.1136000 版,您也必須啟用叢集層級的節點自動佈建功能。
GKE 隨後會為使用 ComputeClass 的 Pod 建立新的節點集區。GKE 會根據叢集大小和 Pod 需求等因素,決定要擴充現有節點集區,還是建立新的節點集區。如果 ComputeClass 未設定節點集區自動建立功能,則具有這類 ComputeClass 的 Pod 仍只會擴充現有節點集區。
您可以搭配使用 ComputeClass,啟用節點集區自動建立功能,以及與同一叢集中手動建立的節點集區互動。
請參考下列與節點集區自動建立功能的互動:
- 您無法使用機器系列或Spot VM 節點選取器,因為這些選取器與 ComputeClass 行為衝突。如果 Pod 要求 ComputeClass,同時也要求 Spot VM 或特定機型系列,GKE 會拒絕這類 Pod。
如果您為叢集設定預設 ComputeClass,只有在下列情況下,使用機型系列節點選取器的 Pod 才會觸發該預設類別的節點建立作業:
- Pod 會選取符合叢集層級預設類別中其中一項優先順序規則的機器家族。舉例來說,如果叢集層級的預設類別有 N4 執行個體的優先順序規則,選取 N4 執行個體的 Pod 就會觸發節點建立作業。
- 叢集層級的預設 ComputeClass 在
spec.whenUnsatisfiable欄位中的值為ScaleUpAnyway。即使 Pod 選取的機器家族不在 ComputeClass 優先順序中,GKE 仍會使用該機器家族建立新節點。
如果 ComputeClass 的
whenUnsatisfiable欄位值為DoNotScaleUp,選取叢集層級預設類別優先順序中沒有的機器系列的 Pod,就不會觸發節點建立作業。您可以為使用
nodepools欄位參照現有節點集區的 ComputeClass,設定節點集區自動建立功能。GKE 會依序處理優先順序,並嘗試擴大現有節點集區,以放置 Pod。
以下範例說明叢集同時具有手動建立的節點集區和節點集區自動建立功能:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: my-class
spec:
priorities:
- nodepools: [manually-created-pool]
- machineFamily: n4
- machineFamily: c4
nodePoolAutoCreation:
enabled: true
在本範例中,GKE 會嘗試執行下列操作:
- 在
manually-created-pool節點集區中建立新節點。 - 在現有的 N4 節點集區中佈建 N4 節點,或是建立新的節點集區。
- 如果 GKE 無法建立 N4 節點,會嘗試擴充現有的 C4 節點集區,或建立新的 C4 節點集區。
在 ComputeClass 定義中指定特定節點集區
priorities.nodepools 欄位可讓您指定手動建立的節點集區清單,GKE 會嘗試在這些節點集區中排程 Pod,但不會指定順序。這適用於使用叢集自動調整功能的 GKE Standard 叢集。這個欄位僅支援節點集區清單,您無法在同一個優先順序規則中指定其他機器屬性,例如機器系列。部署要求具名節點集區的 ComputeClass 時,GKE 會嘗試在這些節點集區中排定待處理的 Pod。GKE 可能會在這些節點集區中建立新節點,以放置 Pod。
您在 priorities.nodepools 欄位中指定的節點集區必須與該 ComputeClass 建立關聯,方法是使用節點標籤和節點汙點,如「為 ComputeClass 手動設定建立的節點集區」一節所述。
您在 nodepools 欄位中指定的節點集區清單沒有優先順序。如要設定具名節點集區的回溯順序,您必須指定多個個別的 priorities.nodepools 項目。舉例來說,請考量下列規格:
spec:
...
priorities:
- nodepools: [pool1, pool2]
- nodepools: [pool3]
在本範例中,GKE 會先嘗試將要求此 ComputeClass 的待處理 Pod 放置在標示有 ComputeClass 的節點集區現有節點上。如果現有節點無法使用,GKE 會嘗試在 pool1 或 pool2 中佈建新節點。如果 GKE 無法在這些節點集區中佈建新節點,GKE 會嘗試在 pool3 中佈建新 Pod。
定義不適用任何優先順序規則時的縮放行為
ComputeClass 自訂資源可讓您指定在沒有任何節點符合優先順序規則時,GKE 應執行的動作。規格中的 whenUnsatisfiable 欄位支援下列值。
ScaleUpAnyway:建立使用叢集預設機器設定的新節點。在 1.33 之前的 GKE 版本中,如果省略這個欄位,系統會預設採用這種行為。GKE 會採取下列其中一項動作:
- 在 Autopilot 叢集中,無論節點機器設定為何,GKE 都會將 Pod 放在新節點或現有節點上。
- 在未使用節點集區自動建立功能的 Standard 叢集中,GKE 會嘗試擴充任何手動建立的節點集區,這些節點集區定義的標籤和汙點與指定的 ComputeClass 相符。
- 在採用節點集區自動建立功能的 Standard 叢集中,GKE 可能會建立使用預設 E2 系列機器的節點集區,以放置 Pod。
DoNotScaleUp:將 Pod 留在Pending狀態,直到有符合 ComputeClass 規定的節點為止。在 GKE 1.33 以上版本中,如果您省略這個欄位,系統會預設採用這種行為。
要求配置政策
從 GKE 1.33.2-gke.1335000 版開始,您可以在 GKE Autopilot 叢集中,使用自訂配置政策或工作負載政策,搭配密集配置。詳情請參閱「密集配置政策與工作負載政策比較」。
配置政策和工作負載政策都會將節點配置在實體上相近的位置,以減少網路延遲。如要使用特定政策,請在 policyName 欄位中提供政策名稱。這項政策必須是 GKE 專案中已有的 Compute Engine 資源政策。
請參考以下範例:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: my-class
spec:
priorities:
- machineFamily: n4
placement:
policyName: my-placement-policy
nodePoolAutoCreation:
enabled: true
在這個設定中,GKE 會對使用這個 ComputeClass 的所有工作負載套用緊密放置政策,並根據名為 my-placement-policy 的現有資源政策佈建節點。
設定節點整併的自動調度資源參數
根據預設,GKE 會移除工作負載使用率偏低的節點,並將這些工作負載整合到有容量的其他節點。對於所有 ComputeClass,這是預設行為,因為使用 ComputeClass 的所有叢集都必須使用叢集自動調度器,或是 Autopilot 叢集。在節點整合期間,GKE 會清空使用率偏低的節點,在其他節點上重新建立工作負載,然後刪除清空的節點。
節點移除的時間和條件取決於自動調度資源設定檔。您可以在自訂 ComputeClass 定義中使用 autoscalingPolicy 區段,微調資源使用率不足的觸發門檻,以移除節點並整合工作負載。您可以微調下列參數:
consolidationDelayMinutes:GKE 移除使用率過低的節點前,等待的分鐘數consolidationThreshold:CPU 和記憶體的使用率門檻,以節點可用資源的百分比表示。只有在資源使用率低於這個門檻時,GKE 才會考慮移除節點。gpuConsolidationThreshold:GPU 使用率門檻,以節點可用資源的百分比表示。只有在資源使用率低於這個門檻時,GKE 才會考慮移除節點。建議將此值設為100或0,讓 GKE 整合所有附加 GPU 使用率未達 100% 的節點。
請參考以下範例:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: my-class
spec:
priorities:
- machineFamily: n4
- machineFamily: c4
autoscalingPolicy:
consolidationDelayMinutes: 5
consolidationThreshold: 70
在這個設定中,GKE 會在五分鐘後移除未使用的節點,且只有在 CPU 和記憶體使用率都低於 70% 時,節點才會成為整併候選項目。
進行中的遷移作業
主動遷移是 ComputeClass 的選用自動調整功能,可自動以新節點取代現有節點。支援的有效遷移類型如下:
optimizeRulePriority:GKE 會將 ComputeClasspriorities清單中優先順序較低的節點,替換為優先順序較高的節點。即使 GKE 原本必須在較不偏好的節點設定上執行這些 Pod,這個選項也能確保 Pod 最終會在您最偏好的節點設定上執行。ensureAllDaemonSetPodsRunning: GKE 會將有無法排程的 DaemonSet Pod 的節點,換成可執行所有必要 DaemonSet Pod 的較大節點。這個選項可確保所有 DaemonSet 最終都會在節點上執行。
在遷移作業進行期間,GKE 會執行下列操作:
- GKE 會建立符合有效遷移類型需求的新節點。
- GKE 會封鎖現有節點,避免新 Pod 在該節點上執行。
GKE 會清空現有節點,從節點中移除 Pod。節點排空的速度取決於下列因素:
Kubernetes 控制器 (例如 Deployment 或 Job) 會建立 Pod 來取代遭驅逐的 Pod。GKE 會將這些新 Pod 排定到新節點上。
現有節點排空後,GKE 會刪除該節點。
在下列情況下,進行中的遷移作業不會影響 Pod 和節點:
- 有效遷移不會逐出具有
cluster-autoscaler.kubernetes.io/safe-to-evict: "false"註解的 Pod。 - 如果驅逐 Pod 會違反 PodDisruptionBudget,系統就不會在進行中的遷移作業中驅逐 Pod。
- 如果節點無法移除,系統不會在進行中的遷移作業中替換節點。舉例來說,如果主動遷移會違反
--min-nodes節點集區設定,就不會取代節點。
為 ComputeClass 啟用主動遷移功能前,請先考量下列潛在影響:
- 進行中的遷移作業不會遷移儲存在永久儲存空間中的資料,例如 Compute Engine 永久磁碟。為盡量降低資料遺失風險,請勿在有狀態工作負載使用的 ComputeClass 中啟用主動遷移功能。
- 在 Standard 叢集中,如果您使用節點集區自動建立功能,當現有節點集區不符合 ComputeClass 中定義的條件時,作用中遷移作業可能會觸發新節點集區的建立作業。
- 如果工作負載使用含有可用區資源 (例如 Hyperdisk) 的永久磁碟區,可能無法順利進行主動遷移。區域限制和部分 Hyperdisk 產品的機器類型限制,可能會降低有效遷移的成效。此外,部分有狀態的工作負載可能無法承受主動遷移作業造成的干擾。
- 如果您更新現有 ComputeClass 來啟用主動遷移,當運算資源可用時,GKE 會將現有 Pod 遷移至新節點。
正在遷移至優先順序較高的節點
透過「作用中」optimizeRulePriority遷移類型,GKE 可以將 ComputeClass priorities 清單中較低的現有節點,替換為清單中較高的節點。舉例來說,下列 ComputeClass 規格會優先使用 N4 節點,而非 C4 節點:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: my-class
spec:
priorities:
- machineFamily: n4
- machineFamily: c4
activeMigration:
optimizeRulePriority: true
如果您使用這個 ComputeClass 部署 Pod 時,N4 節點無法使用,GKE 會改用 C4 節點。如果稍後可佈建 N4 節點 (例如配額增加,或 N4 VM 在您所在位置推出),系統會執行下列步驟:
- GKE 會建立新的 N4 節點。
- GKE 會封鎖並清空現有的 C4 節點。系統會移除 Pod,並遵守任何 PodDisruptionBudgets 和終止寬限期設定。
- Kubernetes 控制器會建立 Pod,取代遭驅逐的 Pod。這些新 Pod 會在 N4 節點上執行。
- 排空 C4 節點後,GKE 會刪除該節點。
主動遷移,以執行無法排程的 DaemonSet Pod
ensureAllDaemonSetPodsRunning 作用中遷移類型可讓 GKE 自動將現有節點 (含有無法排定的 DaemonSet Pod) 換成較大的節點,以便執行這些 DaemonSet Pod。
舉例來說,下列 ComputeClass 規格會設定 N4 機器家族:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: my-class
spec:
priorities:
- machineFamily: n4
activeMigration:
ensureAllDaemonSetPodsRunning: true
假設您建立的單一 Pod 部署作業使用這個 ComputeClass,並要求兩個 vCPU。為執行這個 Pod,GKE 建立了一個 n4-standard-2 節點。稍後,您會建立 DaemonSet,同樣要求兩個 vCPU。DaemonSet Pod 無法在 n4-standard-2 節點上執行。在這個情境中,GKE 會執行下列操作:
- GKE 會建立使用較大 N4 機器類型 (例如
n4-standard-4) 的節點,該節點可執行 Pod 和 DaemonSet Pod。系統會將待處理的 DaemonSet Pod 排程到這個新節點。 - GKE 會封鎖並清空
n4-standard-2節點。 - Pod 遭到驅逐時,Deployment 會建立替代 Pod。GKE 會在
n4-standard-4節點上排定這個 Pod,以及 DaemonSet Pod。 n4-standard-2節點排空後,GKE 會刪除該節點。
使用 Compute Engine 預留項目
適用於 GKE 1.31.1-gke.2105000 以上版本
如果您使用 Compute Engine 容量預留,確保特定Google Cloud 區域的硬體可用性,則可以在自訂 ComputeClass 中設定每個備援優先順序,讓 GKE 在建立新節點時使用預留容量。
在自訂 ComputeClass 中使用預留資源時,必須符合下列條件:
- 您必須使用節點集區自動建立功能,GKE 才能使用預留資源建立新節點。詳情請參閱「節點集區自動建立和 ComputeClass」一節。在叢集中手動建立節點集區時,您也可以繼續使用預留項目。
- 只有在定義
machineType或machineFamily時,才能使用非 TPU 預留項目。 - 設定本機 SSD 的 ComputeClass 必須使用
machineType優先順序規則,而非machineFamily。詳情請參閱「machineType 規則類型」一節。 - 指定已附加本機 SSD 的
machineType保留項目的 ComputeClass,必須明確包含localSSDCount:欄位。
請參考下列 ComputeClass 規格範例,其中優先使用特定共用預留項目,以便佈建 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 ComputeClass 的 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: n4
reservations:
specific:
- name: n4-shared-reservation
project: reservation-project
affinity: Specific
- machineFamily: n4
spot: true
- machineFamily: n4
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 無法在預留容量中找到可用容量,系統會根據 ComputeClass 優先順序規則中選取的預留容量類型,採取下列行為:
- 特定預留項目:GKE 會嘗試 ComputeClass 中的下一個優先順序規則。
- 任何相符的預留項目:GKE 會嘗試佈建符合該優先順序規則需求的隨選節點。如果 GKE 無法佈建隨選節點,GKE 會嘗試 ComputeClass 中的下一個優先順序規則。
如果 GKE 無法滿足任何 ComputeClass 優先順序規則的需求,就會發生沒有規則適用時的行為。
使用特定預留項目模塊
從 GKE 1.31.4-gke.1072000 版開始,您可以在硬體支援的預留項目中,指定特定預留區塊。這項功能適用於 A3 Ultra 和 A4 機型。
如要使用特定預訂區塊,請按照這個範例所示設定 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 替換為目標預訂區塊名稱。
從 GKE 1.33.1-gke.1788000 版開始,您可以在預留項目區塊中指定特定預留項目子區塊。這項功能適用於 A4X 機器類型。
如要使用特定保留項目子區塊,請按照「使用特定保留項目子區塊」範例所示,設定 ComputeClass 資源。
使用這項功能時,請注意下列事項:
- 這些功能僅適用於單一或共用專案中的特定預留項目。
自訂節點系統設定
您可以在 ComputeClass 規格中使用 nodeSystemConfig 欄位,自訂 kubelet 和 Linux 核心中的特定參數。您可以在定義 Compute Engine 機器系列或機器類型的任何優先順序規則中,指定這個欄位。您也可以在 ComputeClass 的 priorityDefaults 欄位中加入 nodeSystemConfig 欄位,為優先順序規則中省略的任何節點系統設定欄位設定預設全域值。
這項功能適用於 GKE 1.32.1-gke.1729000 以上版本。
如需詳細資訊,請參閱以下頁面:
指定節點標籤和 taint
在 ComputeClass 規格中,您可以使用 nodeLabels 和 taints 欄位定義設定,這些設定既符合現有節點集區,也控管新節點集區的建立作業。這些設定可透過整個 ComputeClass 的 nodePoolConfig 欄位全域套用,或使用 priority 欄位限定特定優先順序;不過,您必須確保在優先順序層級定義的標籤和汙點,不會與全域設定的標籤和汙點重疊。
這些功能適用於下列裝置:
- GKE 1.33.2-gke.1111000 以上版本中的優先順序節點標籤。
- GKE 1.33.4-gke.1350000 以上版本中的優先順序汙點。
- GKE 1.34.1-gke.3084002 以上版本支援全域節點標籤和汙點。
詳情請參閱「ComputeClass CustomResourceDefinition」。
叢集和命名空間的預設 ComputeClass
您可以設定 GKE,將 ComputeClass 預設套用至未選取特定 ComputeClass 的 Pod。您可以為特定命名空間或整個叢集定義預設的 ComputeClass。如要進一步瞭解如何使用預設類別設定叢集或命名空間,請參閱「預設將 ComputeClass 套用至 Pod」。
節點集區群組
從 GKE 1.32.2-gke.1359000 版開始,您可以使用 ComputeClass 規格中的 nodePoolGroup 欄位,將多個節點集區分組為單一邏輯單元,稱為「集合」。這個群組可讓您將共用設定套用至多個節點集區。
TPU 多主機集合
須使用 GKE 1.31.2-gke.1518000 以上版本。僅適用於 TPU Trillium (v6e)
您可以將 TPU 多主機部署作業分組,在集合中的所有節點集區設定服務等級目標 (SLO)。如要將節點集區分組,請在 nodePoolGroup 欄位中指定群組名稱。使用這個 ComputeClass 佈建的所有節點集區都屬於同一個群組。
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: tpu-multi-host-collection
spec:
nodePoolGroup:
name: my-tpu-collection
...
如要瞭解詳情,請參考下列資源:
節點集區設定
您可以使用 ComputeClass 規格中的 nodePoolConfig 欄位,套用反映在節點集區內所有節點的設定,這些節點集區是使用該類別建立。
指定圖片類型
您可以使用 imageType 欄位,指定節點集區中節點的基礎作業系統。這個欄位可讓您選擇要在節點上執行的節點集區映像檔類型。如果省略這個欄位,預設值為 cos_containerd。以下範例說明如何在 ComputeClass 中指定 imageType:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: my-node-pool-config
spec:
nodePoolConfig:
imageType: cos_containerd
詳情請參閱「節點映像檔」。
服務帳戶
serviceAccount 欄位會指定 ComputeClass 管理的節點集區中,節點使用的服務帳戶。 Google Cloud 以下範例說明如何在 ComputeClass 中指定 serviceAccount:
spec:
nodePoolConfig:
serviceAccount: my-service-account@my-project.iam.gserviceaccount.com
詳情請參閱「關於 GKE 中的服務帳戶」。
定義 TPU 服務水準目標的工作負載類型
從 GKE 1.32.2-gke.1359000 版開始,您可以使用 nodePoolConfig 中的 workloadType 欄位,為 TPU 工作負載定義服務等級目標 (SLO)。這個欄位的值會告知 GKE TPU 資源的預期用途。workloadType 欄位支援下列值:
HIGH_AVAILABILITY:針對以可用性為重點的工作負載 (例如推論服務),使用這個值可限制並簡化中斷情形。HIGH_THROUGHPUT:如果批次或訓練作業需要所有基礎架構長時間運作才能完成,請使用這個值。只有在指定nodePoolGroup時,才能使用這個值。
下列範例定義了多主機 TPU 集合的 ComputeClass,並針對高可用性推論工作負載進行最佳化。
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: multi-host-inference
spec:
nodePoolGroup:
name: my-inference-collection
nodePoolConfig:
workloadType: HIGH_AVAILABILITY
nodePoolAutoCreation:
enabled: true
priorities:
- tpu:
type: tpu-v6e-slice
topology: 2x4
如需詳細資訊,請參閱以下頁面:
在工作負載中要求 ComputeClass
如要使用自訂 ComputeClass,Pod 必須在 Pod 規格中透過 nodeSelector 明確要求該 ComputeClass。您可以選擇為特定 Kubernetes 命名空間設定預設的 ComputeClass。除非 Pod 要求使用其他 ComputeClass,否則該命名空間中的 Pod 會使用該 ComputeClass。
舉例來說,下列資訊清單會要求 cost-optimized ComputeClass:
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"
系統節點標籤的節點選取器
GKE 會在節點中新增系統標籤,根據機型、附加的硬體加速器或開機磁碟類型等條件識別節點。這些系統標籤的標籤鍵會包含下列其中一個前置字元:
k8s.iocloud.google.comgke.ionode.kubernetes.io/instance-type
在 GKE 1.32.3-gke.1499000 以上版本中,您可以部署工作負載,同時使用節點選取器選取系統標籤和 ComputeClass。如果您在選取 ComputeClass 的 Pod 中選取系統標籤,請確認這些 Pod 是否如預期排定。ComputeClass 的設定與 Pod 中的節點選取器發生衝突,可能會導致下列問題:
- GKE 無法建立使用 ComputeClass 最高優先權設定的節點。
- Pod 仍處於
Pending狀態。
如果 Pod 選取系統標籤,且該標籤在 ComputeClass 規格中具有對應欄位,GKE 也會拒絕這類 Pod。使用 ComputeClasses 時,請更新工作負載,從節點選取器中移除下列標籤,並在您建立的 ComputeClasses 中設定對應欄位:
| 節點標籤 | ComputeClass 欄位 |
|---|---|
cloud.google.com/machine-family |
priorities.machineFamily |
cloud.google.com/machine-type |
priorities.machineType |
cloud.google.com/gke-spot |
priorities.spot |
cloud.google.com/gke-accelerator |
priorities.gpu.type |
cloud.google.com/gke-gpu-driver-version |
priorities.gpu.driverVersion |
cloud.google.com/reservation-name |
priorities.reservations.specific.name |
cloud.google.com/reservation-project |
priorities.reservations.specific.project |
cloud.google.com/reservation-affinity |
priorities.reservations.affinity |
cloud.google.com/gke-ephemeral-storage-local-ssd |
priorities.storage.localSSDCount |
cloud.google.com/gke-boot-disk |
priorities.storage.bootDiskType |
cloud.google.com/gke-boot-disk-size |
priorities.storage.bootDiskSize |
cloud.google.com/gke-node-pool-group-name |
nodePoolGroup.name |
cloud.google.com/gke-workload-type |
nodePoolConfig.workloadType |
node.kubernetes.io/instance-type |
priorities.machineType |
限制
ComputeClass 的名稱不得以 gke 或 autopilot 開頭。
後續步驟
- 瞭解如何使用自訂 ComputeClass 控制自動調度節點的屬性。
- 進一步瞭解 Autopilot 叢集中的「平衡」和「向外擴充」運算類別。
- 瞭解如何設定自動建立節點集區。
- 進一步瞭解GKE 叢集自動調度資源功能。
- 瞭解如何為 Autopilot Pod 選擇運算級別。