Pod IP アドレス範囲の追加


このページでは、連続していないマルチ Pod CIDR を使用して、GKE クラスタに新規または既存のセカンダリ Pod IP アドレス範囲を追加する方法について説明します。

Pod の IPv4 範囲を追加する理由

プラットフォーム管理者は、追加のセカンダリ範囲を作成して、Pod の IPv4 範囲を追加できます。これは、次のような場合に役立ちます。

  • クラスタで Pod の IP アドレスが不足している場合。
  • 将来に備えて IP アドレスを効率的に割り振りたい場合。
  • 断片化された IP アドレス空間をクラスタで使用できる場合。
  • ビジネスニーズの変化に応じて IP アドレスを割り振りなおす場合。

始める前に

作業を始める前に、次のことを確認してください。

  • Google Kubernetes Engine API を有効にします。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化します。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得します。

GKE Autopilot で Pod の IPv4 範囲を追加する

バージョン 1.26 以降の GKE Autopilot クラスタの場合、追加のセカンダリ範囲を作成してクラスタに割り当てることで、Pod の IPv4 範囲を追加できます。

サブネットに追加のセカンダリ範囲を作成する

コンソール

  1. Google Cloud コンソールで [VPC ネットワーク] ページに移動します。

    [VPC ネットワーク] に移動

  2. [VPC ネットワーク] リストで、拡張するネットワークを選択します。

  3. [サブネット] リストで、必要なサブネットを選択します。

  4. [編集] をクリックします。

  5. [IP の範囲を追加] をクリックします。

  6. [サブネット範囲の名前] に、追加の Pod 範囲名を入力します。例: pod-range-2

  7. [セカンダリ IP 範囲] に、IP 範囲を入力します。例: 10.2.204.0/22

  8. [保存] をクリックします。

gcloud

gcloud compute networks subnets update SUBNET_NAME \
    --add-secondary-ranges ADDITIONAL_RANGE=RANGE \
    --location=COMPUTE_LOCATION

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

  • SUBNET_NAME: 範囲を追加するサブネットの名前(クラスタに割り当てられているサブネットである必要があります)。
  • ADDITIONAL_RANGE: クラスタに追加する Pod の範囲の名前。たとえば、pod-range-2 のようにします。複数の範囲を指定するには、範囲名をカンマで区切ります。たとえば、pod-range-1, pod-range-2 のようにします。
  • RANGE: クラスタに追加する IP アドレス範囲。
  • COMPUTE_LOCATION: サブネットの Compute Engine のロケーション

追加のセカンダリ範囲をクラスタに割り当てる

追加のセカンダリ範囲を作成し、クラスタに割り当てます。Google Cloud コンソールまたは Google Cloud CLI を使用できます。

コンソール

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. 編集するクラスタの横にある [アクション] をクリックし、[ 編集] をクリックします。

  3. [ネットワーキング] セクションで、[クラスタ Pod の IPv4 範囲(追加)] の横にある [編集] をクリックします。

  4. [追加のクラスタ Pod の IPv4 範囲の編集] ダイアログで、クラスタに追加する Pod セカンダリ CIDR 範囲を選択します。クラスタへの追加のセカンダリ範囲として、サブネットで作成した Pod 範囲と同じ名前を使用します。

  5. [変更内容を保存] をクリックします。

gcloud

  1. 追加の IP アドレス範囲を使用するようにクラスタを更新します。

    gcloud container clusters update CLUSTER_NAME \
        --additional-pod-ipv4-ranges=ADDITIONAL_RANGE \
        --location=COMPUTE_LOCATION
    

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

    • CLUSTER_NAME: クラスタの名前。クラスタはバージョン 1.26.0 以降を実行している必要があります。
    • ADDITIONAL_RANGE: クラスタに追加する Pod の範囲の名前。クラスタへの追加のセカンダリ範囲として、サブネットで作成した Pod 範囲と同じ名前を使用します。
    • COMPUTE_LOCATION: サブネットの Compute Engine のロケーション
  2. 新しい IP アドレスがクラスタに割り当てられていることを確認します。

    gcloud container clusters describe CLUSTER_NAME
    

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

    ipAllocationPolicy:
    additionalPodRangesConfig:
      podRangeNames:
      - pod-range-1
      - pod-range-2
    clusterIpv4Cidr: 10.10.0.0/23
    clusterIpv4CidrBlock: 10.10.0.0/23
    clusterSecondaryRangeName: cluster-pods
    

GKE Standard で Pod の IPv4 範囲を追加する

GKE Standard クラスタの場合、次のいずれかの方法で Pod IPv4 範囲を追加できます。

  • 追加のセカンダリ範囲を作成してクラスタに割り当てます。これは、ノードプール レベルで Pod IP アドレス範囲を制御する必要がない場合におすすめします。この方法は、GKE バージョン 1.26.0 以降で使用できます。詳細については、GKE Autopilot で Pod の IPv4 範囲を追加するをご覧ください。
  • 新しいセカンダリ Pod IP アドレス範囲でノードプールを作成します。これは、ノードプールの Pod IP アドレス範囲を完全に制御する必要がある場合におすすめします。この方法は、GKE バージョン 1.20.4-gke.500 以降で使用できます。
  • 既存のセカンダリ Pod IP アドレスを使用してノードプールを作成します。これは、ノードプールの既存の Pod IP アドレス範囲を完全に制御する必要が場合におすすめします。この方法は、GKE バージョン 1.20.4-gke.500 以降で使用できます。

新しいセカンダリ Pod IP 範囲を使用してノードプールを作成する

デフォルトでは、GKE は 1 つの Pod 範囲をノードプールに関連付けます。これは、クラスタのデフォルトの Pod IP アドレス範囲またはクラスタに関連付けられた追加の Pod 範囲(存在する場合)のいずれかです。追加のセカンダリ範囲を使用すると、ノードプールの作成時に Pod の IPv4 アドレス範囲を指定できます。ノードプールは、クラスタのデフォルトのセカンダリ Pod IP アドレス範囲ではなく、指定された範囲を使用します。

このセクションでは、セカンダリ Pod IP アドレス範囲のノードプールを作成します。

Google Cloud CLI または GKE API を使用できます。

gcloud

gcloud container node-pools create POOL_NAME \
    --cluster CLUSTER_NAME \
    --create-pod-ipv4-range name=RANGE_NAME,range=RANGE

以下を置き換えます。

  • POOL_NAME: 新しいノードプールの名前。
  • CLUSTER_NAME: クラスタの名前。
  • RANGE_NAME: 新しいセカンダリ Pod IP アドレス範囲の名前(省略可)。
  • RANGE: ネットマスク(/20)または CIDR 範囲(10.12.4.0/20)として指定された任意の Pod IP アドレス範囲。ネットマスクを指定する場合、GKE によりクラスタ ネットワークで使用可能な範囲から範囲を割り振られます。range の値を指定しない場合、GKE によりサブネットの Pod のセカンダリ IP 範囲のデフォルト サイズである /14 ネットマスクが自動的に割り振られます。

API

"nodePool": {
  "name": "POOL_NAME",
  ...
  "networkConfig": {
    "createPodRange": true,
    "podRange": "RANGE_NAME",
    "podIpv4CidrBlock": "RANGE"
  }
}

以下を置き換えます。

  • POOL_NAME: 新しいノードプールの名前。
  • RANGE_NAME: 新しいセカンダリ Pod IP アドレス範囲の名前(省略可)。
  • RANGE: ネットマスク(/20)または CIDR 範囲(10.12.0.0/20)として指定されたオプションの Pod IP アドレス範囲。ネットマスクが指定されている場合、IP 範囲はクラスタのネットワークの空き容量から自動的に割り振られます。値を指定しない場合、GKE は、サブネットの Pod 用セカンダリ IP 範囲のデフォルト サイズのネットマスク(/14)を自動的に割り振ります。

既存のセカンダリ Pod IP 範囲を使用してノードプールを作成する

このセクションでは、既存のセカンダリ Pod IP アドレス範囲を持つノードプールを作成します。

gcloud CLI または GKE API を使用できます。

gcloud

gcloud container node-pools create POOL_NAME \
    --cluster CLUSTER_NAME \
    --pod-ipv4-range RANGE_NAME

以下を置き換えます。

  • POOL_NAME: 新しいノードプールの名前。
  • CLUSTER_NAME: クラスタの名前。
  • RANGE_NAME: クラスタのサブネットワークにある既存のセカンダリ Pod IP アドレス範囲の名前。

API

"nodePool": {
  "name": "POOL_NAME",
  ...
  "networkConfig": {
    "podRange": "RANGE_NAME"
  }
}

以下を置き換えます。

  • POOL_NAME: 新しいノードプールの名前。
  • RANGE_NAME: クラスタのサブネットワークにある既存のセカンダリ Pod IP アドレス範囲の名前。

ノードプールの Pod CIDR ブロックを確認する

特定のノードプール内の Pod に使用されている Pod CIDR ブロックを確認するには、次のコマンドを使用します。

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

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

...
networkConfig:
  podIpv4CidrBlock: 192.168.0.0/18
  podRange: podrange
...

ノードプールが不連続マルチ Pod CIDR を使用している場合、podRangepodIpv4CidrBlock には、このノードプールに構成済みの値が表示されます。

ノードプールが不連続マルチ Pod CIDR を使用していない場合、podRangepodIpv4CidrBlock には、IPAllocationPolicy からクラスタのデフォルト値(clusterSecondaryRangeNameclusterIpv4CidrBlock)が表示されます。

特定のユースケースに Pod IPv4 範囲を追加する

  • nonMasqueradeCIDRs パラメータで構成された ip-masq-agent を使用する場合は、nonMasqueradeCIDRs を更新して、追加のセカンダリ範囲をすべて含める必要があります。
  • ipBlock で構成された NetworkPolicy を使用してトラフィックを指定する場合は、CIDR 値を更新して、すべての Pod CIDR 範囲を含める必要があります。
  • 共有 VPC の場合は、別のサービス アカウントを事前に設定する必要があります。
  • セカンダリ Pod IP アドレス範囲をクラスタに追加するか、新しいセカンダリ Pod IP アドレス範囲を持つノードプールを作成するには、ネットワーク管理者のロールが必要です。ユーザーロールは、リソースがネットワーク管理者によって作成された場合にのみ、そのリソースを使用できます。
  • プロジェクトに複数のクラスタがある場合は、各クラスタにセカンダリ Pod IP アドレス範囲を作成して追加します。

不連続のマルチ Pod CIDR の仕組み

デフォルトでは、新しく作成したノードプールはクラスタのデフォルト Pod IP アドレス範囲(クラスタの CIDR とも呼ばれます)を使用します。この機能を使用すると、ノードプールの作成時に Pod IP アドレス範囲を指定できます。ノードプールでは、クラスタのデフォルト Pod IP アドレス範囲ではなく、指定した範囲が使用されるようになります。

次の図は、セカンダリ Pod IP アドレス範囲として /24 CIDR ブロックを使用したユーザー管理のクラスタ(256 個の IP アドレス)と、Pod IP アドレスに /25 CIDR ブロックを使用する 2 つのノードを示しています(各ノードで 128 個の IP アドレス)。セカンダリ Pod IP アドレス範囲はすべて使用されているため、クラスタに別のノードを追加することはできません。クラスタを削除して再作成する代わりに、不連続のマルチ Pod CIDR を使用して、/20 CIDR ブロックで Pod IP アドレスを拡張できます。/20 ブロックの Pod IP アドレスに /25 CIDR ブロックを使用する 3 番目のノードを追加するように、クラスタが展開されます。

連続していない複数の Pod CIDR を使用して、セカンダリ Pod IP アドレス範囲に空きがないクラスタにノードプールを追加する
図: 連続していない複数の Pod CIDR の使用

変更されたファイアウォール ルール

GKE は、クラスタを作成するとファイアウォール ルールを作成し、Pod 間の通信(gke-[cluster-name]-[cluster-hash]-all)を有効にします。

不連続のマルチ Pod CIDR が有効になっているノードプールを作成または削除すると、GKE は Pod IP のクラスタで使用されるすべての Pod CIDR でこのファイアウォール ルールのソース値を更新します。

トラブルシューティング

VPC フローログを有効にすると、パケットがノードに正しく送信されているかどうかを判別できます。

次のステップ