このドキュメントでは、ComputeClass を明示的に選択していない Google Kubernetes Engine(GKE)Pod にデフォルトで ComputeClass を適用する方法について説明します。このページでは、名前空間とクラスタ全体のデフォルトの ComputeClass を設定する手順について説明します。このドキュメントは、個々のワークロードとノードの構成によって発生する手動オーバーヘッドを削減したいクラスタ管理者を対象としています。
読者は カスタム ComputeClass に精通している必要があります。
デフォルトの ComputeClass について
GKE クラスタまたは特定の Namespace にデフォルトの ComputeClass を設定できます。構成したデフォルト クラスは、別の ComputeClass を選択しないクラスタまたは Namespace 内のすべての Pod に適用されます。ComputeClass を選択しない Pod をデプロイすると、GKE は次の順序でデフォルトの ComputeClass を適用します。
- Namespace にデフォルトの ComputeClass がある場合、GKE はその ComputeClass を選択するように Pod 仕様を変更します。
- 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 モードのクラスタを使用している場合は、次のいずれかの要件を満たしていることを確認してください。
- クラスタ内の少なくとも 1 つのノードプールで自動スケーリングを有効にします。
- Standard クラスタが 1.33.3-gke.1136000 より前のバージョンを実行していて、Rapid リリース チャンネルに登録されていない場合は、クラスタレベルのノード自動プロビジョニングを有効にします。
カスタム 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 ロールを付与するよう管理者に依頼してください。
-
Kubernetes Engine デベロッパー (
roles/container.developer
) -
クラスタレベルのデフォルト ComputeClass を更新する: Kubernetes Engine クラスタ管理者 (
roles/container.clusterAdmin
)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
これらの事前定義ロールには、クラスタレベルまたは 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 を使用するために、この手動構成は必要ありません。
クラスタのクラスタレベルのデフォルトの 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 クラスタの作成時に指定することもできます。
次のマニフェストを保存します。このマニフェストは、
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 で使用可能な任意のフィールドを使用して構成できます。マニフェストをクラスタに適用します。
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 が想定どおりに機能するかどうかを確認するには、次の操作を行います。
次の Deployment の例を確認します。
この Deployment は ComputeClass を明示的にリクエストしていません。
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 を実行する新しいノードを作成するまでに時間がかかることがあります。
サンプル 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>
ノードラベルを取得します。
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: GKE Autopilot またはノードプール自動作成によって作成されたノードの
デフォルトの 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
次のステップ
- GKE のカスタム ComputeClass の詳細を確認する。