このページでは、特定の GKE ワークロードで予約済みの Compute Engine ゾーンリソースを使用する方法について説明します。これらの容量予約により、ワークロードで特定のハードウェアを使用できることを高いレベルで保証できます。
コンシューマ タイプ、共有タイプ、プロビジョニング タイプなど、Compute Engine 予約のコンセプトを理解しておいてください。詳細については、Compute Engine ゾーンリソースの予約をご覧ください。
このページは、次のような方を対象としています。
- できるだけ早く実行する必要があるワークロードをデプロイするアプリケーション オペレーター(通常は GPU などの専用ハードウェアを使用)。
- ワークロードがアプリケーションと組織の両方の要件を満たす最適化されたハードウェアで実行されることを高いレベルで保証したいプラットフォーム管理者。
GKE での予約の使用について
Compute Engine 容量予約を使用すると、Google Cloud ゾーンに特定のハードウェア構成をすぐに、または指定した将来の時点でプロビジョニングできます。その後、この予約済み容量を GKE で使用できます。
GKE の運用モードに応じて、次の予約タイプを使用できます。
- Autopilot モード: 特定の予約のみ。
- 標準モード: 特定の予約または一致する予約。
予約の使用を有効にしてリソースを作成するには、予約アフィニティ(any
や specific
など)を指定する必要があります。
GKE での予約使用オプション
GKE では、ワークロード マニフェストで Kubernetes nodeSelector を使用するか、予約を使用する Standard モードのノードプールを作成することで、個々のワークロードで予約を直接使用できます。このページでは、個々のリソースで予約を直接選択する方法について説明します。
カスタム コンピューティング クラスを使用して、新しいノードを作成するスケーリング オペレーション中に予約を使用するように GKE を構成することもできます。カスタム コンピューティング クラスを使用すると、プラットフォーム管理者は、GKE がノード スケーリング中に優先順位付けを行うノードの構成の階層を定義して、ワークロードが選択したハードウェアで実行されるようにできます。
カスタム コンピューティング クラスの構成で予約を指定すると、そのカスタム コンピューティング クラスを使用する GKE ワークロードは、そのコンピューティング クラスに指定された予約を使用するように GKE に指示します。
詳細については、[カスタム コンピューティング クラスについて] ページの Compute Engine の予約を使用するをご覧ください。
始める前に
作業を始める前に、次のことを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components update
を実行して最新のバージョンを取得する。
Autopilot クラスタで容量予約を使用する
Autopilot クラスタは、同じプロジェクトまたは共有プロジェクト内の Compute Engine 容量予約のリソースの使用をサポートしています。ターゲット予約の消費タイプ プロパティを「特定」に設定し、マニフェストでその予約を明示的に選択する必要があります。予約を明示的に指定しない場合、Autopilot クラスタは予約を使用しません。予約の使用タイプについて詳しくは、予約の仕組みをご覧ください。
これらの予約は、Compute フレキシブル確約利用割引の対象になります。容量予約を使用するには、Accelerator
コンピューティング クラスまたは Performance
コンピューティング クラスを使用する必要があります。
始める前に、次のバージョンを実行する Autopilot クラスタを作成します。
- GPU などの予約済みアクセラレータを使用する場合: 1.28.6-gke.1095000 以降
- 特定のマシンシリーズで Pod を実行し、各 Pod を独自のノードに配置する場合: 1.28.6-gke.1369000 以降またはバージョン 1.29.1-gke.1575000 以降。
Autopilot の容量予約を作成する
Autopilot Pod は、クラスタと同じプロジェクトまたは別のプロジェクトの共有予約で、消費タイプ プロパティが「特定」の予約を使用できます。予約されたハードウェアを使用するには、マニフェストでその予約を明示的に参照します。Autopilot では、次のタイプのハードウェアの予約を使用できます。
- 次のいずれかのタイプの GPU:
nvidia-h100-mega-80gb
: NVIDIA H100 Mega(80 GB)nvidia-h100-80gb
: NVIDIA H100(80 GB)nvidia-a100-80gb
: NVIDIA A100(80 GB)nvidia-tesla-a100
: NVIDIA A100(40 GB)nvidia-l4
: NVIDIA L4nvidia-tesla-t4
: NVIDIA T4
容量の予約を作成するには、次のリソースをご覧ください。予約は次の要件を満たしている必要があります。
- マシンタイプ、アクセラレータ タイプ、アクセラレータの量が、ワークロードで使用される量と一致している。
予約で「特定」消費タイプが使用されている。たとえば、gcloud CLI では、予約を作成するときに
--require-specific-reservation
フラグを指定する必要があります。
Autopilot で同じプロジェクトの特定の予約を使用する
このセクションでは、クラスタと同じプロジェクトにある特定の容量予約を使用する方法について説明します。kubectl または Terraform を使用できます。
kubectl
次のマニフェストを
specific-autopilot.yaml
として保存します。このマニフェストには、特定の予約を使用するノードセレクタがあります。VM インスタンスまたはアクセラレータを使用できます。VM インスタンス
apiVersion: v1 kind: Pod metadata: name: specific-same-project-pod spec: nodeSelector: cloud.google.com/compute-class: Performance cloud.google.com/machine-family: MACHINE_SERIES cloud.google.com/reservation-name: RESERVATION_NAME cloud.google.com/reservation-affinity: "specific" containers: - name: my-container image: "k8s.gcr.io/pause" resources: requests: cpu: 12 memory: "50Gi" ephemeral-storage: "200Gi"
次のように置き換えます。
MACHINE_SERIES
: 特定の容量予約の VM のマシンタイプを含むマシンシリーズ。たとえば、c3-standard-4
マシンタイプの予約の場合は、MACHINE_SERIES
フィールドにC3
を指定します。RESERVATION_NAME
: Compute Engine の容量予約の名前。
アクセラレータ
apiVersion: v1 kind: Pod metadata: name: specific-same-project-pod spec: nodeSelector: cloud.google.com/gke-accelerator: ACCELERATOR cloud.google.com/reservation-name: RESERVATION_NAME cloud.google.com/reservation-affinity: "specific" containers: - name: my-container image: "k8s.gcr.io/pause" resources: requests: cpu: 12 memory: "50Gi" ephemeral-storage: "200Gi" limits: nvidia.com/gpu: QUANTITY
次のように置き換えます。
ACCELERATOR
: Compute Engine の容量予約で予約したアクセラレータ。次のいずれかの値を指定する必要があります。nvidia-h100-mega-80gb
: NVIDIA H100 Mega(80 GB)nvidia-h100-80gb
: NVIDIA H100(80 GB)nvidia-a100-80gb
: NVIDIA A100(80 GB)nvidia-tesla-a100
: NVIDIA A100(40 GB)nvidia-l4
: NVIDIA L4nvidia-tesla-t4
: NVIDIA T4
RESERVATION_NAME
: Compute Engine の容量予約の名前。QUANTITY
: コンテナに接続する GPU の数。サポートされている GPU の数で説明されているように、指定した GPU でサポートされている数量にする必要があります。
Pod をデプロイします。
kubectl apply -f specific-autopilot.yaml
Autopilot は、指定された予約の予約済み容量を使用して、Pod を配置する新しいノードをプロビジョニングします。
Terraform
Terraform を使用して、VM インスタンスで同じプロジェクト内の特定の予約を使用するには、次の例をご覧ください。
Terraform を使用して、Accelerator コンピューティング クラスを持つ同じプロジェクトで特定の予約を使用するには、次の例をご覧ください。
Terraform の使用方法の詳細については、GKE での Terraform のサポートをご覧ください。
Autopilot で特定の共有予約を使用する
このセクションでは、次の用語を使用しています。
- オーナー プロジェクト: 予約を所有し、他のプロジェクトと共有するプロジェクト。
- コンシューマー プロジェクト: 共有予約を使用するワークロードを実行するプロジェクト。
共有予約を使用するには、予約を所有するプロジェクトの予約に対するアクセス権を GKE サービス エージェントに付与する必要があります。手順は次のとおりです。
オーナー プロジェクトに
compute.reservations.list
権限を含むカスタム IAM ロールを作成します。gcloud iam roles create ROLE_NAME \ --project=OWNER_PROJECT_ID \ --permissions='compute.reservations.list'
次のように置き換えます。
ROLE_NAME
: 新しいロールの名前。OWNER_PROJECT_ID
: 容量予約を所有するプロジェクトのプロジェクト ID。
コンシューマー プロジェクトの GKE サービス エージェントに、オーナー プロジェクトの共有予約を一覧取得するアクセス権を付与します。
gcloud projects add-iam-policy-binding OWNER_PROJECT_ID \ --project=OWNER_PROJECT_ID \ --member=serviceAccount:service-CONSUMER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \ --role='projects/OWNER_PROJECT_ID/roles/ROLE_NAME'
CONSUMER_PROJECT_NUMBER
は、コンシューマー プロジェクトのプロジェクト番号に置き換えます。この番号を確認するには、Resource Manager ドキュメントのプロジェクトの識別をご覧ください。次のマニフェストを
shared-autopilot.yaml
として保存します。このマニフェストには、特定の共有予約を使用するように GKE に指示する nodeSelector があります。VM インスタンス
apiVersion: v1 kind: Pod metadata: name: performance-pod spec: nodeSelector: cloud.google.com/compute-class: Performance cloud.google.com/machine-family: MACHINE_SERIES cloud.google.com/reservation-name: RESERVATION_NAME cloud.google.com/reservation-project: OWNER_PROJECT_ID cloud.google.com/reservation-affinity: "specific" containers: - name: my-container image: "k8s.gcr.io/pause" resources: requests: cpu: 12 memory: "50Gi" ephemeral-storage: "200Gi"
次のように置き換えます。
MACHINE_SERIES
: 特定の容量予約の VM のマシンタイプを含むマシンシリーズ。たとえば、c3-standard-4
マシンタイプの予約の場合は、MACHINE_SERIES
フィールドにC3
を指定します。RESERVATION_NAME
: Compute Engine の容量予約の名前。OWNER_PROJECT_ID
: 容量予約を所有するプロジェクトのプロジェクト ID。
アクセラレータ
apiVersion: v1 kind: Pod metadata: name: specific-same-project-pod spec: nodeSelector: cloud.google.com/gke-accelerator: ACCELERATOR cloud.google.com/reservation-name: RESERVATION_NAME cloud.google.com/reservation-project: OWNER_PROJECT_ID cloud.google.com/reservation-affinity: "specific" containers: - name: my-container image: "k8s.gcr.io/pause" resources: requests: cpu: 12 memory: "50Gi" ephemeral-storage: "200Gi" limits: nvidia.com/gpu: QUANTITY
次のように置き換えます。
ACCELERATOR
: Compute Engine の容量予約で予約したアクセラレータ。次のいずれかの値を指定する必要があります。nvidia-h100-mega-80gb
: NVIDIA H100 Mega(80 GB)nvidia-h100-80gb
: NVIDIA H100(80 GB)nvidia-a100-80gb
: NVIDIA A100(80 GB)nvidia-tesla-a100
: NVIDIA A100(40 GB)nvidia-l4
: NVIDIA L4nvidia-tesla-t4
: NVIDIA T4
RESERVATION_NAME
: Compute Engine の容量予約の名前。OWNER_PROJECT_ID
: 容量予約を所有するプロジェクトのプロジェクト ID。QUANTITY
: コンテナに接続する GPU の数。サポートされている GPU の数で説明されているように、指定した GPU でサポートされている数量にする必要があります。
Pod をデプロイします。
kubectl apply -f shared-autopilot.yaml
Autopilot は、指定された予約の予約済み容量を使用して、Pod を配置する新しいノードをプロビジョニングします。
Autopilot での予約の使用に関するトラブルシューティング
- マシンタイプ、アクセラレータ タイプ、ローカル SSD 構成、アクセラレータの量が、ワークロードで使用される量と一致していることを確認してください。一致させる必要があるプロパティの一覧については、Compute Engine の容量予約プロパティをご覧ください。
- 予約が特定のアフィニティで作成されていることを確認します。
- 共有予約を使用する場合は、コンシューマー プロジェクトの GKE サービス エージェントに、オーナー プロジェクトの共有予約を一覧取得する権限があることを確認してください。
GKE Standard で予約済みインスタンスを使用する
クラスタまたはノードプールの作成時に --reservation-affinity
フラグを指定すると、予約使用モードを指定できます。
一致する任意の予約を使用する
gcloud CLI または Terraform を使用して、予約とインスタンスを作成し、任意の予約を使用できます。
gcloud
一致する任意の予約を自動的に使用するには、予約アフィニティ フラグを --reservation-affinity=any
に設定します。any
は Compute Engine で定義されているデフォルト値であるため、この予約アフィニティ フラグは完全に省略できます。
any
予約使用モードの場合、ノードは共有予約を使用する前に、単一プロジェクトの予約から容量を取得します。これは、共有予約のほうが他のプロジェクトから利用される可能性が高いためです。インスタンスが自動的に使用される仕組みの詳細については、使用順序をご覧ください。
3 つの VM インスタンスからなる予約を作成します。
gcloud compute reservations create RESERVATION_NAME \ --machine-type=MACHINE_TYPE --vm-count=3
次のように置き換えます。
RESERVATION_NAME
: 作成する予約の名前。MACHINE_TYPE
: 予約に使用するマシンタイプ(名前のみ)。例:n1-standard-2
。
予約が正常に作成されたことを確認します。
gcloud compute reservations describe RESERVATION_NAME
一致する任意の予約を使用するノードを 1 つ含むクラスタを作成します。
gcloud container clusters create CLUSTER_NAME \ --machine-type=MACHINE_TYPE --num-nodes=1 \ --reservation-affinity=any
CLUSTER_NAME
は、作成するクラスタの名前に置き換えます。一致する任意の予約を使用するノードを 3 つ含むノードプールを作成します。
gcloud container node-pools create NODEPOOL_NAME \ --cluster CLUSTER_NAME --num-nodes=3 \ --machine-type=MACHINE_TYPE --reservation-affinity=any
NODEPOOL_NAME
は、作成するノードプールの名前に置き換えます。
ノードの総数は 4 になりますが、これは予約の容量を超えています。この中で 3 つのノードは予約を使用し、最後のノードは Compute Engine の一般リソースプールから容量を取得します。
Terraform
Terraform を使用して 3 つの VM インスタンスの予約を作成するには、次の例をご覧ください。
Terraform を使用して、一致する任意の予約を使用するノードを 1 つ含むクラスタを作成するには、次の例をご覧ください。
Terraform を使用して、一致する任意の予約を使用する 3 つのノードを含むノードプールを作成するには、次の例をご覧ください。
Terraform の使用方法の詳細については、GKE での Terraform のサポートをご覧ください。
特定の単一プロジェクト予約を使用する
特定の予約を使用するには、予約アフィニティ フラグを --reservation-affinity=specific
に設定し、特定の予約名を指定します。このモードでは、インスタンスは必ずゾーン内の指定された予約から容量を取得します。指定された予約に十分な容量がない場合、リクエストは失敗します。
予約を作成し、特定の予約を使用するインスタンスを作成するには、次の操作を行います。gcloud CLI または Terraform を使用できます。
gcloud
3 つの VM インスタンスに対する特定の予約を作成します。
gcloud compute reservations create RESERVATION_NAME \ --machine-type=MACHINE_TYPE --vm-count=3 \ --require-specific-reservation
次のように置き換えます。
RESERVATION_NAME
: 作成する予約の名前。MACHINE_TYPE
: 予約に使用するマシンタイプ(名前のみ)。例:n1-standard-2
。
特定の単一プロジェクト予約を使用するノードを 1 つ含むノードプールを作成します。
gcloud container node-pools create NODEPOOL_NAME \ --cluster CLUSTER_NAME \ --machine-type=MACHINE_TYPE --num-nodes=1 \ --reservation-affinity=specific --reservation=RESERVATION_NAME
次のように置き換えます。
NODEPOOL_NAME
: 作成するノードプールの名前。CLUSTER_NAME
: 作成したクラスタの名前。
Terraform
Terraform を使用して特定の予約を作成するには、次の例をご覧ください。
Terraform を使用して、特定の単一プロジェクトの予約を使用するノードを 1 つ含むノードプールを作成するには、次の例をご覧ください。
Terraform の使用方法の詳細については、GKE での Terraform のサポートをご覧ください。
特定の共有予約を使用する
特定の共有予約を作成して使用するには、次の操作を行います。gcloud CLI または Terraform を使用できます。
- プロジェクトでの共有予約の作成と変更を許可または制限するの手順に沿って行います。
gcloud
特定の共有予約を作成します。
gcloud compute reservations create RESERVATION_NAME \ --machine-type=MACHINE_TYPE --vm-count=3 \ --zone=ZONE \ --require-specific-reservation \ --project=OWNER_PROJECT_ID \ --share-setting=projects \ --share-with=CONSUMER_PROJECT_IDS
次のように置き換えます。
RESERVATION_NAME
: 作成する予約の名前。MACHINE_TYPE
: 予約に使用するマシンのタイプの名前。例:n1-standard-2
。OWNER_PROJECT_ID
: この共有予約を作成するプロジェクトのプロジェクト ID。--project
フラグを省略すると、GKE はデフォルトで現在のプロジェクトをオーナー プロジェクトとして使用します。CONSUMER_PROJECT_IDS
: この予約を共有するプロジェクトのプロジェクト ID で構成されるカンマ区切りのリスト。例:project-1,project-2
。1~100 個のユーザー プロジェクトを含めることができます。これらのプロジェクトは、オーナー プロジェクトと同じ組織に存在している必要があります。デフォルトでこの予約を使用できるため、OWNER_PROJECT_ID
は含めないでください。
共有予約を使用します。
gcloud container node-pools create NODEPOOL_NAME \ --cluster CLUSTER_NAME \ --machine-type=MACHINE_TYPE --num-nodes=1 \ --reservation-affinity=specific \ --reservation=projects/OWNER_PROJECT_ID/reservations/RESERVATION_NAME
次のように置き換えます。
NODEPOOL_NAME
: 作成するノードプールの名前。CLUSTER_NAME
: 作成したクラスタの名前。
Terraform
Terraform を使用して特定の共有予約を作成するには、次の例をご覧ください。
Terraform を使用して特定の共有予約を使用するには、次の例をご覧ください。
Terraform の使用方法の詳細については、GKE での Terraform のサポートをご覧ください。
特定の予約を使用する場合のその他の考慮事項
特定予約アフィニティを使用してノードプールを作成した場合(クラスタ作成時のデフォルト ノードプールも含まれる)、ノードプールの存続期間全体を通じて、ノードプールのサイズは該当する予約の容量までに制限されます。これは、GKE の以下の機能に影響します。
- 複数のゾーンがあるクラスタ: リージョン クラスタまたはマルチゾーン クラスタでは、ノードプールのノードが複数のゾーンに存在する可能性があります。予約は単一ゾーン対応であるため、複数の予約が必要になります。これらのクラスタで特定の予約を使用するノードプールを作成するには、ノードプールの各ゾーンに、名前とマシン プロパティが完全に同じ予約を作成する必要があります。
- クラスタの自動スケーリングとノードプールのアップグレード: 特定の予約で追加の容量がない場合、ノードプールのアップグレードや自動スケーリングは、どちらのオペレーションも追加のインスタンスの作成が必要になるため、失敗する可能性があります。これを解決するには、予約のサイズを変更するか、バインドされたリソースの一部を解放します。
予約を使用せずにノードを作成する
任意の予約のリソースの使用を明示的に回避するには、アフィニティを --reservation-affinity=none
に設定します。
予約を使用しないクラスタを作成します。
gcloud container clusters create CLUSTER_NAME --reservation-affinity=none
CLUSTER_NAME
は、作成するクラスタの名前に置き換えます。予約を使用しないノードプールを作成します。
gcloud container node-pools create NODEPOOL_NAME \ --cluster CLUSTER_NAME \ --reservation-affinity=none
NODEPOOL_NAME
は、作成するノードプールの名前に置き換えます。
ゾーン間で使用可能な予約
複数のゾーンで動作しているノードプールを、予約がゾーン間で均等でない状態で使用する場合は、--location_policy=ANY
フラグを使用します。これにより、新しいノードがクラスタに追加されると、未使用の予約があるゾーンにノードが作成されるようになります。
TPU の予約
TPU の予約は、他のマシンタイプとは異なります。TPU 予約を作成する際に考慮する必要のある TPU 固有の要素は次のとおりです。
- GKE で TPU を使用する場合、
gcloud container node-pools create
の--reservation-affinity
フラグでサポートされている値はSPECIFIC
のみです。
詳細については、TPU の予約をご覧ください。
クリーンアップ
このページで使用したリソースについて、Cloud 請求先アカウントに課金されないようにする手順は次のとおりです。
各クラスタに対して次のコマンドを実行して、作成したクラスタを削除します。
gcloud container clusters delete CLUSTER_NAME
各予約で次のコマンドを実行して、作成した予約を削除します。
gcloud compute reservations delete RESERVATION_NAME