本文說明如何將 ComputeClass 預設套用至未明確選取 ComputeClass 的 Google Kubernetes Engine (GKE) Pod。本頁說明如何在命名空間和整個叢集中,將 ComputeClass 設為預設值。本文適用於叢集管理員,可協助他們減少因個別工作負載和節點設定而造成的手動負擔。
您應該已熟悉自訂 ComputeClass。
關於預設 ComputeClass
您可以將 GKE 叢集或特定命名空間設定為具有預設 ComputeClass。您設定的預設類別會套用至該叢集或命名空間中,未選取其他 ComputeClass 的任何 Pod。部署未選取 ComputeClass 的 Pod 時,GKE 會依下列順序套用預設 ComputeClass:
- 如果命名空間有預設的 ComputeClass,GKE 會修改 Pod 規格來選取該 ComputeClass。
- 如果命名空間沒有預設的 ComputeClass,系統會套用叢集層級的預設類別。GKE 不會修改 Pod 規格。
如果預設 ComputeClass 的 activeMigration.optimizeRulePriority
欄位設為 true
,這項設定可能會影響叢集中的工作負載。詳情請參閱「預設 ComputeClass 中的主動遷移」。
事前準備
開始之前,請確認您已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update
指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
- 擁有 GKE Autopilot 或 Standard 叢集,且執行版本支援在叢集或命名空間層級設定預設 ComputeClass。詳情請參閱「規定」一節。
如果您使用標準模式叢集,請確認符合下列其中一項規定:
- 在叢集中的至少一個節點集區上啟用自動調度資源。
- 如果 Standard 叢集執行的版本低於 1.33.3-gke.1136000,且未註冊搶鮮版發布管道,請啟用叢集層級的節點自動佈建功能。
如要將自訂 ComputeClass 設為命名空間的預設值,請部署自訂 ComputeClass。
需求條件
- 如要將 ComputeClass 設為叢集層級的預設值,叢集必須執行 GKE 1.33.1-gke.1744000 以上版本。
- 如要將 ComputeClass 設為命名空間層級的預設值,但僅適用於非 DaemonSet Pod,叢集必須執行 GKE 1.33.1-gke.1788000 以上版本。
必要角色和權限
如要取得設定叢集或命名空間層級預設 ComputeClass 所需的權限,請要求管理員在 Google Cloud 專案中授予您下列 IAM 角色:
-
Kubernetes Engine 開發人員 (
roles/container.developer
) -
更新叢集層級的預設 ComputeClass:
Kubernetes Engine 叢集管理員 (
roles/container.clusterAdmin
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這些預先定義的角色具備設定叢集或命名空間層級預設 ComputeClass 所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
如要設定叢集或命名空間層級的預設 ComputeClass,您必須具備下列權限:
-
container.customResourceDefinitions.create
-
container.customResourceDefinitions.update
-
container.customResourceDefinitions.get
-
container.customResourceDefinitions.list
-
container.namespaces.get
-
container.namespaces.list
-
container.pods.get
-
container.nodes.get
-
container.nodes.list
-
container.deployments.create
-
container.deployments.get
-
為命名空間新增標籤:
container.namespaces.update
-
啟用叢集層級的預設 ComputeClass:
container.clusters.update
為命名空間設定預設 ComputeClass
您可以在叢集中的任何 Kubernetes 命名空間,使用 ComputeClass 名稱做為預設值。如果部署到該命名空間的 Pod 尚未選取 ComputeClass,GKE 會修改 Pod 規格,選取命名空間中的預設類別。您可以將任何自訂或內建的 ComputeClass 設為預設值。
如要預設將 ComputeClass 套用至命名空間中的所有 Pod,請將
cloud.google.com/default-compute-class
標籤新增至該命名空間:kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class=COMPUTECLASS_NAME
更改下列內容:
NAMESPACE_NAME
:要更新的命名空間名稱。COMPUTECLASS_NAME
:要設為命名空間預設值的 ComputeClass 名稱。
如果指令失敗並顯示下列錯誤訊息,表示命名空間已有預設的 ComputeClass:
error: 'cloud.google.com/default-compute-class' already has a value, and --overwrite is false
如要解決這個錯誤,請更新命名空間的預設 ComputeClass。
如要預設將 ComputeClass 套用至命名空間中的所有非 DaemonSet Pod,請將
cloud.google.com/default-compute-class-non-daemonset
標籤新增至該命名空間:kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class-non-daemonset=COMPUTECLASS_NAME
如果指令失敗並顯示下列錯誤訊息,表示命名空間已為非 DaemonSet Pod 設定預設 ComputeClass:
error: 'cloud.google.com/default-compute-class-non-daemonset' already has a value, and --overwrite is false
如要解決這個錯誤,請更新命名空間的預設 ComputeClass。
您所做的變更會套用至該命名空間中的所有新 Pod。現有的 Pod 不會受到影響。
更新命名空間中現有的預設 ComputeClass
如要覆寫命名空間的現有預設 ComputeClass,請執行下列其中一個指令:
更新命名空間中所有 Pod 的預設 ComputeClass:
kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class=COMPUTECLASS_NAME \ --overwrite
更改下列內容:
NAMESPACE_NAME
:要更新的命名空間名稱。COMPUTECLASS_NAME
:要設為命名空間新預設值的 ComputeClass 名稱。
覆寫命名空間中非 DaemonSet Pod 的預設 ComputeClass:
kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class-non-daemonset=COMPUTECLASS_NAME \ --overwrite
您所做的變更會套用至該命名空間中的所有新 Pod。現有 Pod 不會受到影響。
為叢集設定預設的 ComputeClass
本節說明如何將 ComputeClass 設為叢集的預設值。如果是叢集層級的預設 ComputeClass,請勿為叢集中的現有節點集區手動指定節點汙點和節點標籤。GKE 不會擴充具有 ComputeClass 節點汙染的節點集區。如果您手動為 default
ComputeClass 新增標籤,GKE 就能擴縮該節點集區。不過,如要使用預設叢集層級的 ComputeClass,則不需要手動設定。
如要為叢集啟用叢集層級的預設 ComputeClass,請執行
gcloud container clusters update
指令並加上--enable-default-compute-class
標記:gcloud container clusters update CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --enable-default-compute-class
更改下列內容:
CLUSTER_NAME
:叢集名稱。CONTROL_PLANE_LOCATION
:叢集控制平面的位置,例如us-central1
。
您也可以在建立 Autopilot 或標準叢集時指定這個標記。
儲存下列資訊清單,其中定義了名為
default
的ComputeClass
:apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: default spec: priorities: - machineFamily: n4 - machineFamily: n2 whenUnsatisfiable: ScaleUpAnyway nodePoolAutoCreation: enabled: true
這個資訊清單範例要求使用 N4 執行個體的節點。如果 N4 執行個體無法使用,ComputeClass 會改為要求 N2 執行個體。您可以透過 ComputeClass CustomResourceDefinition 中的任何可用欄位,設定
default
ComputeClass。將資訊清單套用至叢集:
kubectl apply -f PATH_TO_MANIFEST
將
PATH_TO_MANIFEST
替換為 ComputeClass 的資訊清單路徑。
設定叢集層級的預設 ComputeClass 後,GKE 會擴充符合下列兩項條件的節點集區:
- 節點設定與
default
ComputeClass 的設定相同。 - 節點集區沒有其他 ComputeClass 的汙點或標籤。GKE 可以調度具有汙點和
default
ComputeClass 標籤的節點集區。
舉例來說,如果 default
ComputeClass 指定 N4 系列機器,GKE 可以調整現有節點集區的資源配置,該集區使用 N4 執行個體,且沒有其他 ComputeClass 的汙點或標籤。
變更會套用至叢集中所有沒有 ComputeClass 的新 Pod。現有 Pod 可能會受到影響,具體情況取決於叢集層級預設 ComputeClass 的有效遷移設定。詳情請參閱「預設 ComputeClass 中的主動遷移」。
驗證預設的 ComputeClass 行為
如要檢查為命名空間或叢集設定的預設 ComputeClass 是否正常運作,請按照下列步驟操作:
請參閱下列 Deployment 範例:
這個 Deployment 並未明確要求 ComputeClass。
建立 Deployment:
kubectl apply --namespace=NAMESPACE_NAME \ -f https://raw.githubusercontent.com/GoogleCloudPlatform/kubernetes-engine-samples/refs/heads/main/quickstarts/hello-app/manifests/helloweb-deployment.yaml
視要驗證的項目而定,將
NAMESPACE_NAME
替換為下列其中一項:- 具有預設 ComputeClass 的命名空間名稱。
- 沒有預設 ComputeClass 的命名空間名稱。
GKE 可能需要一些時間才能建立新節點來執行 Pod。
找出執行範例 Deployment 中 Pod 的節點:
kubectl get pods --namespace=NAMESPACE_NAME \ --selector=app=hello -o=wide
輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES helloweb-7795fbf856-58n5l 1/1 Running 0 9m21s 10.52.2.3 gke-cluster-1-nap-n2-highcpu-2-3muqi8-f213e529-rx7d <none> <none>
取得節點標籤:
kubectl get node NODE_NAME --show-labels \ | grep "cloud.google.com/compute-class"
將
NODE_NAME
替換為上一步輸出內容中的節點名稱。輸出結果會與下列內容相似:
NODE_NAME Ready <none> 22m v1.32.4-gke.1236007 # lines are omitted from this output cloud.google.com/compute-class=COMPUTECLASS_NAME,cloud.google.com/gke-boot-disk=pd-balanced,cloud.google.com/gke-container-runtime=containerd
COMPUTECLASS_NAME
中的值為下列其中一項:- 叢集層級的預設 ComputeClass:適用於由 GKE Autopilot 或節點集區自動建立的節點。
default
手動建立的現有節點集區中,節點可能沒有cloud.google.com/compute-class
標籤。 - 命名空間層級的預設 ComputeClass:您設定為命名空間預設值的 ComputeClass 名稱。
- 叢集層級的預設 ComputeClass:適用於由 GKE Autopilot 或節點集區自動建立的節點。
停用預設 ComputeClass
如要在命名空間或叢集中停用預設 ComputeClass,請執行下列其中一項操作:
如要為所有 Pod 停用命名空間層級的預設 ComputeClass,請從命名空間移除
cloud.google.com/default-compute-class
標籤:kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class-
標籤鍵結尾的
-
字元會從 Kubernetes API 的Namespace
物件中移除具有該鍵的所有標籤。如要為非 DaemonSet Pod 停用命名空間層級的預設 ComputeClass,請從命名空間移除
cloud.google.com/default-compute-class-non-daemonset
標籤:kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class-non-daemonset-
如要停用叢集層級的預設 ComputeClass,請使用
gcloud container clusters update
指令並加上--no-enable-default-compute-class
旗標:gcloud container clusters update CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --no-enable-default-compute-class
後續步驟
- 進一步瞭解 GKE 中的自訂 ComputeClass。