特定のゾーンで Compute Engine インスタンスを予約できます。これにより、ワークロード用のリソースが必要になる場合に備えて、リソースを確保しておくことができます。予約を管理する方法の詳細については、Compute Engine ゾーンリソースの予約をご覧ください。
予約を作成したら、予約したリソースを GKE で使用できます。GKE は、Compute Engine と同じく次の使用モードをサポートしています。
- 任意の予約のリソースを使用する: Standard のみ
- 特定の予約のリソースを使用する: Standard と Autopilot
- 予約を使用せずにノードを作成する: Standard と Autopilot
始める前に
始める前に、次の作業が完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components update
を実行して最新のバージョンを取得する。
Autopilot クラスタで容量予約を使用する
Autopilot クラスタは、同じプロジェクトまたは共有プロジェクト内の特定の Compute Engine 容量予約のリソースの使用をサポートしています。明示的に指定しない限り、Autopilot クラスタは予約を使用しません。これらの予約は、Autopilot の確約利用割引の対象になります。容量予約を使用するには、Accelerator
コンピューティング クラスまたは Performance
コンピューティング クラスを使用する必要があります。
始める前に、次のバージョンを実行する Autopilot クラスタを作成します。
- Accelerator コンピューティング クラスを使用して予約済みのアクセラレータを使用する場合: 1.28.6-gke.1095000 以降
- Performance コンピューティング クラスを使用する場合: 1.28.6-gke.1369000 以降またはバージョン 1.29.1-gke.1575000 以降。
Autopilot の容量予約を作成する
Autopilot Pod は、クラスタと同じプロジェクトまたは別のプロジェクトの共有予約で特定の予約を使用できます。予約されたハードウェアを使用するには、マニフェストでその予約を明示的に参照します。Autopilot では、次のタイプのハードウェアの予約を使用できます。
- 次のいずれかのタイプの GPU:
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
容量の予約を作成するには、次のリソースをご覧ください。マシンタイプ、アクセラレータ タイプ、アクセラレータの量が、ワークロードで使用される量と一致していることを確認してください。
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: "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/compute-class: "Accelerator" 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: "200Gi" limits: nvidia.com/gpu: QUANTITY
次のように置き換えます。
ACCELERATOR
: Compute Engine の容量予約で予約したアクセラレータ。次のいずれかの値を指定する必要があります。nvidia-h100-80gb
: NVIDIA H100(80 GB)(Accelerator コンピューティング クラスでのみ使用可能)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 compute reservations add-iam-policy-binding RESERVATION_NAME \ --project=OWNER_PROJECT_ID \ --zone=ZONE \ --member=service-CONSUMER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \ --role='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: "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/compute-class: "Accelerator" 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: "200Gi" limits: nvidia.com/gpu: QUANTITY
次のように置き換えます。
ACCELERATOR
: Compute Engine の容量予約で予約したアクセラレータ。次のいずれかの値を指定する必要があります。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 を配置する新しいノードをプロビジョニングします。
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 の予約はプロジェクト間で共有できません。
詳細については、TPU の予約をご覧ください。
クリーンアップ
このページで使用したリソースについて、Cloud 請求先アカウントに課金されないようにする手順は次のとおりです。
各クラスタに対して次のコマンドを実行して、作成したクラスタを削除します。
gcloud container clusters delete CLUSTER_NAME
各予約で次のコマンドを実行して、作成した予約を削除します。
gcloud compute reservations delete RESERVATION_NAME