GKE ComputeClass について

ComputeClasses を使用すると、Google Kubernetes Engine(GKE)が Pod を実行するノードの作成に使用するノード属性と自動スケーリング設定のセットを定義できます。このページでは、ComputeClass の仕組み、ユースケースとメリット、使用可能な ComputeClass のタイプについて説明します。

この情報は、次のような方を対象としています。

  • クラスタ インフラストラクチャの管理に関連するオーバーヘッドを削減したいクラウド アーキテクトとプラットフォーム エンジニア。
  • 基盤となるインフラストラクチャを気にすることなく、ワークロードの運用に集中したいアプリ オペレーターと SRE。

ComputeClass とクラスタの自動スケーリングについて

ComputeClass は、GKE クラスタの Kubernetes API オブジェクトとして存在するノード属性と自動スケーリング設定のセットです。デプロイする Kubernetes ワークロードで ComputeClass を選択できます。GKE クラスタの自動スケーリングでは、ComputeClass の属性を使用してワークロードのノードを作成します。

プラットフォーム エンジニアは、ComputeClass を使用してさまざまなタイプのワークロードのインフラストラクチャを構成できます。これにより、すべての新しいノードがアプリケーションの特定の要件に合わせて最適化されます。ComputeClass は、GKE 自動スケーリングの速度と柔軟性を向上させ、クラスタ全体でインフラストラクチャ オプションを構成する宣言型メソッドを提供します。詳細については、ComputeClasses を使用するメリットをご覧ください。

次の機能など、特定の GKE の機能は ComputeClass でのみ使用できます。

  • フォールバック コンピューティングの優先度: ComputeClass でインフラストラクチャ構成の複数のセットを定義し、設定に基づいて優先順位を付けます。スケーリング中に最も優先される構成が使用できない場合、GKE は次の構成にフォールバックします。
  • 優先度の高いノードへのアクティブな移行: 構成すると、GKE はフォールバック優先度のリストで優先度の低いノードを、リストで優先度の高いノードに自動的に置き換えます。その結果、ワークロードの作成時にそのハードウェアが使用可能でなかった場合でも、最終的には Pod が ComputeClass の最も優先度の高いノードで実行されます。
  • GKE Standard の Autopilot: GKE Autopilot モードでワークロードを実行して、Standard クラスタでもコンテナ最適化コンピューティング プラットフォームや Pod ベースの課金などの Autopilot 機能を使用します。GKE はこれらのノードとワークロードを管理し、任意のクラスタで Autopilot モードのメリットを提供します。

ComputeClass のメリット

ComputeClass は、プラットフォーム管理者とオペレーターに次のようなメリットをもたらします。

  • リソースの取得可能性の向上: ComputeClass は、GKE クラスタの自動スケーリングの機能を拡張します。フォールバックの優先順位やノード統合パラメータなどの ComputeClass 機能を使用すると、Pod が保留状態になるリスクを軽減し、ノードのスケーリングに使用できるオプションの範囲を広げることができます。
  • 宣言型プラットフォーム レベルの構成: ComputeClass を使用すると、プラットフォーム エンジニアはさまざまなワークロード タイプのノード構成を宣言的に記述できます。GKE 自動スケーリングは、ノードとノードプールの作成と構成を管理します。ComputeClass を CI/CD パイプラインに統合して、プラットフォーム全体でプロビジョニングされたインフラストラクチャの一貫性を確保できます。
  • 管理オーバーヘッドの削減: ComputeClass を使用すると、インフラストラクチャとワークロードの大規模な管理の複雑さが軽減されます。プラットフォーム エンジニアはインフラストラクチャのクラスを宣言し、アプリ オペレーターはワークロードで関連するクラスを選択します。GKE は、スケーリング、ノード ハードウェア構成を管理し、taint、toleration、ラベルを適用します。

ComputeClass カスタム リソースについて

ComputeClass は Kubernetes カスタム リソースです。マニフェスト ファイルで ComputeClass の仕様を定義し、クラスタに作成できます。これは、Deployment や Service などの Kubernetes ワークロード リソースを定義して作成する方法と同様です。

次のマニフェストの例では、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 のフォールバック動作など、ノードのさまざまな設定を制御できます。ComputeClass で使用可能なすべての構成の詳細については、ComputeClass CustomResourceDefinition をご覧ください。

ワークロードでの ComputeClass の選択

GKE ワークロードで ComputeClass を使用するには、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: "4Gi"

COMPUTE_CLASS は、クラスタに存在する ComputeClass の名前に置き換えます。たとえば、ComputeClass カスタム リソースについてセクションの n4 ComputeClass または autopilot 組み込み ComputeClass を指定できます。

ワークロード仕様のノード構成

GKE Autopilot クラスタと GKE Standard のノードの自動プロビジョニングを使用すると、Pod でノードセレクタを使用して、マシン ファミリー、Spot VM、GPU、TPU などの特定のプロパティを持つノードを作成できます。ComputeClass を使用すると、個々のセレクタをすべてのワークロードに追加するのではなく、これらの要件を一元的に定義できます。

ComputeClass のデフォルトでの適用について

特定の ComputeClass を選択しない Pod にデフォルトで ComputeClass を適用するように GKE を構成できます。特定の Namespace またはクラスタ全体に対してデフォルトの ComputeClass を定義できます。デフォルト クラスを使用してクラスタまたは Namespace を構成する方法については、デフォルトで ComputeClass を Pod に適用するをご覧ください。

次の表に、Namespace またはクラスタのデフォルトとして ComputeClass を設定した場合の影響を示します。

デフォルトの ComputeClass の効果
Namespace レベルのデフォルト
  • GKE は、特定の Namespace の Pod にのみ ComputeClass を適用します。
  • GKE は、Namespace レベルのデフォルト クラスのノードセレクタを追加するように Pod を変更します。
  • GKE は、他のコンピューティング クラスと同様に、その ComputeClass のノードラベルとノード taint を持つノードのみをスケールアップします。
  • GKE は、Namespace レベルのデフォルト クラス用に GKE が作成するノードに、ノードラベルとノード taint を追加します。
クラスタレベルのデフォルト
  • GKE は、任意の Namespace の Pod に ComputeClass を適用します。
  • GKE は、ComputeClass の既存のセレクタがない Pod にのみ ComputeClass を適用します。
  • GKE は、クラスタレベルのデフォルト クラスのノードセレクタを追加するために Pod 仕様を変更しません。
  • GKE は、次のいずれかの条件を満たすノードをスケールアップします。
    • ノードには、別のコンピューティング クラスのラベルと taint がありません。
    • ノードに cloud.google.com/compute-class: default ノードラベルが付いている。
  • GKE は、クラスタレベルのデフォルト クラス用に GKE が作成するノードに cloud.google.com/compute-class: default ノードラベルを追加します。GKE は、これらのノードにノード taint を追加しません。
  • Autopilot クラスタを更新して、クラスタレベルのデフォルトとしてカスタム コンピューティング クラスを使用する場合、GKE はデフォルトで Autopilot コンテナ最適化コンピューティング プラットフォームで Pod を実行しません。GKE バージョン 1.33.1-gke.1107000 以降では、特定の Pod に cloud.google.com/compute-class: autopilot ノードセレクタを追加することで、それらの Pod に Autopilot コンピューティング プラットフォームを使用できます。

GKE が Namespace レベルのデフォルトの ComputeClass を Pod に適用すると、GKE は Namespace レベルのデフォルト クラスのノードセレクタを Pod に追加するため、その Pod はクラスタレベルのデフォルトの ComputeClass を有効にしません。

クラスタレベルのデフォルト 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 リソースに対する updatepatchdeletecreate オペレーションを制限します。
  • クラスタ オートスケーラーのデフォルトのノード統合パラメータを変更するには、ComputeClass 仕様の spec.autoscalingPolicy フィールドを使用します。クラスタレベルのデフォルトの ComputeClass でこのフィールドに指定するパラメータは、クラスタ内のすべてのノードに適用されます。詳細については、ノード統合の自動スケーリング パラメータを設定するをご覧ください。

次のステップ