デフォルトで ComputeClass を Pod に適用する

このドキュメントでは、ComputeClass を明示的に選択していない Google Kubernetes Engine(GKE)Pod にデフォルトで ComputeClass を適用する方法について説明します。このページでは、名前空間とクラスタ全体のデフォルトの ComputeClass を設定する手順について説明します。このドキュメントは、個々のワークロードとノードの構成によって発生する手動オーバーヘッドを削減したいクラスタ管理者を対象としています。

読者は カスタム ComputeClass に精通している必要があります。

デフォルトの ComputeClass について

GKE クラスタまたは特定の Namespace にデフォルトの ComputeClass を設定できます。構成したデフォルト クラスは、別の ComputeClass を選択しないクラスタまたは Namespace 内のすべての Pod に適用されます。ComputeClass を選択しない Pod をデプロイすると、GKE は次の順序でデフォルトの ComputeClass を適用します。

  1. Namespace にデフォルトの ComputeClass がある場合、GKE はその ComputeClass を選択するように Pod 仕様を変更します。
  2. Namespace にデフォルトの 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 では、このドキュメントのコマンドを実行できない場合があります。
  • クラスタレベルまたは Namespace レベルでデフォルトの ComputeClass を設定できるバージョンを実行する GKE Autopilot クラスタまたは Standard クラスタがある。詳細については、要件のセクションをご覧ください。
  • Standard モードのクラスタを使用している場合は、次のいずれかの要件を満たしていることを確認してください。

  • カスタム ComputeClass を Namespace のデフォルトとして設定する場合は、カスタム ComputeClass をデプロイします。

要件

  • ComputeClass をクラスタレベルのデフォルトとして設定するには、クラスタで GKE バージョン 1.33.1-gke.1744000 以降を実行する必要があります。
  • DaemonSet 以外の Pod のみに対して ComputeClass を Namespace レベルのデフォルトとして設定するには、クラスタで GKE バージョン 1.33.1-gke.1788000 以降を実行する必要があります。

必要なロールと権限

クラスタレベルまたは Namespace レベルのデフォルトの ComputeClass を構成するために必要な権限を取得するには、 Google Cloud プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

これらの事前定義ロールには、クラスタレベルまたは Namespace レベルのデフォルトの ComputeClass を構成するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

クラスタレベルまたは Namespace レベルのデフォルトの 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
  • Namespace にラベルを追加します。 container.namespaces.update
  • クラスタレベルのデフォルト ComputeClass を有効にします。 container.clusters.update

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

Namespace のデフォルトの ComputeClass を構成する

クラスタ内の任意の Kubernetes Namespace に、デフォルトとして使用する ComputeClass の名前をアノテーションできます。その Namespace にデプロイされた Pod が ComputeClass を選択していない場合、GKE は Namespace のデフォルト クラスを選択するように Pod 仕様を変更します。カスタムまたは組み込みの ComputeClass をデフォルトとして設定できます。

  • デフォルトで Namespace 内のすべての Pod に ComputeClass を適用するには、その Namespace に cloud.google.com/default-compute-class ラベルを追加します。

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

    次のように置き換えます。

    • NAMESPACE_NAME: 更新する Namespace の名前。
    • COMPUTECLASS_NAME: Namespace のデフォルトとして設定する ComputeClass の名前。

    コマンドが次のエラー メッセージで失敗した場合、名前空間にはすでにデフォルトの ComputeClass が存在します。

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

    このエラーを解決するには、名前空間のデフォルトの ComputeClass を更新します。

  • デフォルトで Namespace 内のすべての非 DaemonSet Pod に ComputeClass を適用するには、その Namespace に cloud.google.com/default-compute-class-non-daemonset ラベルを追加します。

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

    コマンドが次のエラー メッセージで失敗した場合、Namespace には DaemonSet 以外の Pod のデフォルトの ComputeClass がすでに存在します。

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

    このエラーを解決するには、名前空間のデフォルトの ComputeClass を更新します。

変更は、その Namespace の新しい Pod に適用されます。既存の Pod は影響を受けません。

Namespace の既存のデフォルトの ComputeClass を更新する

Namespace の既存のデフォルトの ComputeClass を上書きするには、次のいずれかのコマンドを実行します。

  • Namespace 内のすべての Pod のデフォルトの ComputeClass を更新します。

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

    次のように置き換えます。

    • NAMESPACE_NAME: 更新する Namespace の名前。
    • COMPUTECLASS_NAME: Namespace の新しいデフォルトとして設定する ComputeClass の名前。
  • Namespace 内の非 DaemonSet Pod のデフォルトの ComputeClass をオーバーライドします。

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

変更は、その Namespace の新しい Pod に適用されます。既存の Pod は影響を受けません。

クラスタのデフォルトの ComputeClass を構成する

このセクションでは、ComputeClass をクラスタのデフォルトとして設定する方法について説明します。クラスタレベルのデフォルトの ComputeClass の場合、クラスタ内の既存のノードプールにノード taint とノードラベルを手動で指定しないでください。GKE は、ComputeClass のノード taint を持つノードプールをスケーリングしません。default ComputeClass のラベルを手動で追加すると、GKE はそのノードプールをスケーリングできます。ただし、デフォルトのクラスタレベルの ComputeClass を使用するために、この手動構成は必要ありません。

  1. クラスタのクラスタレベルのデフォルトの ComputeClass の設定を有効にするには、--enable-default-compute-class フラグを指定して gcloud container clusters update コマンドを実行します。

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

    次のように置き換えます。

    • CLUSTER_NAME: クラスタの名前。
    • CONTROL_PLANE_LOCATION: クラスタ コントロール プレーンのロケーション(us-central1 など)。

    このフラグは、Autopilot クラスタまたは Standard クラスタの作成時に指定することもできます。

  2. 次のマニフェストを保存します。このマニフェストは、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 インスタンスをリクエストします。default ComputeClass は、ComputeClass CustomResourceDefinition で使用可能な任意のフィールドを使用して構成できます。

  3. マニフェストをクラスタに適用します。

    kubectl apply -f PATH_TO_MANIFEST
    

    PATH_TO_MANIFEST は、ComputeClass のマニフェストのパスに置き換えます。

クラスタレベルのデフォルトの ComputeClass を設定すると、GKE は次の両方の要件を満たすノードプールをスケーリングします。

  • ノード構成は、default ComputeClass の構成と同じです。
  • ノードプールに、別の ComputeClass の taint またはラベルがない。GKE は、default ComputeClass の taint とラベルを持つノードプールをスケーリングできます。

たとえば、default ComputeClass で N4 マシンシリーズが指定されている場合、GKE は N4 インスタンスを使用し、別の ComputeClass の taint やラベルがない既存のノードプールをスケーリングできます。

変更は、ComputeClass がまだないクラスタ内のすべての新しい Pod に適用されます。既存の Pod は、クラスタレベルのデフォルト ComputeClass のアクティブな移行の設定に応じて影響を受ける可能性があります。詳細については、デフォルトの ComputeClass でのアクティブ マイグレーションをご覧ください。

デフォルトの ComputeClass の動作を確認する

Namespace またはクラスタに設定したデフォルトの ComputeClass が想定どおりに機能するかどうかを確認するには、次の操作を行います。

  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 は ComputeClass を明示的にリクエストしていません。

  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 を次のいずれかに置き換えます。

    • デフォルトの ComputeClass を持つ Namespace の名前。
    • デフォルトの ComputeClass がない Namespace の名前。

    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 の値は次のいずれかです。

    • クラスタレベルのデフォルトの ComputeClass: GKE Autopilot またはノードプール自動作成によって作成されたノードの default。既存の手動で作成されたノードプール内のノードには、cloud.google.com/compute-class ラベルがない場合があります。
    • Namespace レベルのデフォルトの ComputeClass: Namespace のデフォルトとして構成した ComputeClass の名前。

デフォルトの ComputeClass を無効にする

Namespace またはクラスタでデフォルトの ComputeClass を無効にするには、次のいずれかを行います。

  • すべての Pod の Namespace レベルのデフォルトの ComputeClass を無効にするには、Namespace から 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 を無効にするには、--no-enable-default-compute-class フラグを指定して gcloud container clusters update コマンドを使用します。

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

次のステップ