您可以建立自己的 ComputeClass,控管 Google Kubernetes Engine (GKE) 在自動調度叢集資源時佈建的節點屬性。本文適用對象為平台管理員,說明如何以宣告方式定義節點的自動調度資源設定檔,讓特定工作負載在符合需求的硬體上執行。如要進一步瞭解 ComputeClass,請參閱「關於 GKE ComputeClass」。
ComputeClasses 總覽
在 GKE 中,ComputeClass 是由一組節點屬性組成的設定檔,GKE 會在自動調度資源事件期間,使用這些屬性佈建執行工作負載的節點。ComputeClasses 可指定特定最佳化項目,例如佈建高效能節點,或優先採用成本最佳化設定,降低執行成本。自訂 ComputeClass 可讓您定義設定檔,GKE 會使用這些設定檔自動調度節點資源,盡可能滿足特定工作負載的需求。
ComputeClass 適用於 1.30.3-gke.1451000 以上版本的 GKE Autopilot 模式和 GKE Standard 模式,可讓您以宣告式方法定義節點屬性和自動調度資源優先順序。根據預設,所有符合資格的 GKE 叢集都能設定及使用 ComputeClass。
自訂 ComputeClass 的優點
自訂運算類別有下列優點:
- 備用運算優先順序:在每個 ComputeClass 中定義節點設定階層,供 GKE 優先採用。如果最偏好的設定無法使用,GKE 會自動選擇階層中的下一個設定。這個備用模型可確保即使運算資源無法使用,工作負載仍可在最佳化硬體上執行,並盡可能減少排程延遲。
- 精細的自動調度資源控制項:定義最適合特定工作負載的節點設定。GKE 在調度資源期間建立節點時,會優先採用這些設定。
- 宣告式基礎架構設定:採用宣告式基礎架構管理方法,讓 GKE 自動建立符合特定工作負載需求的節點。
- 主動遷移:如果所在位置有更偏好的機器設定運算資源,GKE 會自動將工作負載遷移至使用偏好設定的新節點。
- 成本最佳化:優先採用符合成本效益的節點類型 (例如 Spot VM),降低叢集費用。
- 預設自訂 ComputeClass:將自訂 ComputeClass 設為整個叢集或特定 Kubernetes 命名空間的預設值,這樣一來,即使工作負載未要求特定 ComputeClass,也會在最佳化硬體上執行。
- 自訂節點整併門檻:定義節點的自訂資源用量門檻。如果特定節點的資源用量低於門檻,GKE 會嘗試將工作負載整併至類似的可用節點,並縮減未充分利用的節點。
- 宣告式最低容量:主動在叢集中維持這個 ComputeClass 的最低節點數量,確保重要工作負載有足夠的容量。
自訂 ComputeClass 的用途
在下列情況下,建議使用自訂 ComputeClass:
- 您想在特定 GPU 或 TPU 設定上執行 AI/機器學習工作負載。
- 您想為特定團隊執行的工作負載設定預設硬體設定,減輕應用程式操作人員的負擔。
- 您執行的工作負載在特定 Compute Engine 機器系列或硬體設定上,能發揮最佳效能。
- 您想宣告符合特定業務需求的硬體設定,例如高效能、成本最佳化或高可用性。
- 您希望 GKE 在運算資源無法使用時,能依階層順序改用特定硬體設定,確保工作負載一律在符合需求的機器上執行。
- 您希望集中決定企業機群的最佳設定,以便更準確地預測成本,並更可靠地執行工作負載。
- 您想集中指定 GKE 應使用哪些 Compute Engine 預留容量,為特定工作負載佈建新節點。
- 您想指定要與 GKE Autopilot 搭配使用的密集配置政策。詳情請參閱「密集配置」。
自訂 ComputeClass 的運作方式
自訂 ComputeClass 是佈建Cloud de Confiance by S3NS 基礎架構的 Kubernetes 自訂資源。您可以在叢集中定義 ComputeClass 物件,然後在工作負載中要求該 ComputeClass,或將該 ComputeClass 設為 Kubernetes 命名空間的預設值。當相符的工作負載需要新的基礎架構時,GKE 會根據您在 ComputeClass 定義中設定的優先順序,佈建新的節點。
您在 ComputeClasses 中設定的屬性,會定義 GKE 如何設定新節點來執行工作負載。修改現有的 ComputeClass 後,GKE 為該 ComputeClass 建立的所有新節點,都會使用修改後的設定。GKE 不會追溯變更現有節點的設定,以符合您的修改。
自訂 ComputeClasses 會影響自動調度資源決策,但 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 可用區預留項目。
- 佈建節點數量下限:您可以選擇指示 GKE 在叢集中維持節點數量下限。
選擇備用運算優先順序
使用自訂 ComputeClass 的主要優點,是當偏好的節點因可用區資源耗盡 (例如在 FailedScaleUp 事件期間看到 ZONE_RESOURCE_POOL_EXHAUSTED 或 GCE out of resources 訊息) 和配額限制等因素而無法使用時,可以控管備用策略。只要定義替代機器系列或佈建模型的優先順序清單,叢集就能自動佈建可用容量,而不是讓 Pod 處於 Pending 狀態。如要進一步瞭解如何排解運算能力不足的問題,請參閱「資源不足導致節點集區建立失敗」和「節點擴充失敗:Compute Engine 資源不足」。
如要建立備用策略,請在 ComputeClass 規格的 priorities 欄位中定義優先順序規則清單。每項優先順序規則都可以透過下列其中一種方式要求節點:
節點屬性:定義要執行 Pod 的節點屬性,例如要使用的機器家族。當 Pod 觸發擴充作業時,GKE 會嘗試建立具有這些屬性的節點。每個優先順序規則都必須指定要佈建的硬體類型,如「優先順序規則的頂層節點屬性」一節所述。
節點集區選取:在 GKE Standard 叢集中,指定要與 ComputeClass 建立關聯的現有節點集區名稱。當 Pod 觸發擴充作業時,GKE 會嘗試將 Pod 放入這些節點集區。選取節點集區的優先順序規則不支援任何其他欄位。詳情請參閱「GKE Standard 節點集區和 ComputeClass」一節。
根據預設,如果傳入的 Pod 選取 ComputeClass,且需要新節點,GKE 會按照優先順序規則在 ComputeClass 資訊清單中的顯示順序,嘗試建立節點。在 GKE 1.35.2-gke.1842000 以上版本中,您也可以使用 priorityScore 欄位,明確設定 ComputeClass 中每項優先順序規則的分數,GKE 會依分數高低順序處理規則。如果 ComputeClass 中的所有優先順序規則都已用盡,GKE 會根據「定義未套用優先順序規則時的縮放行為」一節所述的行為建立節點。
優先規則分數
必須使用 GKE 1.35.2-gke.1842000 以上版本。
如要精細控管 GKE 處理 ComputeClass 優先順序規則的順序,請在規則中使用 priorityScore 欄位。在資源調度期間,GKE 會根據分數處理優先順序規則,分數較高的規則優先順序高於分數較低的規則。
priorityScore 欄位具有下列屬性:
- 這個欄位接受整數值,最小值為
1,最大值為1000。 - 您必須在所有優先順序規則中使用
priorityScore欄位,或完全不使用。 最多可以為三項不同的規則設定相同的優先順序分數。 在資源調度期間,GKE 會一併處理分數相同的規則。GKE 會根據叢集自動配置器的運作條件,選擇要使用的特定規則。
分組規則可能會增加自動調度資源的延遲時間,因為 GKE 必須執行更多模擬,才能判斷最佳節點設定。您是否會注意到延遲時間增加,取決於規則中硬體選擇的廣度,如下所示:
- 如果規則範圍較廣 (例如
machineFamily屬性),自動調度資源延遲時間可能會稍微增加。不過,GKE 更有可能找到符合這些規則要求的可用硬體。 - 範圍較小的規則 (例如
machineType屬性) 較不可能導致延遲時間增加。不過,GKE 較有可能找不到符合這些規則要求的可用硬體。
- 如果規則範圍較廣 (例如
以下範例顯示設定優先順序規則分數的 ComputeClass:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: priority-rule-score-class
spec:
nodePoolAutoCreation:
enabled: true
priorities:
# Highest priority score in the ComputeClass
- machineFamily: e2
spot: true
priorityScore: 30
# Grouped priority rules that have the same score.
- machineFamily: n2
spot: true
priorityScore: 20
- machineFamily: t2d
spot: true
priorityScore: 20
# Lowest priority score in the ComputeClass.
- machineFamily: n1
spot: true
priorityScore: 10
whenUnsatisfiable: ScaleUpAnyway
在這個範例 ComputeClass 的擴充事件期間,GKE 會執行下列操作:
- GKE 會嘗試建立 E2 執行個體。
- 如果沒有 E2 執行個體,GKE 會根據叢集自動配置器的結果,建立 N2 或 T2D 執行個體。
- 如果 N2 和 T2D 執行個體無法使用,GKE 會嘗試建立 N1 執行個體。
- 如果 N1 執行個體無法使用,GKE 會改用叢集的預設機器系列。
優先規則的頂層節點屬性
指定定義節點屬性的優先順序規則時,必須選取節點所需的頂層硬體類型。您可以為規則指定的其他屬性,取決於該規則的頂層屬性。
您可以在規則中使用下列任一頂層屬性:
machineFamily:Compute Engine 機器系列,例如n4。machineType:特定 Compute Engine 機型,例如n4-standard-32。gpu:GPU 設定,可能包含 GPU 類型、特定數量的 GPU 和驅動程式設定。tpu:Cloud TPU 設定,可能包含 TPU 版本、拓撲和晶片數量。
除非您將加速器設定與預留項目搭配使用,否則不需明確指定 machineType 或 machineFamily 欄位。
每個 Compute Engine 機器系列世代都支援特定磁碟類型。舉例來說,N4 機器系列支援 Hyperdisk ML 磁碟類型,但 N2 機器系列不支援。在跨越多個世代的 ComputeClasses 中,如果機器類型不支援該磁碟類型,要求特定磁碟類型的有狀態工作負載可能無法存取永久資料。視您在工作負載中建立及使用磁碟的方式而定,請採用下列任一方法,降低無法存取永久資料的風險:
動態磁碟區佈建:在 GKE 1.35.3-gke.1290000 以上版本中,使用設定自動選取磁碟類型的 StorageClass。GKE 會建立與執行工作負載的節點機器類型相容的磁碟類型。在舊版 GKE 中,請確認 ComputeClass 中的所有機器系列,都支援 StorageClass 佈建的磁碟類型。
預先存在的永久磁碟:確認 ComputeClass 中的所有機器系列,都支援預先存在的永久磁碟類型。
如要進一步瞭解各機器系列支援的磁碟類型,請參閱機器系列比較表。
machineFamily 設定
machineFamily 欄位接受 GKE 支援的任何 Compute Engine 機器系列,例如 n2 或 c3。如未指定,預設值為 e2。使用 machineFamily 欄位時,GKE 會從該系列中佈建節點,並使用足以執行 Pod 的機型。自動配置器演算法會根據所有待處理 Pod 的匯總資源要求,決定最合適的大小。如要進一步控管確切的機器大小,請改用 machineType 欄位。
要求更廣泛的機器家族不會佈建裸機機型。舉例來說,要求 c3 或 c4a 時,系統不會分別佈建 c3-standard-192-metal 或 c4a-standard-72-metal 等機型。由於裸機節點類型需要要求確切的機型,因此您也無法使用預先定義的 Autopilot Performance ComputeClass。您必須建立自訂 ComputeClass,並在 machineType 欄位中指定確切的機型。如要搭配使用 c3 或 c4a 裸機機器類型與 ComputeClass、節點集區自動建立功能或 Autopilot 模式,必須使用 GKE 1.35.3-gke.1389000 以上版本。
您可以搭配使用其他 spec.priorities 欄位和 machineFamily 欄位,以宣告方式定義運算需求。例如:
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:機器放置的具體細節:enableNestedVirtualization:是否要在節點上啟用巢狀虛擬化。預設值為false。
以下範例顯示使用 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 以上版本。您可以從 GKE 支援的任何機器系列中指定機型。
您可以指定其他 spec.priorities 欄位和 machineType 欄位,以宣告方式定義運算需求,例如:
spot:使用 Spot VM。預設值為false。storage:設定節點儲存空間。storage.bootDiskType:開機磁碟類型。在 Autopilot 中,僅支援pd-balanced類型的bootDiskType。storage.bootDiskKMSKey:用於開機磁碟加密的 Cloud KMS 金鑰路徑。storage.bootDiskSize:節點開機磁碟的大小 (以 GB 為單位)。storage.localSSDCount:要連接至節點的本機 SSD 數量。如要指定,不得小於1。
enableNestedVirtualization:是否要在節點上啟用巢狀虛擬化。預設值為false。
以下範例顯示使用 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 以上版本。acceleratorNetworkProfile:GPU 的加速晶片 VM 網路設定檔,例如auto。必須使用 GKE 1.35.2-gke.1842000 以上版本。
您也可以指定其他 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:zones:GKE 可佈建節點的 Cloud de Confiance 可用區清單。如未指定,GKE 會在叢集的節點自動佈建設定中設定的可用區佈建節點。如果未設定自動佈建節點的可用區,GKE 會在控制層使用的任何標準可用區中佈建節點。選用:使用 AI 專區,例如
us-central1-ai1a。AI 可用區是專門用於 Cloud de Confiance by S3NS 區域內 AI/機器學習工作負載的位置。zoneTypes:可用區類型清單,指定 GKE 可佈建節點的一組 Cloud de Confiance可用區。支援的值為CLUSTER_DEFAULT(預設)、STANDARD和AI。詳情請參閱「使用位置 zoneTypes 優先順序」。
以下範例顯示 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 slice。 - 如果預留項目沒有可用的 TPU,GKE 會嘗試佈建 16 節點的多主機 TPU v5p 切片,並在 Spot VM 上執行。
- 如果上述規則皆不適用,GKE 會遵循「定義未套用優先順序規則時的調度資源行為」一節中的邏輯。
將 TPU 自訂 ComputeClass 部署至叢集後,請在工作負載中選取該自訂 ComputeClass:
- Autopilot 工作負載:請參閱「在 GKE Autopilot 上部署 TPU 工作負載」中的「使用自訂 ComputeClass 佈建 TPU」一節
- 標準工作負載:請參閱「在 GKE Standard 部署 TPU 工作負載」一文的「使用自訂 ComputeClass 佈建 TPU」一節。
此外,您也可以對 TPU 工作負載執行下列操作:
目標 AI 可用區
您也可以使用運算類別,為 Pod 指定 AI 可用區。AI 可用區是 Cloud de Confiance by S3NS 區域內的專門位置,經過最佳化調整,適用於 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: TPU in any AI zone (On-Demand) --- - tpu: type: tpu-v5p-slice count: 4 topology: 4x4x4 location: zoneTypes: - "AI" # All AI zones in the cluster's region # --- Priority 3: 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,為工作負載佈建具備 v5p TPU 或 A100 GPU 的節點。節點具有下列偏好設定:
- 優先順序 1:嘗試在
us-central1-ai1aAI 區域佈建 TPU。 - 優先順序 2:如果特定 AI 可用區沒有 TPU,則嘗試在叢集區域的任何 AI 可用區佈建 TPU。
- 優先順序 3:如果 AI 可用區沒有 TPU,請嘗試在
us-central1-a或us-central1-b標準可用區佈建 GPU。 - 如果任何指定可用區都沒有 A100 GPU,GKE 就不會擴充節點集區。
DRANET 網路設定
須使用 GKE 1.35.2-gke.1842000 以上版本
如要使用 GKE 代管的 DRANET,為 Pod 要求及分配網路介面,必須在ComputeClass中啟用這項功能。您需要:
- 將
nodePoolConfig.dra.networking.enabled設為true,啟用 DRANET 網路驅動程式。 - 在
priorities清單中,將acceleratorNetworkProfile設為auto。
如要進一步瞭解如何使用 DRANET,請參閱「使用 GKE 代管的 DRANET 分配網路資源」。
GKE 如何使用優先順序規則建立節點
當您部署要求 ComputeClass 的工作負載,且需要新節點時,GKE 會按照出現順序,處理 ComputeClass 規格 priorities 欄位中的規則清單;如果已設定 priorityScore 欄位,則會依分數從高到低處理。
例如,請看以下規格:
spec:
...
priorities:
- machineFamily: n4
spot: true
minCores: 64
- machineFamily: n4
spot: true
- machineFamily: n4
spot: false
部署工作負載時,如果要求使用具有這些優先順序規則的 ComputeClass,GKE 會按照下列方式比對節點:
- GKE 會將 Pod 放在與這個 ComputeClass 相關聯的任何現有節點上。
- 如果現有節點無法容納 Pod,GKE 會佈建使用 N4 機器系列、至少有 64 個 vCPU 的 Spot VM 新節點。
- 如果該區域沒有至少 64 個 vCPU 的 N4 Spot VM,GKE 會佈建新節點,並使用可容納 Pod 的 N4 Spot VM,無論核心數量為何。
- 如果該區域沒有可用的 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 Standard 模式,可能需要手動設定,確保 ComputeClass Pod 按照預期排程。
- 自動建立的節點集區:不需手動設定。GKE 會自動為您執行 ComputeClass 設定步驟。詳情請參閱「自動建立節點集區和 ComputeClasses」。
- 手動建立的節點集區:必須手動設定。您必須在手動建立的節點集區中,新增節點標籤和節點污點,才能將節點與特定 ComputeClass 建立關聯。詳情請參閱「設定手動建立的節點集區,供 ComputeClass 使用」。
設定手動建立的節點集區,供 ComputeClass 使用
如果 GKE Standard 叢集有您手動建立的節點集區,則必須設定這些節點集區,將其與特定 ComputeClass 建立關聯。GKE 只會將要求特定 ComputeClass 的 Pod,排定在與該 ComputeClass 相關聯的節點集區節點上。如果您將 ComputeClass 設為叢集層級預設值,則不適用這項規定。
GKE Autopilot 模式和 GKE Standard 模式中自動建立的節點集區會為您執行這項設定。
如要將手動建立的節點集區與 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,只會在自動調度資源事件期間,觸發這些節點集區內的節點建立作業。
自動建立節點集區和 ComputeClasses
您可以搭配使用節點集區自動建立功能和自訂 ComputeClass,讓 GKE 根據優先順序規則自動建立及刪除節點集區。
如要讓 GKE 自動為 ComputeClass 建立節點集區,請務必完成下列操作:
- 在
ComputeClass規格中,新增nodePoolAutoCreation欄位和enabled: true值。 - 如果叢集執行的版本早於 GKE 1.33.3-gke.1136000,您也必須啟用叢集層級的自動佈建節點功能。
GKE 就能為使用 ComputeClass 的 Pod 建立新的節點集區。GKE 會根據叢集大小和 Pod 需求等因素,決定要擴充現有節點集區,還是建立新的節點集區。如果 Pod 的 ComputeClass 未設定自動建立節點集區,則只會繼續擴充現有節點集區。
您可以在同一個叢集中,使用可自動建立節點集區的 ComputeClass,以及與手動建立節點集區互動的 ComputeClass。
請考量下列與節點集區自動建立功能相關的互動:
- 您無法使用機器家族或 Spot VM 節點選取器,因為這些選取器與 ComputeClass 行為衝突。GKE 會拒絕任何要求 ComputeClass,同時要求 Spot VM 或特定機器系列的 Pod。
如果您為叢集設定預設 ComputeClass,則使用機器家族節點選取器的 Pod,只有在下列情況下,才會觸發該預設類別的節點建立作業:
- Pod 會選取符合叢集層級預設類別中其中一項優先順序規則的機器家族。舉例來說,如果叢集層級預設類別有 N4 執行個體的優先順序規則,則選取 N4 執行個體的 Pod 會觸發節點建立作業。
- 叢集層級預設 ComputeClass 的
spec.whenUnsatisfiable欄位值為ScaleUpAnyway。即使 Pod 選取的機器家族不在 ComputeClass 優先順序中,GKE 也會使用該機器家族建立新節點。
如果 Pod 選取的機器家族不在叢集層級預設類別優先順序中,且 ComputeClass 的
whenUnsatisfiable欄位值為DoNotScaleUp,則不會觸發節點建立作業。您可以為使用
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 定義中指定特定節點集區
在採用叢集自動調度資源功能的 GKE Standard 叢集中,priorities.nodepools 欄位可讓您指定手動建立的節點集區清單,GKE 會嘗試在這些節點集區中排定 Pod,不分先後順序。這個欄位僅支援節點集區清單,您無法在同一優先順序規則中指定其他機器屬性,例如機器系列。部署工作負載時,如果要求使用含有已命名節點集區的 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 無法在這些節點集區中佈建新節點,則會嘗試在 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 的節點。
請見如下範例:
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% 時,節點才會成為整併候選節點。
執行中的遷移作業
「主動遷移」是 ComputeClasses 的選用自動調度資源功能,會自動以新節點取代現有節點。支援下列類型的有效遷移作業:
optimizeRulePriority:GKE 會將使用較低優先順序設定的節點,替換為使用較高優先順序設定的節點。如果可用區容量暫時不足 (ZONE_RESOURCE_POOL_EXHAUSTED),這個選項會自動復原。即使 GKE 原本必須從優先順序較低的規則佈建備用硬體,這個選項也能確保無狀態或可容忍中斷的 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。 - 如果會違反 PodDisruptionBudget,主動遷移作業就不會淘汰 Pod。
- 主動遷移不會取代無法移除的節點。舉例來說,如果主動遷移會違反
--min-nodes節點集區設定,就不會更換節點。
為 ComputeClass 啟用主動遷移功能前,請先考量下列潛在影響:
- Active 遷移作業不會遷移儲存在永久儲存空間 (例如 Compute Engine 永久磁碟) 中的資料。為盡可能降低資料遺失的風險,請勿在有狀態工作負載使用的 ComputeClass 中啟用主動遷移功能。
- 在 Standard 叢集中,如果使用節點集區自動建立功能,且現有節點集區不符合 ComputeClass 中定義的條件,主動遷移可能會觸發建立新的節點集區。
- 如果工作負載使用永久磁碟區,且該磁碟區含有 Hyperdisk 等可用區資源,則可能不適合使用主動遷移功能。部分 Hyperdisk 產品的可用區和機型限制,可能會降低主動遷移的成效。此外,某些有狀態的工作負載可能無法承受主動遷移造成的中斷。
- 如果您更新現有的 ComputeClass 來啟用主動遷移,GKE 會在運算資源可用時,將現有的 Pod 遷移至新節點。
正在遷移至優先順序較高的節點
optimizeRulePriority 主動遷移類型可讓 GKE 將使用低優先順序設定的現有節點,替換為使用高優先順序設定的節點。
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: my-class
spec:
priorities:
- machineFamily: n4
- machineFamily: c4
activeMigration:
optimizeRulePriority: true
如果使用這個 ComputeClass 部署 Pod 時,N4 節點無法使用 (例如可用區資源暫時短缺 (ZONE_RESOURCE_POOL_EXHAUSTED)),GKE 會使用 C4 節點做為備用選項。當您所在位置的 N4 容量恢復或配額增加時,GKE 會自動將工作負載遷移回 N4 節點:
- GKE 會建立新的 N4 節點。
- GKE 會封鎖並清空現有的 C4 節點。系統會遵循 PodDisruptionBudgets 和正常終止設定,將 Pod 淘汰。
- Kubernetes 控制器會建立 Pod 來取代遭淘汰的 Pod。這些新的 Pod 會在 N4 節點上執行。
- C4 節點排空後,GKE 會刪除該節點。
同樣地,如果您使用 priorityScore 欄位為優先順序規則設定明確分數,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
假設您建立了一個使用此 ComputeClass 的單一 Pod Deployment,並要求兩個 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 會將這個 Pod 與 DaemonSet Pod 一起排定在
n4-standard-4節點上。 n4-standard-2節點清空後,GKE 會刪除該節點。
使用 Compute Engine 預留項目
適用於 GKE 1.31.1-gke.2105000 以上版本
如果您使用 Compute Engine 預留運算資源,確保特定Cloud de Confiance 可用區有足夠的硬體資源,可以在自訂 ComputeClass 中設定各個備用優先順序,讓 GKE 在建立新節點時使用預留資源。
如要使用自訂 ComputeClass 耗用 Compute Engine 預留項目,可以採用下列方法:
- 自動建立節點集區:GKE 會自動建立新的節點集區,以使用您指定的預留項目。詳情請參閱「自動建立節點集區和 ComputeClass」。
- 手動建立的節點集區:在 Standard 模式叢集中,您可以在 ComputeClass 中指定
spec.priorities.nodepools欄位,將工作負載轉送至手動建立的節點集區。
從 GKE 1.36.0-gke.3204000 版開始,您可以使用 AnyThenFail 親和性設定,將工作負載設為使用任何相符的預留項目,而不必改用隨選容量。
在手動建立的節點集區中耗用預留項目
如要使用 ComputeClasses,在 Standard 叢集中手動建立的節點集區內使用預留項目,請按照下列步驟操作:
按照「在 GKE Standard 中使用預留執行個體」一文中的步驟,將預留項目繫結至節點集區。
建立 ComputeClass,並使用
nodepools優先順序規則選取手動建立的節點集區。
舉例來說,假設您有兩個節點集區,每個節點集區都連結至不同的容量預留項目。您希望 Pod 使用 reservation-pool-1 節點集區中的預留容量,而非 reservation-pool-2 節點集區。實作這些偏好設定的 ComputeClass 類似於以下範例:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: manual-pool-reservations
spec:
priorities:
- nodepools: ['reservation-pool-1']
- nodepools: ['reservation-pool-2']
在這個範例中,GKE 會先嘗試將 Pod 放在 reservation-pool-1 中,因為該優先順序規則會先出現在 priorities 欄位中。
自動建立節點集區來使用預留項目
如果您使用節點集區自動建立功能,可以要求 GKE 使用預留運算資源,為特定優先順序規則建立節點集區。如要使用自動建立的節點集區中的預留項目,您必須符合下列規定:
- ComputeClass 必須啟用節點集區自動建立功能。
- 只有在定義
machineType或machineFamily時,才能使用非 TPU 預留項目。 - 設定本機 SSD 的 ComputeClasses 必須使用
machineType優先順序規則,而非machineFamily。詳情請參閱「machineType 規則類型」一節。 - 如果 ComputeClasses 為已附加本機 SSD 的
machineType指定預留項目,則必須明確包含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。 - 請勿設定預留項目名稱或專案。
- 確認
任何符合條件且不含備用項目的預留項目:設定下列欄位:
- 確認
reservations.affinity欄位的值為AnyThenFail。 - 請勿設定預留項目名稱或專案。
- 選用。如要在任何相符的預留項目用盡時,嚴格強制執行失敗,請在 ComputeClass 的
spec層級設定whenUnsatisfiable: DoNotScaleUp。
- 確認
TPU 預留項目必須具備特定相似度。不支援 reservations.affinity: AnyBestEffort 和 reservations.affinity: AnyThenFail 設定。
如果 GKE 找不到預留項目的可用容量,則會根據 ComputeClass 優先順序規則中選取的預留項目類型,採取下列行為:
- 特定預留項目:GKE 會嘗試 ComputeClass 中的下一個優先順序規則。
- 任何符合條件的預留項目,並提供備用方案 (
AnyBestEffort):GKE 會嘗試佈建符合該優先順序規則要求的隨需節點。如果 GKE 無法佈建隨選節點,GKE 就會嘗試 ComputeClass 中的下一個優先順序規則。 - 任何符合條件的預留項目,不含備用項目 (
AnyThenFail):GKE 會略過佈建隨需節點,並嘗試 ComputeClass 中的下一個優先順序規則。如果沒有其他適用的規則,系統會根據whenUnsatisfiable設定的值,決定是否執行調度資源作業。
如果 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 資源。
使用這項功能時,請注意下列事項:
- 這些功能僅適用於單一或共用專案中的特定預留項目。
節點數下限
適用於 GKE 1.36.3-gke.1253000 以上版本。
您可以使用 minimumCapacity.targetNodeCount 欄位,指定 GKE 應為整個 ComputeClass 或特定優先順序規則維護的節點數量下限。即使容量閒置,GKE 也會維持至少指定數量的節點。如果工作負載需要基準運算容量,例如大型 AI/機器學習訓練或低延遲服務工作負載,則適合指定容量下限。當工作負載需要更多容量時,GKE 會繼續自動調度節點資源,使其超過下限。
為 ComputeClass 或優先順序規則指定容量下限時,請留意下列行為:
- 如果容量是針對整個 ComputeClass,GKE 會在 ComputeClass 的所有優先順序規則中,維持至少該數量的節點。如果容量是針對特定優先順序規則,GKE 會為該優先順序規則維持至少該數量的節點。
- 如果節點數量少於指定的數量下限,GKE 會自動建立新節點,維持最低容量,即使這些額外節點未執行任何 Pod 也是如此。
- 即使構成最低容量的節點是空的,GKE 也不會縮減這些節點。
- 指定的容量為最小值。在擴充事件期間,GKE 可以超過節點數量下限,執行待處理的 Pod。
- 如果啟用主動遷移至優先順序較高的節點,GKE 就能將最低容量的節點,替換為優先順序較高規則的節點。不過,如果替換節點會導致優先順序規則低於最低容量,GKE 就不會替換節點。
- 資源可用性或配額可能會導致 GKE 無法建立符合最低容量需求的節點。
- 如果 GKE 無法建立足夠的節點,達到優先順序規則的最低容量,就不會改用其他優先順序規則。不過,當資源可用時,GKE 會為該優先順序規則建立缺少的節點。
- 不過,為了維持叢集健康狀態,系統仍可能刪除及更換節點 (例如修復健康狀態不良的節點,或搶占 Spot VM)。GKE 會自動建立新節點,維持最低容量。
視您是為整個 ComputeClass 設定最低容量,還是為特定優先順序規則設定最低容量,適用下列規定:
ComputeClass 的容量下限:如果您為整個 ComputeClass 指定
minimumCapacity.targetNodeCount欄位,則所有優先順序規則都必須直接或間接要求特定機型。每項優先順序規則都必須至少使用下列其中一項設定:machineTypegputpu- 特定運算資源預留項目
如果 ComputeClass 在優先順序規則中使用彈性設定 (例如
machineFamily欄位),同時指定整個 ComputeClass 的容量下限,GKE 會拒絕該 ComputeClass。優先順序規則的容量下限:如果您為特定優先順序規則指定
minimumCapacity.targetNodeCount欄位,該優先順序規則必須直接或間接要求特定機器類型,並至少使用下列其中一項設定:machineTypegputpu- 特定運算資源預留項目
以下範例顯示 ComputeClass 和優先順序規則的最低容量設定:
ComputeClass:
apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: gpu-class-min-nodes spec: nodePoolAutoCreation: enabled: true # Define a global minimum capacity of 5 nodes for this ComputeClass minimumCapacity: targetNodeCount: 5 priorities: - gpu: type: "nvidia-tesla-a100" count: 1 machineType: "a2-highgpu-1g" - gpu: type: "nvidia-l4" count: 1 machineType: "g2-standard-8"優先規則:
apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: tiered-compute-class spec: nodePoolAutoCreation: enabled: true priorities: - machineType: "n2-standard-16" # Maintain at least three nodes of this specific configuration minimumCapacity: targetNodeCount: 3 - machineType: "e2-standard-4"
ComputeClass 及其優先順序規則的容量下限
如果您為 ComputeClass 及其部分優先順序規則指定最低容量,則優先順序規則的最低容量會計入 ComputeClass 的最低容量。系統會按照以下方式運作:
- 如果優先順序規則的最小值總和至少達到 ComputeClass 最小值,則優先順序規則的節點也符合 ComputeClass 最小值。即使在未指定容量下限的高優先順序規則中,GKE 也不會為 ComputeClass 下限建立額外節點。
- ComputeClass 最小值不會限制優先順序規則最小值。GKE 會為每個優先順序規則下限建立所有節點,即使總數超過 ComputeClass 下限也一樣。
- 如果優先順序規則最小值總和小於 ComputeClass 最小值,GKE 會依序使用優先順序規則建立其餘節點。如有需要,GKE 會針對這些剩餘節點,改用優先順序較低的規則。
舉例來說,請參考下列 ComputeClass,其中指定了 ComputeClass 和第二優先順序規則的最低容量:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: combined-min-nodes
spec:
nodePoolAutoCreation:
enabled: true
minimumCapacity:
targetNodeCount: 5
priorities:
- machineType: "n2-standard-16"
- machineType: "e2-standard-16"
minimumCapacity:
targetNodeCount: 3
對於這個 ComputeClass,GKE 會為第二個優先順序規則建立三個 e2-standard-16 節點。這些節點會計入 ComputeClass 至少五個節點的限制。對於其餘兩個節點,GKE 會先嘗試建立 n2-standard-16 節點。如果沒有 n2-standard-16 節點,GKE 會改用 e2-standard-16 節點。
如果啟用主動遷移至優先順序較高的節點,GKE 之後最多可將兩個 e2-standard-16 節點替換為 n2-standard-16 節點。不過,GKE 會保留至少三個 e2-standard-16 節點,以滿足第二優先順序規則的最低容量。
如果將第二個優先順序規則中的 targetNodeCount 欄位設為 6,GKE 就會建立六個 e2-standard-16 節點。這六個節點符合 ComputeClass 至少五個節點的要求,因此 GKE 不會建立任何 n2-standard-16 節點來滿足最低容量。
自訂節點系統設定
您可以使用 ComputeClass 規格中的 nodeSystemConfig 欄位,自訂 kubelet 和 Linux 核心中的特定參數。您可以在任何定義 Compute Engine 機器系列或機型的優先順序規則中,指定這個欄位。您也可以在 ComputeClass 的 priorityDefaults 欄位中新增 nodeSystemConfig 欄位,為優先順序規則中省略的任何節點系統設定欄位設定預設全域值。
這項功能適用於 GKE 1.32.1-gke.1729000 以上版本。
如要瞭解詳情,請參考下列資源:
指定節點標籤和污點
在 ComputeClass 規格中,nodeLabels 和 taints 欄位可讓您定義設定,既能比對現有節點集區,也能控管新節點集區的建立。這些設定可透過 nodePoolConfig 欄位,全域套用至整個 ComputeClass,或使用 priority 欄位,將範圍限定在特定優先順序。不過,請務必確保在優先順序層級定義的標籤和污點,不會與全域設定的標籤和污點重疊。
這些功能適用於:
- GKE 1.33.2-gke.1111000 以上版本的優先順序節點標籤。
- GKE 1.33.4-gke.1350000 以上版本的優先順序污點。
- GKE 1.34.1-gke.3084002 以上版本的全域節點標籤和污點。
除了自訂標籤外,GKE 也會自動將 cloud.google.com/compute-class 系統標籤指派給為 ComputeClass 佈建或與其相關聯的所有節點。您可以依 ComputeClass 篩選及列出節點:
kubectl get nodes -l cloud.google.com/compute-class=COMPUTECLASS_NAME
詳情請參閱「ComputeClass CustomResourceDefinition」。
設定預設 Arm 架構 taint
根據預設,GKE 會將 kubernetes.io/arch=arm64:NoSchedule 污點新增至所有 Arm 節點,包括為自訂 ComputeClass 建立的節點。GKE 只會將可容許這個污點的工作負載排給 Arm 節點,避免 x86 工作負載在不相容的架構上執行。如果工作負載與 x86 和 Arm 都相容,則可停用這項預設污點。任何選取 ComputeClass 的工作負載都可以在 Arm 節點上執行,即使這些工作負載不容許 Arm 架構也沒問題。
您可以更新 Standard 節點集區的預設污點行為,以及為自訂 ComputeClass 建立的節點。如要進一步瞭解如何設定標準節點集區的行為,請參閱「設定預設 Arm 架構污點」。
如要變更預設行為,讓 GKE 將沒有對應容忍度的特定工作負載,排程至為自訂 ComputeClass 建立的 Arm 節點,請按照以下範例設定 ComputeClass:
taintConfig:
architectureTaintBehavior: NONE
這個欄位需要執行 GKE 1.36.2-gke.1498000 以上版本的叢集。
叢集和命名空間的預設 ComputeClass
您可以設定 GKE,對未選取特定 ComputeClass 的 Pod 預設套用 ComputeClass。您可以為特定命名空間或整個叢集定義預設 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 管理的節點集區中,節點使用的 Cloud de Confiance by S3NS 服務帳戶。以下範例說明如何在 ComputeClass 中指定 serviceAccount:
spec:
nodePoolConfig:
serviceAccount: my-service-account@my-project.s3ns.iam.gserviceaccount.com
詳情請參閱「關於 GKE 中的服務帳戶」。
定義 TPU 服務等級目標的工作負載類型
從 GKE 1.32.2-gke.1359000 版開始,您
可以使用
nodePoolConfig 中的 workloadType 欄位,定義 TPU 工作負載的服務水準目標 (SLO)。這個欄位的值會告知 GKE TPU 資源的預期用途。workloadType 欄位支援下列值:
HIGH_AVAILABILITY:如果工作負載著重於可用性 (例如推論服務),請使用這個值,限制並簡化中斷作業。HIGH_THROUGHPUT:如果批次或訓練工作需要所有基礎架構在大部分時間內執行,才能取得進展,請使用這個值。只有在同時指定nodePoolGroup時,才能使用這個值。
下列範例定義了 ComputeClass,適用於針對高可用性推論工作負載最佳化的多主機 TPU 集合。
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
如要瞭解詳情,請參考下列資源:
沙箱設定
須使用 GKE 1.36.2-gke.1368000 以上版本
您可以使用 GKE Sandbox,在沙箱中執行 Pod,將工作負載與節點的主機核心隔離。在 ComputeClasses 中,您可以啟用 GKE Sandbox,並使用 nodePoolConfig.sandbox 欄位選取節點的沙箱類型。支援的沙箱類型如下:
gvisor:需要 GKE 1.36.2-gke.1368000 以上版本。microvm:必須使用 GKE 1.37.0-gke.4713000 以上版本,以及採用巢狀虛擬化技術的節點。
如要進一步瞭解這些沙箱類型的功能、限制和需求條件,請參閱「關於 GKE Sandbox」。
如要使用 ComputeClass 啟用及要求沙箱,請參閱「使用 GKE Sandbox 隔離工作負載」。
執行個體中繼資料設定
需要 GKE 1.36.2-gke.1498000 以上版本。
您可以使用 ComputeClass 規格中的 instanceMetadata 欄位,直接將自訂中繼資料鍵/值組合,新增至叢集自動配置器或節點自動佈建功能為節點集區佈建的 Compute Engine VM 執行個體。這類似於使用 Google Cloud CLI 手動建立節點集區時,指定 --metadata 旗標。
只有 GKE Standard 模式叢集 (spec.autopilot.enabled: false) 支援使用 ComputeClass 自訂執行個體中繼資料設定。
您可以在 ComputeClass 的兩個位置指定 instanceMetadata:
- 全域設定 (
spec.nodePoolConfig.instanceMetadata):將自訂中繼資料鍵/值組合,全域套用至 ComputeClass 建立的所有新節點集區和 VM。 - 特定優先順序覆寫 (
spec.priorities[].instanceMetadata):只有在 GKE 使用階層中的特定優先順序佈建節點時,才會套用自訂中繼資料鍵/值組合。
如果 nodePoolConfig.instanceMetadata 和 priorities[].instanceMetadata 中定義了相同的中繼資料鍵,則 priorities[].instanceMetadata 中指定的值會覆寫全域值。
結構定義和驗證規則
定義 instanceMetadata 時,請遵守下列驗證限制:
- 類型:結構為
map(map[string]string) 的鍵/值組合。 - 大小限制:
- 個別中繼資料值的大小上限為 32 KB (32,768 位元組)。
- 整個
ComputeClass資源中,所有中繼資料鍵/值組合的合併大小上限不得超過 512 KB (524,288 位元組)。
- 鍵的限制和格式:
- 每個
ComputeClass最多可定義 32 個自訂中繼資料鍵/值組合。 - 鍵不得超過 128 個半形字元,且只能包含英數字元、連字號 (
-) 和底線 (_)。
- 每個
- 保留金鑰:GKE 和 Compute Engine 會保留管理叢集作業所需的特定系統中繼資料金鑰 (例如
kube-env、user-data、startup-script和cluster-name)。您無法覆寫或指定保留的系統中繼資料金鑰。 - 現有節點集區的不變性:修改現有
ComputeClass的instanceMetadata,只有在 GKE 佈建新的節點集區時 (啟用nodePoolAutoCreation時) 才會套用。現有的節點集區和 VM 不會追溯修改。
以下範例說明如何設定所有節點集區的全域執行個體中繼資料,以及特定優先順序的中繼資料覆寫:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: metadata-example-class
spec:
nodePoolAutoCreation:
enabled: true
nodePoolConfig:
instanceMetadata:
environment: "production"
team: "backend-platform"
priorities:
- machineFamily: n4
instanceMetadata:
workload-tier: "high-performance"
- machineFamily: e2
instanceMetadata:
workload-tier: "fallback-general"
team: "shared-infra"
設定自動調度資源限制
適用於 GKE 1.36.2-gke.2064000 以上版本。
根據預設,GKE 會為 ComputeClass 佈建新節點,最多不超過整個叢集的自動調度資源限制。如要對特定 ComputeClass 實施更嚴格的資源界限,例如限制可為 ComputeClass 佈建的 GPU、CPU 或節點總數上限,可以套用 CapacityQuota 自訂資源。
詳情請參閱「設定精細資源限制」。
Shielded GKE 節點設定
須使用 GKE 1.36.3-gke.1244000 以上版本
如要為 ComputeClass 管理的自動建立節點集區,設定受防護的 GKE 節點功能 (例如安全啟動和完整性監控),請在 nodePoolAutoCreation 區塊 (spec.nodePoolAutoCreation.shieldedInstanceConfig) 下方指定 shieldedInstanceConfig 欄位。
shieldedInstanceConfig 的預設值取決於叢集模式和 ComputeClass 設定:
- 在標準模式叢集中:
shieldedInstanceConfig在nodePoolAutoCreation調和期間初始化時,除非您明確設定,否則enableIntegrityMonitoring欄位預設為true,enableSecureBoot欄位預設為false。 - 在 Autopilot 叢集中 (或 ComputeClass 中的
spec.autopilot.enabled為true時):enableSecureBoot和enableIntegrityMonitoring欄位預設為true,且無法停用。
以下範例說明如何設定 nodePoolAutoCreation 區塊內的 shieldedInstanceConfig 欄位,為自動建立的節點集區啟用 Shielded GKE 節點功能:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: shielded-ccc
spec:
nodePoolAutoCreation:
enabled: true
shieldedInstanceConfig:
enableSecureBoot: true
enableIntegrityMonitoring: true
在工作負載中要求 ComputeClasses
如要使用自訂 ComputeClass,Pod 必須在 Pod 規格中使用 nodeSelector,明確要求該 ComputeClass。您也可以選擇將 ComputeClass 設為特定 Kubernetes 命名空間的預設值。除非 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: registry.k8s.io/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 用量
您可以使用 Cloud Monitoring 指標,監控叢集自動配置器與 ComputeClass 的互動情形。kubernetes.io/autoscaler/cluster_pending_pods_per_ccc、kubernetes.io/autoscaler/cluster_node_provisioning_attempts_count_per_ccc 和 kubernetes.io/autoscaler/cluster_node_provisioning_failed_attempts_count_per_ccc 等指標會追蹤待處理的 Pod、節點佈建嘗試和佈建失敗。這些指標適用於 GKE 1.37 以上版本。
如要進一步瞭解如何查詢這些指標及解讀標籤,請參閱「查看叢集自動配置器事件和指標」。
限制
- ComputeClass 名稱開頭不得為
gke或autopilot(保留給系統 ComputeClass)。 - 某些叢集的 Pod 建立和刪除率較高,會增加叢集自動配置器的評估時間。在縮放作業期間,叢集自動配置器可能來不及評估 ComputeClass 中的後續優先順序規則,前一項優先順序規則的輪詢延遲時間就已到期。因此,Pod 可能會維持在「Pending」狀態。如要緩解這個問題,請降低 Pod 建立和刪除作業的頻率,例如停用 ComputeClass 的主動遷移功能。
後續步驟
- 瞭解 ComputeClasses 的最佳做法。
- 瞭解如何使用自訂 ComputeClass 控制自動調度資源的節點屬性。
- 進一步瞭解 Autopilot 叢集中的 Balanced 和 水平擴展 ComputeClass。
- 瞭解如何設定節點集區自動建立功能。
- 進一步瞭解 GKE 叢集自動調度資源。
- 瞭解如何為 Autopilot Pod 選擇運算級別。
- 疑難排解自訂 ComputeClass 問題。