デフォルトでコンピューティング クラスを Pod に適用する


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

このページを読む前に、カスタム コンピューティング クラスについて理解しておいてください。

デフォルトのコンピューティング クラスについて

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

  1. Namespace にデフォルトのコンピューティング クラスがある場合、GKE はそのコンピューティング クラスを選択するように Pod 仕様を変更します。
  2. Namespace にデフォルトのコンピューティング クラスがない場合、クラスタレベルのデフォルト クラスが適用されます。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 の Namespace レベルのデフォルトとしてコンピューティング クラスを設定するには、クラスタで GKE バージョン 1.33.1-gke.1788000 以降を実行する必要があります。

必要なロールと権限

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

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

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

必要な権限

クラスタまたは Namespace レベルのデフォルトのコンピューティング クラスを構成するには、次の権限が必要です。

  • 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
  • クラスタレベルのデフォルトのコンピューティング クラスを有効にします。 container.clusters.update

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

Namespace のデフォルトのコンピューティング クラスを構成する

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

  • デフォルトで Namespace 内のすべての Pod にコンピューティング クラスを適用するには、その 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 のデフォルトとして設定するコンピューティング クラスの名前。

    コマンドが次のエラー メッセージで失敗した場合、Namespace にはすでにデフォルトのコンピューティング クラスがあります。

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

    このエラーを解決するには、Namespace のデフォルトのコンピューティング クラスを更新します。

  • デフォルトで Namespace 内のすべての非 DaemonSet Pod にコンピューティング クラスを適用するには、その 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 のデフォルトのコンピューティング クラスがすでに存在します。

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

    このエラーを解決するには、Namespace のデフォルトのコンピューティング クラスを更新します。

Namespace の既存のデフォルトのコンピューティング クラスを更新する

Namespace の既存のデフォルトのコンピューティング クラスを上書きするには、次のいずれかのコマンドを実行します。

  • Namespace 内のすべての Pod のデフォルトのコンピューティング クラスを更新します。

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

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

    • NAMESPACE_NAME: 更新する Namespace の名前。
    • COMPUTECLASS_NAME: Namespace の新しいデフォルトとして設定するコンピューティング クラスの名前。
  • Namespace 内の非 DaemonSet Pod のデフォルトのコンピューティング クラスをオーバーライドします。

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

クラスタのデフォルトのコンピューティング クラスを構成する

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

  1. クラスタのクラスタレベルのデフォルト コンピューティング クラスの設定を有効にするには、--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 インスタンスが使用できない場合、コンピューティング クラスは代わりに N2 インスタンスをリクエストします。default コンピューティング クラスは、ComputeClass CustomResourceDefinition で使用可能な任意のフィールドを使用して構成できます。

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

    kubectl apply -f PATH_TO_MANIFEST
    

    PATH_TO_MANIFEST は、コンピューティング クラスのマニフェストのパスに置き換えます。

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

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

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

デフォルトのコンピューティング クラスの動作を確認する

Namespace またはクラスタに設定したデフォルトのコンピューティング クラスが想定どおりに機能するかどうかを確認する手順は次のとおりです。

  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 は、確認する内容に応じて次のいずれかに置き換えます。

    • デフォルトのコンピューティング クラスを持つ Namespace の名前。
    • デフォルトのコンピューティング クラスがない 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 の値は次のいずれかです。

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

デフォルトのコンピューティング クラスを無効にする

Namespace またはクラスタでデフォルトのコンピューティング クラスを無効にするには、次のいずれかを行います。

  • すべての Pod で Namespace レベルのデフォルトのコンピューティング クラスを無効にするには、Namespace から cloud.google.com/default-compute-class ラベルを削除します。

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

    ラベルキーの末尾にある - 文字は、そのキーを持つラベルを Kubernetes API の Namespace オブジェクトから削除します。

  • 非 DaemonSet Pod の Namespace レベルのデフォルトのコンピューティング クラスを無効にするには、Namespace から cloud.google.com/default-compute-class-non-daemonset ラベルを削除します。

    kubectl label namespaces NAMESPACE_NAME \
      cloud.google.com/default-compute-class-non-daemonset-
    
  • クラスタレベルのデフォルトのコンピューティング クラスを無効にするには、--no-enable-default-compute-class フラグを指定して gcloud container clusters update コマンドを使用します。

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

次のステップ