預設將運算類別套用至 Pod


本頁說明如何將運算類別預設套用至未明確選取運算類別的 Google Kubernetes Engine (GKE) Pod。本頁說明如何將運算類別設為命名空間和整個叢集的預設值。這些操作說明適用於叢集管理員,可協助他們減少因個別工作負載和節點設定而造成的手動負擔。

閱讀本頁面之前,請先熟悉自訂運算類別

關於預設運算級別

您可以將 GKE 叢集或特定命名空間設定為具有預設運算類別。如果您為叢集或命名空間設定預設類別,該叢集或命名空間中未選取其他運算類別的任何 Pod,都會套用預設類別。部署未選取運算子類的 Pod 時,GKE 會依下列順序套用預設運算子類:

  1. 如果命名空間有預設的運算類別,GKE 會修改 Pod 規格,選取該運算類別。
  2. 如果命名空間沒有預設運算類別,系統會套用叢集層級的預設類別。GKE 不會修改 Pod 規格。

事前準備

開始之前,請確認您已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。

需求條件

  • 如要將運算類別設為叢集層級的預設值,叢集必須執行 GKE 1.33.1-gke.1744000 以上版本。
  • 如要將運算類別設為命名空間層級的預設值,且僅適用於非 DaemonSet Pod,叢集必須執行 GKE 1.33.1-gke.1788000 以上版本。

必要角色和權限

如要取得設定叢集或命名空間層級預設運算類別所需的權限,請要求管理員在 Google Cloud 專案中授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這些預先定義的角色具備設定叢集或命名空間層級預設運算類別所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

如要設定叢集或命名空間層級的預設運算類別,您必須具備下列權限:

  • 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
  • 啟用叢集層級的預設運算級別: container.clusters.update

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

為命名空間設定預設運算類別

您可以在叢集中使用運算類別名稱,為任何 Kubernetes 命名空間加上註解,做為預設值。如果部署到該命名空間的 Pod 尚未選取運算類別,GKE 會修改 Pod 規格,選取命名空間中的預設類別。您可以將任何自訂或內建的運算類別設為預設值。

  • 如要預設將運算類別套用至命名空間中的所有 Pod,請將 cloud.google.com/default-compute-class 標籤新增至該命名空間:

    kubectl label namespaces NAMESPACE_NAME \
        cloud.google.com/default-compute-class=COMPUTECLASS_NAME
    

    更改下列內容:

    • NAMESPACE_NAME:要更新的命名空間名稱。
    • COMPUTECLASS_NAME:要設為命名空間預設值的運算類別名稱。

    如果指令失敗並顯示下列錯誤訊息,表示命名空間已有預設運算類別:

    error: 'cloud.google.com/default-compute-class' already has a value, and --overwrite is false
    

    如要解決這個錯誤,請更新命名空間的預設運算類別

  • 如要預設將運算類別套用至命名空間中的所有非 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 設定預設運算類別:

    error: 'cloud.google.com/default-compute-class-non-daemonset' already has a value, and --overwrite is false
    

    如要解決這個錯誤,請更新命名空間的預設運算類別

更新命名空間中現有的預設運算類別

如要覆寫命名空間的現有預設運算類別,請執行下列其中一個指令:

  • 更新命名空間中所有 Pod 的預設運算類別:

    kubectl label namespaces NAMESPACE_NAME   \
        cloud.google.com/default-compute-class=COMPUTECLASS_NAME \
        --overwrite
    

    更改下列內容:

    • NAMESPACE_NAME:要更新的命名空間名稱。
    • COMPUTECLASS_NAME:要設為命名空間新預設值的運算類別名稱。
  • 覆寫命名空間中非 DaemonSet Pod 的預設運算類別:

    kubectl label namespaces NAMESPACE_NAME \
        cloud.google.com/default-compute-class-non-daemonset=COMPUTECLASS_NAME \
        --overwrite
    

為叢集設定預設運算類別

本節說明如何將運算類別設為叢集的預設值。如果是叢集層級的預設運算類別,請勿為叢集中的現有節點集區手動指定節點汙點和節點標籤。GKE 不會擴充具有節點汙點的節點集區,以用於運算子類別。如果您手動為 default 計算類別新增標籤,GKE 就能擴縮該節點集區。不過,如要使用預設叢集層級的運算類別,則不需要手動設定。

  1. 如要為叢集啟用叢集層級的預設運算類別設定,請執行 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 或標準叢集時指定這個標記。

  2. 儲存下列資訊清單,其中定義了名為 defaultComputeClass

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: default
    spec:
      priorities:
      - machineFamily: n4
      - machineFamily: n2
      whenUnsatisfiable: ScaleUpAnyway
      nodePoolAutoCreation:
        enabled: true
    

    這個資訊清單範例要求使用 N4 執行個體的節點。如果 N4 執行個體無法使用,運算類別會改為要求 N2 執行個體。您可以使用 ComputeClass CustomResourceDefinition 中的任何可用欄位,設定 default 計算類別。

  3. 將資訊清單套用至叢集:

    kubectl apply -f PATH_TO_MANIFEST
    

    PATH_TO_MANIFEST 替換為運算類別資訊清單的路徑。

設定叢集層級的預設運算類別後,GKE 會擴充符合下列兩項條件的節點集區:

  • 節點設定與 default 運算類別的設定相同。
  • 節點集區沒有其他運算類別的汙點或標籤。 GKE 可以擴充具有汙點和標籤的節點集區,適用於 default 計算機類別。

舉例來說,如果 default 計算類別指定 N4 系列機器,GKE 可以調整現有節點集區的資源配置,該集區使用 N4 執行個體,且沒有其他計算類別的汙點或標籤。

驗證預設運算類別行為

如要檢查為命名空間或叢集設定的預設運算類別是否正常運作,請按照下列步驟操作:

  1. 請參閱下列 Deployment 範例:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: helloweb
      labels:
        app: hello
    spec:
      selector:
        matchLabels:
          app: hello
          tier: web
      template:
        metadata:
          labels:
            app: hello
            tier: web
        spec:
          containers:
          - name: hello-app
            image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
            ports:
            - containerPort: 8080
            resources:
              requests:
                cpu: 200m

    這個 Deployment 並未明確要求運算類別。

  2. 建立 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 替換為下列其中一項:

    • 具有預設運算類別的命名空間名稱。
    • 沒有預設運算類別的命名空間名稱。

    GKE 可能需要一些時間才能建立新節點來執行 Pod。

  3. 找出執行範例 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>
    
  4. 取得節點標籤:

    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 中的值為下列其中一項:

    • 叢集層級的預設運算類別:適用於由 GKE Autopilot 或節點自動佈建建立的節點。default手動建立的現有節點集區中,節點可能沒有 cloud.google.com/compute-class 標籤。
    • 命名空間層級的預設運算類別:您設定為命名空間預設值的運算類別名稱。

停用預設運算級別

如要在命名空間或叢集中停用預設運算類別,請採取下列任一做法:

  • 如要為所有 Pod 停用命名空間層級的預設運算類別,請從命名空間移除 cloud.google.com/default-compute-class 標籤:

    kubectl label namespaces NAMESPACE_NAME \
      cloud.google.com/default-compute-class-
    

    標籤鍵結尾的 - 字元會從 Kubernetes API 的 Namespace 物件中移除具有該鍵的所有標籤。

  • 如要為非 DaemonSet Pod 停用命名空間層級的預設運算類別,請從命名空間移除 cloud.google.com/default-compute-class-non-daemonset 標籤:

    kubectl label namespaces NAMESPACE_NAME \
      cloud.google.com/default-compute-class-non-daemonset-
    
  • 如要停用叢集層級的預設運算類別,請使用 gcloud container clusters update 指令並加上 --no-enable-default-compute-class 旗標:

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --no-enable-default-compute-class
    

後續步驟