予約済みゾーンリソースの使用


このページでは、特定の GKE ワークロードで予約済みの Compute Engine ゾーンリソースを使用する方法について説明します。これらの容量予約により、ワークロードで特定のハードウェアを使用できることを高いレベルで保証できます。

コンシューマー タイプ、共有タイプ、プロビジョニング タイプなど、Compute Engine 予約のコンセプトを理解しておいてください。詳細については、Compute Engine ゾーンリソースの予約をご覧ください。

このページは、次のような方を対象としています。

  • できるだけ早く実行する必要があるワークロードをデプロイするアプリケーション オペレーター(通常は GPU などの専用ハードウェアを使用)。
  • ワークロードがアプリケーションと組織の両方の要件を満たす最適化されたハードウェアで実行されることを高いレベルで保証したいプラットフォーム管理者

GKE での予約の使用について

Compute Engine の容量予約を使用すると、 Google Cloud ゾーンに特定のハードウェア構成をすぐに、または指定した将来の時点でプロビジョニングできます。その後、この予約済みの容量を GKE で使用できます。

GKE の運用モードに応じて、次の予約タイプを使用できます。

  • Autopilot モード: 特定の予約のみ。
  • 標準モード: 特定の予約または一致する予約。

予約を使用してリソースを作成できるようにするには、予約アフィニティ(anyspecific など)を指定する必要があります。

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-b200: NVIDIA B200(180 GB)
    • nvidia-h200-141gb: NVIDIA H200(141GB)
    • 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 L4
    • nvidia-tesla-t4: NVIDIA T4

  • 次のいずれかのタイプの TPU:

    • tpu-v6e-slice: TPU v6e スライス
    • tpu-v5p-slice: TPU v5p スライス
    • tpu-v5-lite-podslice: TPU v5 Lite Pod スライス
    • tpu-v5-lite-device: TPU v5 Lite デバイス
    • tpu-v4-lite-device: TPU v4 Lite デバイス
    • tpu-v4-podslice: TPU v4 Pod スライス
    • tpu-v3-device: TPU v3 デバイス
    • tpu-v3-slice: TPU v3 Pod スライス

容量の予約を作成するには、次のリソースをご覧ください。予約は次の要件を満たしている必要があります。

  • マシンタイプ、アクセラレータ タイプ、アクセラレータの量が、ワークロードで使用される量と一致している。
  • 予約で「特定」消費タイプが使用されている。たとえば、gcloud CLI では、予約を作成するときに --require-specific-reservation フラグを指定する必要があります。

  • 単一プロジェクトの予約を作成する

  • 共有予約を作成する

GKE は、選択した特定の予約からローカル SSD をノードに自動的にアタッチします。ワークロード マニフェストで個々のローカル SSD を選択する必要はありません。たとえば、選択した予約に 2 つのローカル SSD が含まれている場合、GKE がその予約から作成するノードには 2 つのローカル SSD がアタッチされます。

Autopilot で同じプロジェクトの特定の予約を使用する

このセクションでは、クラスタと同じプロジェクトにある特定の容量予約を使用する方法について説明します。kubectl または Terraform を使用できます。

kubectl

  1. 次のマニフェストを 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: 2           memory: "4Gi" 

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

    • MACHINE_SERIES: 特定の容量予約の VM のマシンタイプを含むマシンシリーズ。たとえば、c3-standard-4 マシンタイプの予約の場合は、MACHINE_SERIES フィールドに c3 を指定します。
    • RESERVATION_NAME: Compute Engine の容量予約の名前。

    GPU アクセラレータ

      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-b200: NVIDIA B200(180 GB)
      • nvidia-h200-141gb: NVIDIA H200(141GB)
      • 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 L4
      • nvidia-tesla-t4: NVIDIA T4
    • RESERVATION_NAME: Compute Engine の容量予約の名前。
    • QUANTITY: コンテナに接続する GPU の数。サポートされている GPU の数で説明されているように、指定した GPU でサポートされている数量にする必要があります。

    TPU アクセラレータ

      apiVersion: v1   kind: Pod   metadata:     name: specific-same-project-pod   spec:     nodeSelector:       cloud.google.com/gke-tpu-accelerator: ACCELERATOR       cloud.google.com/gke-tpu-topology: TOPOLOGY       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:           google.com/tpu: QUANTITY 

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

    • ACCELERATOR: Compute Engine の容量予約で予約したアクセラレータ。次のいずれかの値を指定する必要があります。
      • tpu-v6e-slice: TPU v6e スライス
      • tpu-v5p-slice: TPU v5p スライス
      • tpu-v5-lite-podslice: TPU v5 Lite Pod スライス
      • tpu-v5-lite-device: TPU v5 Lite デバイス
      • tpu-v4-lite-device: TPU v4 Lite デバイス
      • tpu-v4-podslice: TPU v4 Pod スライス
      • tpu-v3-device: TPU v3 デバイス
      • tpu-v3-slice: TPU v3 Pod スライス
    • TOPOLOGY: TPU トポロジ
    • RESERVATION_NAME: Compute Engine の容量予約の名前。
    • QUANTITY: コンテナに接続する TPU の数。TPU トポロジと一致している必要があります。
  2. Pod をデプロイします。

    kubectl apply -f specific-autopilot.yaml 

Autopilot は、指定された予約の予約済み容量を使用して、Pod を配置する新しいノードをプロビジョニングします。

Terraform

Terraform を使用して、VM インスタンスで同じプロジェクト内の特定の予約を使用するには、次の例をご覧ください。

resource "kubernetes_pod_v1" "default_pod" {   metadata {     name = "specific-same-project-pod"   }    spec {     node_selector = {       "cloud.google.com/compute-class"        = "Performance"       "cloud.google.com/machine-family"       = "c3"       "cloud.google.com/reservation-name"     = google_compute_reservation.specific_pod.name       "cloud.google.com/reservation-affinity" = "specific"     }      container {       name  = "my-container"       image = "registry.k8s.io/pause"        resources {         requests = {           cpu               = 2           memory            = "8Gi"           ephemeral-storage = "1Gi"         }       }        security_context {         allow_privilege_escalation = false         run_as_non_root            = false          capabilities {           add  = []           drop = ["NET_RAW"]         }       }     }      security_context {       run_as_non_root     = false       supplemental_groups = []        seccomp_profile {         type = "RuntimeDefault"       }     }   }    depends_on = [     google_compute_reservation.specific_pod   ] }

Terraform を使用して、Accelerator コンピューティング クラスを持つ同じプロジェクトで特定の予約を使用するには、次の例をご覧ください。

resource "kubernetes_pod_v1" "default_accelerator" {   metadata {     name = "specific-same-project-accelerator"   }    spec {     node_selector = {       "cloud.google.com/compute-class"        = "Accelerator"       "cloud.google.com/gke-accelerator"      = "nvidia-l4"       "cloud.google.com/reservation-name"     = google_compute_reservation.specific_accelerator.name       "cloud.google.com/reservation-affinity" = "specific"     }      container {       name  = "my-container"       image = "registry.k8s.io/pause"        resources {         requests = {           cpu               = 2           memory            = "7Gi"           ephemeral-storage = "1Gi"           "nvidia.com/gpu"  = 1          }         limits = {           "nvidia.com/gpu" = 1         }       }        security_context {         allow_privilege_escalation = false         run_as_non_root            = false          capabilities {           add  = []           drop = ["NET_RAW"]         }       }     }      security_context {       run_as_non_root     = false       supplemental_groups = []        seccomp_profile {         type = "RuntimeDefault"       }     }   }    depends_on = [     google_compute_reservation.specific_accelerator   ] }

Terraform の使用方法の詳細については、GKE での Terraform のサポートをご覧ください。

Autopilot で特定の共有予約を使用する

このセクションでは、次の用語を使用しています。

  • オーナー プロジェクト: 予約を所有し、他のプロジェクトと共有するプロジェクト。
  • コンシューマー プロジェクト: 共有予約を使用するワークロードを実行するプロジェクト。

共有予約を使用するには、予約を所有するプロジェクトの予約に対するアクセス権を GKE サービス エージェントに付与する必要があります。手順は次のとおりです。

  1. オーナー プロジェクトに compute.reservations.list 権限を含むカスタム IAM ロールを作成します。

    gcloud iam roles create ROLE_NAME \     --project=OWNER_PROJECT_ID \     --permissions='compute.reservations.list' 

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

    • ROLE_NAME: 新しいロールの名前。
    • OWNER_PROJECT_ID: 容量予約を所有するプロジェクトのプロジェクト ID。
  2. コンシューマー プロジェクトの 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 ドキュメントのプロジェクトの識別をご覧ください。

  3. 次のマニフェストを 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: 2         memory: "4Gi" 

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

    • MACHINE_SERIES: 特定の容量予約の VM のマシンタイプを含むマシンシリーズ。たとえば、c3-standard-4 マシンタイプの予約の場合は、MACHINE_SERIES フィールドに c3 を指定します。
    • RESERVATION_NAME: Compute Engine の容量予約の名前。
    • OWNER_PROJECT_ID: 容量予約を所有するプロジェクトのプロジェクト ID。

    GPU アクセラレータ

    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-b200: NVIDIA B200(180 GB)
      • nvidia-h200-141gb: NVIDIA H200(141GB)
      • 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 L4
      • nvidia-tesla-t4: NVIDIA T4
    • RESERVATION_NAME: Compute Engine の容量予約の名前。
    • OWNER_PROJECT_ID: 容量予約を所有するプロジェクトのプロジェクト ID。
    • QUANTITY: コンテナに接続する GPU の数。サポートされている GPU の数で説明されているように、指定した GPU でサポートされている数量にする必要があります。

    TPU アクセラレータ

    apiVersion: v1 kind: Pod metadata:   name: specific-shared-project-pod spec:   nodeSelector:     cloud.google.com/gke-tpu-accelerator: ACCELERATOR     cloud.google.com/gke-tpu-topology: TOPOLOGY     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:         google.com/tpu: QUANTITY 

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

    • ACCELERATOR: Compute Engine の容量予約で予約したアクセラレータ。次のいずれかの値を指定する必要があります。
      • tpu-v6e-slice: TPU v6e スライス
      • tpu-v5p-slice: TPU v5p スライス
      • tpu-v5-lite-podslice: TPU v5 Lite Pod スライス
      • tpu-v5-lite-device: TPU v5 Lite デバイス
      • tpu-v4-lite-device: TPU v4 Lite デバイス
      • tpu-v4-podslice: TPU v4 Pod スライス
      • tpu-v3-device: TPU v3 デバイス
      • tpu-v3-slice: TPU v3 Pod スライス
    • TOPOLOGY: TPU トポロジ
    • RESERVATION_NAME: Compute Engine の容量予約の名前。
    • OWNER_PROJECT_ID: 容量予約を所有するプロジェクトのプロジェクト ID。
    • QUANTITY: コンテナに接続する TPU の数。TPU トポロジと一致している必要があります。
  4. Pod をデプロイします。

    kubectl apply -f shared-autopilot.yaml 

Autopilot は、指定された予約の予約済み容量を使用して、Pod を配置する新しいノードをプロビジョニングします。

Autopilot で特定の予約ブロックを使用する

このセクションでは、クラスタと同じプロジェクトまたは共有プロジェクトにある特定の容量予約ブロックを使用する方法について説明します。この機能は、特定のアクセラレータでのみ利用できます。kubectl を使用して、予約ブロックを使用するように Pod を構成できます。

  1. 次のマニフェストを reservation-block-autopilot.yaml として保存します。このマニフェストには、特定の予約を使用するノードセレクタがあります。

    ローカル プロジェクト

    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"     cloud.google.com/reservation-blocks: RESERVATION_BLOCKS_NAME      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-b200: NVIDIA B200(180 GB)
      • nvidia-h200-141gb: NVIDIA H200(141 GB)
    • RESERVATION_NAME: Compute Engine の容量予約の名前。
    • RESERVATION_BLOCKS_NAME: Compute Engine の容量予約ブロックの名前。
    • QUANTITY: コンテナに接続する GPU の数。サポートされている GPU の数で説明されているように、指定した GPU でサポートされている数量にする必要があります。

    別のプロジェクトが所有する予約の場合は、spec.nodeSelector フィールドに cloud.google.com/reservation-project: OWNER_PROJECT_ID を追加します。OWNER_PROJECT_ID は、容量予約を所有するプロジェクトのプロジェクト ID に置き換えます。

  2. Pod をデプロイします。

    kubectl apply -f reservation-block-autopilot.yaml 

    Autopilot は、指定された予約ブロックの予約済み容量を使用して、Pod を配置する新しいノードをプロビジョニングします。

Autopilot で特定の予約サブブロックを使用する

このセクションでは、クラスタと同じプロジェクトまたは共有プロジェクトにある特定の容量予約サブブロックを使用する方法について説明します。

  1. 次の ComputeClass マニフェストを reservation-sub-block-computeclass.yaml として保存します。

    apiVersion: cloud.google.com/v1 kind: ComputeClass metadata:   name: specific-reservation-subblock spec:   nodePoolAutoCreation:     enabled: true   priorities:   - gpu:       type: ACCELERATOR_TYPE       count: ACCELERATOR_COUNT     reservations:       affinity: Specific       specific:       - name: RESERVATION_NAME         project: RESERVATION_PROJECT_ID         reservationBlock:           name: RESERVATION_BLOCK_NAME           reservationSubBlock:             name: RESERVATION_SUB_BLOCK_NAME 

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

    • ACCELERATOR_TYPE: Compute Engine の容量予約で予約したアクセラレータ。値は、nvidia-gb200 にする必要があります。
    • ACCELERATOR_COUNT: 各ノードに接続するアクセラレータの数。この値は、指定されたアクセラレータ タイプでサポートされている数量にする必要があります。詳細については、サポートされている GPU 数をご覧ください。
    • RESERVATION_NAME: Compute Engine の容量予約の名前。
    • RESERVATION_PROJECT_ID: 容量予約を所有するプロジェクトのプロジェクト ID。
    • RESERVATION_BLOCK_NAME: Compute Engine の容量予約ブロックの名前。
    • RESERVATION_SUB_BLOCK_NAME: Compute Engine の容量予約サブブロックの名前。
  2. 次の Pod マニフェストを reservation-sub-block-pod.yaml として保存します。

    apiVersion: v1 kind: Pod metadata:   name: reservation-sub-block-pod spec:   nodeSelector:     cloud.google.com/compute-class: specific-reservation-subblock   containers:   - name: my-container     image: "k8s.gcr.io/pause"     resources:       requests:         cpu: 12         memory: "50Gi"         ephemeral-storage: "200Gi"       limits:         nvidia.com/gpu: CONTAINER_GPU_COUNT 

    CONTAINER_GPU_COUNT は、コンテナに割り当てる GPU の数に置き換えます。この値は、コンピューティング クラスが各ノードに接続するアクセラレータの数以下にする必要があります。

  3. Pod をデプロイします。

    kubectl apply -f reservation-sub-block-pod.yaml 

    Autopilot は、指定された予約サブブロックの予約済み容量を使用して、Pod を実行する新しいノードをプロビジョニングします。

Autopilot での予約の使用に関するトラブルシューティング

  • マシンタイプ、アクセラレータ タイプ、ローカル SSD 構成、アクセラレータの量が、ワークロードで使用される量と一致していることを確認してください。一致させる必要があるプロパティの一覧については、Compute Engine の容量予約プロパティをご覧ください。
  • 予約が特定のアフィニティで作成されていることを確認します。
  • 共有予約を使用する場合は、コンシューマー プロジェクトの GKE サービス エージェントに、オーナー プロジェクトの共有予約を一覧取得する権限があることを確認してください。

GKE Standard で予約済みインスタンスを使用する

クラスタまたはノードプールの作成時に --reservation-affinity フラグを指定すると、予約使用モードを指定できます。

一致する任意の予約を使用する

gcloud CLI または Terraform を使用して、予約とインスタンスを作成し、任意の予約を使用できます。

gcloud

一致する任意の予約を自動的に使用するには、予約アフィニティ フラグを --reservation-affinity=any に設定します。any は Compute Engine で定義されているデフォルト値であるため、この予約アフィニティ フラグは完全に省略できます。

any 予約使用モードの場合、ノードは共有予約を使用する前に、単一プロジェクトの予約から容量を取得します。これは、共有予約のほうが他のプロジェクトから利用される可能性が高いためです。インスタンスが自動的に使用される仕組みの詳細については、使用順序をご覧ください。

  1. 3 つの VM インスタンスからなる予約を作成します。

    gcloud compute reservations create RESERVATION_NAME \     --machine-type=MACHINE_TYPE --vm-count=3 

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

    • RESERVATION_NAME: 作成する予約の名前。
    • MACHINE_TYPE: 予約に使用するマシンタイプ(名前のみ)。例: n1-standard-2
  2. 予約が正常に作成されたことを確認します。

    gcloud compute reservations describe RESERVATION_NAME 
  3. 一致する任意の予約を使用するノードを 1 つ含むクラスタを作成します。

    gcloud container clusters create CLUSTER_NAME \     --machine-type=MACHINE_TYPE --num-nodes=1 \     --reservation-affinity=any 

    CLUSTER_NAME は、作成するクラスタの名前に置き換えます。

  4. 一致する任意の予約を使用するノードを 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 インスタンスの予約を作成するには、次の例をご覧ください。

resource "google_compute_reservation" "any_reservation" {   name = "any-reservation"   zone = "us-central1-a"    specific_reservation {     count = 3      instance_properties {       machine_type = "e2-medium"     }   } }

Terraform を使用して、一致する任意の予約を使用するノードを 1 つ含むクラスタを作成するには、次の例をご覧ください。

resource "google_container_cluster" "default" {   name     = "gke-standard-zonal-cluster"   location = "us-central1-a"    initial_node_count = 1    node_config {     machine_type = "e2-medium"      reservation_affinity {       consume_reservation_type = "ANY_RESERVATION"     }   }    depends_on = [     google_compute_reservation.any_reservation   ] }

Terraform を使用して、一致する任意の予約を使用する 3 つのノードを含むノードプールを作成するには、次の例をご覧ください。

resource "google_container_node_pool" "any_node_pool" {   name     = "gke-standard-zonal-any-node-pool"   cluster  = google_container_cluster.default.name   location = google_container_cluster.default.location    initial_node_count = 3   node_config {     machine_type = "e2-medium"      reservation_affinity {       consume_reservation_type = "ANY_RESERVATION"     }   } }

Terraform の使用方法の詳細については、GKE での Terraform のサポートをご覧ください。

特定の単一プロジェクト予約を使用する

特定の予約を使用するには、予約アフィニティ フラグを --reservation-affinity=specific に設定し、特定の予約名を指定します。このモードでは、インスタンスは必ずゾーン内の指定された予約から容量を取得します。指定された予約に十分な容量がない場合、リクエストは失敗します。

予約を作成し、特定の予約を使用するインスタンスを作成するには、次の操作を行います。gcloud CLI または Terraform を使用できます。

gcloud

  1. 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
  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 を使用して特定の予約を作成するには、次の例をご覧ください。

resource "google_compute_reservation" "specific_reservation" {   name = "specific-reservation"   zone = "us-central1-a"    specific_reservation {     count = 1      instance_properties {       machine_type = "e2-medium"     }   }    specific_reservation_required = true }

Terraform を使用して、特定の単一プロジェクトの予約を使用するノードを 1 つ含むノードプールを作成するには、次の例をご覧ください。

resource "google_container_node_pool" "specific_node_pool" {   name     = "gke-standard-zonal-specific-node-pool"   cluster  = google_container_cluster.default.name   location = google_container_cluster.default.location    initial_node_count = 1   node_config {     machine_type = "e2-medium"      reservation_affinity {       consume_reservation_type = "SPECIFIC_RESERVATION"       key                      = "compute.googleapis.com/reservation-name"       values                   = [google_compute_reservation.specific_reservation.name]     }   }    depends_on = [     google_compute_reservation.specific_reservation   ] }

Terraform の使用方法の詳細については、GKE での Terraform のサポートをご覧ください。

特定の共有予約を使用する

特定の共有予約を作成して使用するには、次の操作を行います。gcloud CLI または Terraform を使用できます。

  1. プロジェクトでの共有予約の作成と変更を許可または制限するの手順に沿って行います。

gcloud

  1. 特定の共有予約を作成します。

    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 は含めないでください。
  2. 共有予約を使用します。

      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 を使用して特定の共有予約を作成するには、次の例をご覧ください。

resource "google_compute_reservation" "specific_reservation" {   name = "specific-reservation"   zone = "us-central1-a"    specific_reservation {     count = 1      instance_properties {       machine_type = "e2-medium"     }   }    specific_reservation_required = true }

Terraform を使用して特定の共有予約を使用するには、次の例をご覧ください。

resource "google_container_node_pool" "specific_node_pool" {   name     = "gke-standard-zonal-specific-node-pool"   cluster  = google_container_cluster.default.name   location = google_container_cluster.default.location    initial_node_count = 1   node_config {     machine_type = "e2-medium"      reservation_affinity {       consume_reservation_type = "SPECIFIC_RESERVATION"       key                      = "compute.googleapis.com/reservation-name"       values                   = [google_compute_reservation.specific_reservation.name]     }   }    depends_on = [     google_compute_reservation.specific_reservation   ] }

Terraform の使用方法の詳細については、GKE での Terraform のサポートをご覧ください。

特定の予約を使用する場合のその他の考慮事項

特定予約アフィニティを使用してノードプールを作成した場合(クラスタ作成時のデフォルト ノードプールも含まれる)、ノードプールの存続期間全体を通じて、ノードプールのサイズは該当する予約の容量までに制限されます。これは、GKE の以下の機能に影響します。

  • 複数のゾーンがあるクラスタ: リージョン クラスタまたはマルチゾーン クラスタでは、ノードプールのノードが複数のゾーンに存在する可能性があります。予約は単一ゾーン対応であるため、複数の予約が必要になります。これらのクラスタで特定の予約を使用するノードプールを作成するには、ノードプールの各ゾーンに、名前とマシン プロパティが完全に同じ予約を作成する必要があります。
  • クラスタの自動スケーリングとノードプールのアップグレード: 特定の予約で追加の容量がない場合、ノードプールのアップグレードや自動スケーリングは、どちらのオペレーションも追加のインスタンスの作成が必要になるため、失敗する可能性があります。これを解決するには、予約のサイズを変更するか、バインドされたリソースの一部を解放します。

GPU 予約の使用

GPU 予約を使用する Standard ノードプール、または容量が単一ゾーンにある予約を使用するノードプールを作成するには、ノードプールを追加するときに --node-locations フラグを指定する必要があります。リージョン Standard クラスタまたはマルチゾーン Standard クラスタを作成するときにノード ロケーションを指定すると、GKE は GPU 容量を予約したゾーンにのみノードを作成します。

GPU を使用するノードプールの作成手順については、GPU ノードプールを作成するをご覧ください。

TPU 予約の使用

TPU 予約を使用する Standard ノードプールを作成するには、ノードプールを追加するときに --node-locations フラグを指定する必要があります。リージョン Standard クラスタまたはマルチゾーン Standard クラスタを作成するときに、ノード ロケーションを指定すると、TPU 容量を予約したゾーンにのみノードが作成されます。

TPU の予約は、他のマシンタイプとは異なります。TPU 予約を作成する際に考慮する必要のある TPU 固有の要素は次のとおりです。

  • GKE で TPU を使用する場合、--reservation-affinity フラグでサポートされている値は SPECIFIC のみです。

TPU を使用するノードプールの作成手順については、TPU ノードプールを作成するをご覧ください。

予約を使用せずにノードを作成する

任意の予約のリソースの使用を明示的に回避するには、アフィニティを --reservation-affinity=none に設定します。

  1. 予約を使用しないクラスタを作成します。

    gcloud container clusters create CLUSTER_NAME --reservation-affinity=none 

    CLUSTER_NAME は、作成するクラスタの名前に置き換えます。

  2. 予約を使用しないノードプールを作成します。

    gcloud container node-pools create NODEPOOL_NAME \     --cluster CLUSTER_NAME \     --reservation-affinity=none 

    NODEPOOL_NAME は、作成するノードプールの名前に置き換えます。

ゾーン間で使用可能な予約

複数のゾーンで動作しているノードプールを、予約がゾーン間で均等でない状態で使用する場合は、--location_policy=ANY フラグを使用します。これにより、新しいノードがクラスタに追加されると、未使用の予約があるゾーンにノードが作成されるようになります。

クリーンアップ

このページで使用したリソースについて、Cloud 請求先アカウントに課金されないようにする手順は次のとおりです。

  1. 各クラスタに対して次のコマンドを実行して、作成したクラスタを削除します。

    gcloud container clusters delete CLUSTER_NAME 
  2. 各予約で次のコマンドを実行して、作成した予約を削除します。

    gcloud compute reservations delete RESERVATION_NAME 

次のステップ