關於 GKE ComputeClass

您可以定義節點屬性和自動調度資源設定集,Google Kubernetes Engine (GKE) 會使用這些設定建立節點,並透過 ComputeClasses 執行 Pod。本頁說明 ComputeClass 的運作方式、應用實例和優點,以及可用的 ComputeClass 類型。

這項資訊適用於下列人員:

  • 想減少叢集基礎架構管理相關負擔的雲端架構師和平台工程師。
  • 應用程式作業人員和 SRE,希望專注於運算工作負載,不必費心處理底層基礎架構。

ComputeClasses 和叢集自動調度資源簡介

ComputeClass 是一組節點屬性和自動調度資源設定,在 GKE 叢集中以 Kubernetes API 物件的形式存在。您可以在部署的任何 Kubernetes 工作負載中選取 ComputeClass。GKE 叢集自動調度資源功能會使用 ComputeClass 中的屬性,為工作負載建立節點。

平台工程師可以使用 ComputeClasses 為各種工作負載設定基礎架構,確保每個新節點都經過最佳化,符合應用程式的特定需求。ComputeClasses 可提升 GKE 自動調度資源的速度和彈性,並提供宣告式方法,讓您在叢集間設定基礎架構選項。詳情請參閱「使用 ComputeClass 的優點」一節。

特定 GKE 功能和特色僅適用於 ComputeClass,例如:

  • 備用運算優先順序:在 ComputeClass 中定義多組基礎架構設定,並根據偏好設定排定優先順序。在資源調度期間,如果最偏好的設定無法使用,GKE 會改用下一個設定。
  • 主動遷移至優先順序較高的節點:設定後,GKE 會自動將備用優先順序清單中較低的節點,替換為清單中較高的節點。因此,即使在您建立工作負載時,該硬體無法使用,您的 Pod 最終仍會在 ComputeClass 中最偏好的節點上執行。
  • GKE Standard 中的 Autopilot:在 GKE Autopilot 模式中執行工作負載,即可使用 Autopilot 功能,例如容器最佳化運算平台和以 Pod 為準的計費方式,即使在 Standard 叢集中也適用。GKE 會管理這些節點和工作負載,讓您在任何叢集中都能享有 Autopilot 模式的優點。

ComputeClasses 的優點

ComputeClass 可為平台管理員和營運人員帶來下列好處:

  • 提升運算能力的彈性、效率和可用性:ComputeClasses 可擴充 GKE 叢集自動調度資源的功能。ComputeClass 功能 (例如備援優先順序和節點合併參數) 可降低 Pod 處於 Pending 狀態的風險,並增加可用於擴充節點的選項範圍。
  • 宣告式平台層級設定:平台工程師可透過 ComputeClass,以宣告方式描述各種工作負載類型的節點設定。GKE 自動調度資源功能會管理節點和節點集區的建立及設定。您可以將 ComputeClasses 整合至 CI/CD 管道,確保整個平台佈建的基礎架構一致。
  • 減少管理負擔:ComputeClasses 可降低大規模管理基礎架構和工作負載的複雜度。平台工程師會宣告基礎架構類別,應用程式操作人員則會選取工作負載中的相關類別。GKE 會管理資源調度、節點硬體設定,並套用 taint、容許條件和標籤。

關於 ComputeClass 自訂資源

ComputeClass 是 Kubernetes 自訂資源。您可以在資訊清單檔案中定義 ComputeClass 的規格,並在叢集中建立該規格,就像定義及建立 Kubernetes 工作負載資源 (例如 Deployment 和 Service) 一樣。

下列資訊清單範例定義了名為 n4 的 ComputeClass:

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

當 Pod 選取這個 ComputeClass 時,GKE 會在建立新節點時執行下列操作:

  1. GKE 會建立使用 N4 機器系列的節點。
  2. 如果 N4 機器系列無法使用,GKE 會改用 N2 機器系列建立節點。
  3. 如果 N2 機器系列無法使用,GKE 會等到資源可用時再排定 Pod。

您可以使用 ComputeClass 控制節點的各種設定,包括加速器、節點系統設定、節點位置,以及硬體資源無法使用時,GKE 的備用行為。如要進一步瞭解 ComputeClasses 的所有可用設定,請參閱 ComputeClass CustomResourceDefinition。

在工作負載中選取 ComputeClass

如要將 ComputeClass 用於 GKE 工作負載,請在工作負載資訊清單中,使用 cloud.google.com/compute-class 標籤的節點選取器選取 ComputeClass。

下列 Deployment 資訊清單會選取 ComputeClass:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloweb
  labels:
    app: hello
spec:
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      labels:
        app: hello
    spec:
      nodeSelector:
        # Replace with the name of a compute class
        cloud.google.com/compute-class: COMPUTE_CLASS 
      containers:
      - name: hello-app
        image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: "250m"
            memory: "1Gi"

將 COMPUTE_CLASS 替換為叢集中現有的 ComputeClass 名稱。舉例來說,您可以從「關於 ComputeClass 自訂資源」一節或 autopilot 內建的 ComputeClass 指定 n4 ComputeClass。

工作負載規格中的節點設定

在 GKE Standard 中,GKE Autopilot 叢集和自動佈建節點功能可讓您在 Pod 中使用節點選取器,建立具有特定屬性的節點,例如機器系列、Spot VM 或 GPU 和 TPU。ComputeClasses 可讓您集中定義這些需求,不必在每個工作負載中新增個別選取器。

關於預設套用 ComputeClass

您可以設定 GKE,將 ComputeClass 預設套用至未選取特定 ComputeClass 的 Pod。您可以為特定命名空間或整個叢集定義預設 ComputeClass。如要進一步瞭解如何使用預設類別設定叢集或命名空間,請參閱「根據預設將 ComputeClass 套用至 Pod」。

下表說明將 ComputeClass 設為命名空間或叢集的預設值,會產生什麼影響:

預設 ComputeClass 的影響
命名空間層級預設值
  • GKE 只會將 ComputeClass 套用至特定命名空間中的 Pod。
  • GKE 會修改 Pod,為命名空間層級的預設類別新增節點選取器。
  • GKE 只會擴充具有該 ComputeClass 節點標籤和節點污點的節點,與其他運算類別類似。
  • GKE 會為命名空間層級預設類別建立節點,並在這些節點中新增節點標籤和節點污點。
叢集層級預設值
  • GKE 會將 ComputeClass 套用至任何命名空間中的 Pod。
  • GKE 只會將 ComputeClass 套用至沒有 ComputeClass 選取器的 Pod。
  • GKE 不會修改 Pod 規格,為叢集層級預設類別新增節點選取器。
  • GKE 會擴充符合下列任一條件的節點: 條件:
    • 節點沒有其他運算類別的標籤和污點。
    • 節點具有 cloud.google.com/compute-class: default 節點標籤。
  • GKE 會將 cloud.google.com/compute-class: default 節點標籤新增至 GKE 為叢集層級預設類別建立的節點。GKE 不會為這些節點新增任何節點污點。
  • 如果您更新 Autopilot 叢集,將自訂運算級別設為叢集層級的預設值,GKE 預設不會在 Autopilot 容器最佳化運算平台上執行 Pod。在 GKE 1.34.1-gke.1829001 以上版本中,您可以將 cloud.google.com/compute-class: autopilot 節點選取器新增至特定 Pod,以便為這些 Pod 使用 Autopilot 運算平台。

如果 GKE 將命名空間層級的預設 ComputeClass 套用至 Pod,該 Pod 就不會啟動叢集層級的預設 ComputeClass,因為 GKE 會將命名空間層級預設類別的節點選取器新增至 Pod。

預設 ComputeClass 中的有效遷移作業

如果您用做命名空間層級或叢集層級預設值的 ComputeClass,其 activeMigration.optimizeRulePriority 欄位設為 true,可能會看到下列影響:

  • 叢集層級的預設運算類別:如果存在優先順序較低的節點,且 GKE 可以建立優先順序較高的節點,系統可能會觸發主動遷移。視優先順序較低的節點數量而定,遷移作業可能會增加工作負載中斷的情形。
  • 命名空間層級預設運算類別:GKE 只會將運算類別節點選取器插入新建立的 Pod,因此不會觸發主動遷移。現有 Pod 不會自動使用選取器重新建立。

叢集層級預設 ComputeClass

啟用叢集層級預設 ComputeClass 時,名為 default 的 ComputeClass 物件會定義叢集的節點自動調度資源規則。如果叢集已有名為 default 的 ComputeClass,GKE 會使用該 ComputeClass 設定。如果叢集沒有名為 default 的自訂 ComputeClass,GKE 會視為適用下列 ComputeClass 規則:

spec:
  whenUnsatisfiable: ScaleUpAnyway
  nodePoolAutoCreation:
    enabled: true

根據預設,GKE 不會套用任何備用行為,也不會變更自動調度資源節點的設定。如要根據預設將特定屬性套用至自動調度資源的節點,您必須部署名為 default 的自訂 ComputeClass。

設定預設叢集層級運算類別時,請考量下列事項:

  • 為避免 Pod 卡在 Pending 狀態,請將 spec.whenUnsatisfiable 欄位設為 ScaleUpAnyway。即使 Pod 要求的 Compute Engine 機器家族不在叢集層級預設類別的優先順序規則中,GKE 仍可建立節點。如要強制這些 Pod 使用預設 ComputeClass 中的機器家族,請將這個欄位設為 DoNotScaleUp。
  • 如要限制對 default ComputeClass 的變更,請使用 RBAC ClusterRole,限制對名為 default 的 ComputeClass 資源執行 update、patch、delete 和 create 作業。
  • 如要變更叢集自動配置器的預設節點整併參數,請使用 ComputeClass 規格中的 spec.autoscalingPolicy 欄位。您在叢集層級預設 ComputeClass 中為這個欄位指定的參數,會套用至叢集中的所有節點。詳情請參閱「設定節點整併的自動調度資源參數」。

後續步驟