クラスタにサブネットを追加する

このページでは、VPC ネイティブ クラスタに追加のサブネットを割り当てる方法について説明します。クラスタに割り当てられた追加のサブネットを使用すると、ノードと Pod の両方の IPv4 アドレスが追加のサブネット範囲から取得される新しいノードプールを作成できます。

このページは、組織のネットワークを設計するネットワーク スペシャリストを対象としています。 Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE ユーザー ロールとタスクをご覧ください。

概要

新しい VPC ネイティブ GKE クラスタを作成するときに、クラスタのデフォルト サブネットを選択します。クラスタのデフォルト サブネットは、VPC ネイティブ クラスタの IP アドレス範囲で説明されているように、ノード、Pod、Service に IPv4 アドレスを提供します。

VPC ネイティブ クラスタには最大 8 つの追加サブネットを割り当てることができ、クラスタを大幅に拡張できます。新しく割り当てられた追加のサブネットは、デフォルト以外のサブネットと呼ばれます。

始める前に

作業を始める前に、次のタスクが完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。gcloud CLI をインストール済みの場合は、gcloud components update コマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。

要件と制限事項

このセクションでは、クラスタに追加のサブネットを割り当てて使用する場合に適用される要件と制限事項について説明します。追加のサブネットを割り当てる前に、すべての要件を満たす必要があります。

  • GKE クラスタが、GKE バージョン 1.30.3-gke.1211000 以降を実行する VPC ネイティブ クラスタであることを確認します。ルートベース クラスタとレガシー ネットワーク上のクラスタは、追加のサブネットをサポートしていません。
  • クラスタごとに最大 8 つの追加サブネットを割り当てることができます。
  • 追加のサブネットは、ノードと Pod の IPv4 アドレスのみを提供します。追加のサブネットを使用して、ノードまたは Pod の IPv6 アドレスを提供することはできません。
  • 追加のサブネットを使用できるのは新しいノードプールのみで、既存のノードプールは使用できません。新しいノードプールを作成したときに、使用可能なデフォルト以外のサブネットが複数ある場合、GKE は IP アドレスの要件とすべてのクラスタ サブネットでの IP アドレスの可用性に基づいて、ノードプールに最適なサブネットを選択します。
  • 新しいノードプールで使用するデフォルト以外のサブネットを制御することはできません。たとえば、クラスタにデフォルト サブネット(クラスタの作成時に使用されたサブネット)と 2 つのデフォルト以外のサブネットがある場合、デフォルト以外のサブネットのどちらを新しいノードプールで使用するかを指定することはできません。
  • デフォルト以外のサブネットのサブネット セカンダリ IPv4 アドレス範囲は、単一のクラスタでのみ使用できます。
  • 追加のサブネットは、マルチクラスタ Gateway では使用できません。
  • Pod のマルチネットワーク サポートを使用する場合、追加サブネットのプライマリ IPv4 アドレス範囲と Pod 用 IPv4 アドレス範囲は、マルチネットワーク設定内で構成されているいずれの CIDR 範囲とも重複してはいけません。構成する追加のサブネットは、デフォルトのネットワークにのみ適用されます。この制限により、ノードと Pod の追加のネットワーク インターフェースは、これらの追加のサブネットによって提供される IP アドレスを使用できません。
  • デフォルト サブネットの IP アドレスのプールが枯渇すると、追加のサブネットを使用しても、クラスタを自動スケーリングできません。

追加のサブネットがあるクラスタのロードバランサの要件

このセクションでは、クラスタで追加のサブネットを使用する場合に適用されるロードバランサの要件について説明します。これらの要件は、外部 Ingress、外部 Gateway、外部 LoadBalancer Service を作成するたびに適用されます。

  • 追加のサブネットを含むクラスタで外部 Ingress、Gateway、または LoadBalancer Service を使用するには、クラスタで GKE バージョン 1.33.2-gke.4780000 以降を実行する必要があります。
  • GKE Ingress コントローラを使用する外部 Ingress オブジェクトは、コンテナ ネイティブのロード バランシングを使用する必要があります。
  • 内部 LoadBalancer Service の GKE サブセット化を有効にします。GKE のサブセット化は、新しい内部 LoadBalancer Service にのみ影響します。そのため、GKE サブセット設定を有効にした後、クラスタ内の既存の Service を削除して再作成する必要があります。
  • バックエンド サービスベースの外部パススルー ネットワーク ロードバランサを作成するには、新しい外部 LoadBalancer Service に cloud.google.com/l4-rbs: "enabled" アノテーションを含める必要があります。このアノテーションは、新しい外部 LoadBalancer Service にのみ影響し、既存の外部 LoadBalancer Service には適用されません。cloud.google.com/l4-rbs: "enabled" アノテーションなしで作成されたすべての外部 LoadBalancer Service を削除して再作成します。

    使用されるバックエンド タイプ(GCE_VM_IP NEG バックエンドまたはインスタンス グループ バックエンド)は、外部 LoadBalancer Service の作成時の GKE バージョンによって異なります。詳細については、ノードのグループ化をご覧ください。

1 つの Pod IPv4 アドレス範囲を持つ新しいサブネットを追加する

  1. 新しいサブネットを作成し、新しいサブネットのセカンダリ IPv4 アドレス範囲を追加します。サブネットは、クラスタと同じリージョンと VPC ネットワークに存在する必要があります。

       gcloud compute networks subnets create SUBNET_NAME \
         --network=NETWORK \
         --region=REGION \
         --range=PRIMARY_RANGE \
         --secondary-range=POD_RANGE_NAME=SECONDARY_RANGE \
         --enable-private-ip-google-access
    

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

    • SUBNET_NAME: 新しいサブネットの名前。
    • NETWORK: 新しいサブネットを含む VPC ネットワークの名前。
    • REGION: サブネットが配置されているリージョン。
    • PRIMARY_RANGE: 新しいサブネットのプライマリ IPv4 範囲(CIDR 表記)。詳細については、IPv4 サブネットの範囲をご覧ください。
    • POD_RANGE_NAME: セカンダリ範囲の名前。
    • SECONDARY_RANGE: CIDR 表記のセカンダリ IPv4 範囲。有効な範囲については、IPv4 サブネットの範囲をご覧ください。

    詳細については、サブネットを操作するをご覧ください。

  2. gcloud CLI を使用して、追加のサブネットを使用するようにクラスタを更新します。

       gcloud container clusters update CLUSTER_NAME \
         --additional-ip-ranges=subnetwork=SUBNET_NAME,pod-ipv4-range=POD_RANGE_NAME
    

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

    • CLUSTER_NAME: 既存のクラスタの名前。
    • SUBNET_NAME: 作成した新しいサブネットの名前。
    • POD_RANGE_NAME: Pod の IPv4 アドレス範囲に使用するサブネットのセカンダリ IPv4 アドレス範囲の名前。

複数の Pod IPv4 アドレス範囲を持つ新しいサブネットを追加する

  1. クラスタと同じリージョンと VPC ネットワークに新しいサブネットを作成します。サブネットのプライマリ IPv4 アドレス範囲をノードの追加 IPv4 アドレス範囲に設定します。

  2. 必要な Pod の追加 IPv4 アドレス範囲ごとに、前の手順で作成したサブネットに新しいサブネットのセカンダリ IPv4 アドレス範囲を追加します。

  3. gcloud CLI を使用して、追加のサブネットを使用するようにクラスタを更新します。次の例では、Pod 用の 2 つのサブネット セカンダリ IPv4 アドレス範囲を持つサブネットを 1 つ追加します。

       gcloud container clusters update CLUSTER_NAME \
         --additional-ip-ranges=subnetwork=SUBNET_NAME,pod-ipv4-range=POD_RANGE_NAME_1 \
         --additional-ip-ranges=subnetwork=SUBNET_NAME,pod-ipv4-range=POD_RANGE_NAME_2
    

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

    • CLUSTER_NAME: 既存のクラスタの名前。
    • SUBNET_NAME: 作成した新しいサブネットの名前。
    • POD_RANGE_NAME_1POD_RANGE_NAME_2: Pod の IPv4 アドレス範囲に使用するサブネットのセカンダリ IPv4 アドレス範囲の名前。

サブネットを確認する

クラスタ別: クラスタに関連付けられているすべてのサブネットの詳細を表示するには、次のコマンドを実行します。

   gcloud container clusters describe CLUSTER_NAME

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

出力は次のようになります。

ipAllocationPolicy:
  additionalIPRangesConfig:
  - podIpv4RangeNames:
    - pod-range-1
    subnetwork: projects/user-gke-dev-2/regions/us-central1/subnetworks/shared-msc-subnets

ノードプール別: ノードプールに関連付けられているすべてのサブネットの詳細を表示するには、次のコマンドを実行します。

gcloud container node-pools describe POOL_NAME \
    --cluster=CLUSTER_NAME \

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

  • POOL_NAME: ノードプールの名前。
  • CLUSTER_NAME: クラスタの名前。

出力は次のようになります。

name: pool-1
networkConfig:
  podRange: pod-range-1
  subnetwork: projects/user-gke-dev-2/regions/us-central1/subnetworks/shared-msc-subnets

デフォルト以外のサブネットを削除する

クラスタからデフォルト以外のサブネットを削除すると、クラスタはクラスタのノードプールでサブネットの範囲を使用しなくなります。削除すると、次のような影響があります。

  • デフォルト以外のサブネットのプライマリ IPv4 アドレス範囲は、ノードの IPv4 アドレス範囲には使用できません。
  • デフォルト以外のサブネットのサブネット セカンダリ IPv4 範囲は、Pod IPv4 範囲に使用できません。

デフォルト以外のサブネットを削除する前に、そのサブネットを使用しているすべてのノードプールを削除する必要があります。最初のステップとして、そのサブネットをドレイン ステータスに設定することをおすすめします。ドレイン ステータスのサブネットは、新しく作成されたノードプールで使用されないため、削除するサブネットがクラスタ オートスケーラーのオペレーション(ノードプールのスケールアップなど)で選択されなくなります。クラスタ全体の自動スケーリングを無効にする必要はありません。

サブネットを削除する手順は次のとおりです。

  1. デフォルト以外のサブネットをドレイン ステータスに設定します。これにより、新しいノードプールでそのサブネットを選択できなくなります。クラスタで自動スケーリングを有効にする場合に便利です。
  2. そのサブネットを使用しているすべてのノードプールを削除します。
  3. クラスタからサブネットを削除します。

クラスタからデフォルト以外のサブネットを削除するには、次のコマンドを実行します。

   gcloud container clusters update CLUSTER_NAME \
     --remove-additional-ip-ranges=subnetwork=SUBNET_NAME

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

  • CLUSTER_NAME: クラスタの名前。
  • SUBNET_NAME: クラスタから削除するサブネットの名前。

デフォルト以外のサブネットのステータスをドレインに設定するには、次のコマンドを実行します。

   gcloud container clusters update CLUSTER_NAME \
     --drain-additional-ip-ranges=subnetwork=SUBNET_NAME

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

  • CLUSTER_NAME: クラスタの名前。
  • SUBNET_NAME: ドレイン ステータスに設定するサブネットの名前。

デフォルト以外のサブネットのドレインを解除するには、次のコマンドを実行します。

   gcloud container clusters update CLUSTER_NAME \
     --undrain-additional-ip-ranges=subnetwork=SUBNET_NAME

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

  • CLUSTER_NAME: クラスタの名前。
  • SUBNET_NAME: ドレインを解除するサブネットの名前。

クラスタからデフォルト以外のサブネットを削除したら、デフォルト以外のサブネットを削除できます。

デフォルト以外のサブネットのセカンダリ IPv4 範囲を削除する

クラスタからデフォルト以外のサブネット セカンダリ IPv4 範囲を削除すると、GKE は、どのノードプールの Pod IPv4 範囲にもその範囲を使用しないようにクラスタに指示します。削除するデフォルト以外のサブネットのセカンダリ IPv4 範囲が、このクラスタで使用されているデフォルト以外のサブネットの唯一の範囲である場合、GKE は、ノードの IPv4 アドレスにこのサブネットのプライマリ IPv4 アドレスの使用を停止するようにクラスタに指示します。

デフォルト以外のサブネットのセカンダリ IPv4 範囲を削除する前に、Pod の IPv4 アドレスにその範囲を使用するすべてのノードプールを削除する必要があります。

デフォルト以外のサブネットのセカンダリ IPv4 範囲をクラスタから削除するには、次のコマンドを実行します。

   gcloud container clusters update CLUSTER_NAME \
     --remove-additional-ip-ranges=\
       subnetwork=SUBNET_NAME,pod-ipv4-range=POD_RANGE_NAME

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

  • CLUSTER_NAME: クラスタの名前。
  • SUBNET_NAME: デフォルト以外のサブネットの名前。
  • POD_RANGE_NAME: クラスタから削除するデフォルト以外のサブネットのセカンダリ IPv4 範囲の名前。

クラスタからデフォルト以外のサブネットのセカンダリ IPv4 範囲を削除したら、デフォルト以外のサブネットのセカンダリ IPv4 範囲を削除できます。

共有 VPC で追加のサブネットを使用する

先に進む前に、以下のものが揃っていることをご確認ください。

  • ホスト プロジェクトとサービス プロジェクトが接続されている、使用可能な共有 VPC 環境。手順については、共有 VPC を使用するクラスタを設定するをご覧ください。
  • サービス プロジェクトにある実行中の GKE クラスタ。
  • ホスト プロジェクトとサービス プロジェクトの両方で、必要なすべての API が有効になっている。
  1. GKE クラスタと同じネットワークのホスト プロジェクトに追加のサブネットを作成します。

    gcloud compute networks subnets create ADDITIONAL_SUBNET_NAME \
      --project HOST_PROJECT_ID \
      --network shared-net \
      --range 172.16.4.0/22 \
      --region COMPUTE_REGION \
      --secondary-range ADDITIONAL_SUBNET_NAME-services=172.16.16.0/20,ADDITIONAL_SUBNET_NAME-pods=172.20.0.0/14
    
  2. IAM ポリシーを取得します。サービス プロジェクトの GKE クラスタがホスト プロジェクトの共有 VPC 内の追加のサブネットにアクセスできるようにするには、必要な IAM 権限を構成する必要があります。権限がまだ構成されていない場合は、次の手順に進みます。権限がすでに存在する場合は、対応は不要です。

    gcloud compute networks subnets get-iam-policy ADDITIONAL_SUBNET_NAME \
        --project HOST_PROJECT_ID \
        --region COMPUTE_REGION
    

    出力には etag フィールドが含まれます。etag の値をメモします。

  3. 次の内容の ADDITIONAL_SUBNET_NAME-policy.yaml というファイルを作成します。

      bindings:
      - members:
        - serviceAccount:SERVICE_PROJECT_NUM@cloudservices.gserviceaccount.com
        - serviceAccount:service-SERVICE_PROJECT_NUM@container-engine-robot.iam.gserviceaccount.com
        role: roles/compute.networkUser
      etag: ETAG_STRING
    

    ETAG_STRING は、先ほどメモした etag の値に置き換えます。

  4. ADDITIONAL_SUBNET_NAME サブネットの IAM ポリシーを設定します。

      gcloud compute networks subnets set-iam-policy ADDITIONAL_SUBNET_NAME \
          ADDITIONAL_SUBNET_NAME-policy.yaml \
          --project HOST_PROJECT_ID \
          --region COMPUTE_REGION
    
  5. 共有 VPC の使用可能なサブネットを確認するで説明されているように、使用可能なサブネットとセカンダリ IP アドレス範囲を確認します。

  6. 追加のサブネットの共有 VPC クラスタを更新します。

    gcloud container clusters update CLUSTER_NAME \
        --project=SERVICE_PROJECT_ID \
        --location=CONTROL_PLANE_LOCATION \
        --additional-ip-ranges=subnetwork=projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/ADDITIONAL_SUBNET_NAME,pod-ipv4-range=ADDITIONAL_SUBNET_NAME-pods

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

  • CLUSTER_NAME: サービス プロジェクトの GKE クラスタの名前。
  • ADDITIONAL_SUBNET_NAME: ホスト プロジェクトで作成した追加のサブネットの名前(例: tier-2)。
  • HOST_PROJECT_ID: ホスト プロジェクト ID。
  • SERVICE_PROJECT_NUM: サービス プロジェクト名。
  • COMPUTE_REGION: サブネットが配置されているリージョン。

これにより、共有 VPC 環境で追加のサブネットを使用できます。

次のステップ