Pod IP アドレス範囲の追加


このページでは、VPC ネイティブの Google Kubernetes Engine(GKE)クラスタで不連続マルチ Pod CIDR を有効にする方法について説明します。

概要

不連続マルチ Pod CIDR を使用すると、新規または既存のセカンダリ Pod IP アドレス範囲を GKE クラスタに追加できます。

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

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

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

利点

  • クラスタの作成前に将来の拡大を計画する必要がないため、IP の割り振りの効率が向上します。
  • 断片化した IP アドレス空間にクラスタを収めることが可能になります。
  • ビジネスニーズの変化に応じて IP アドレスを再割り振りできます。

制限事項

  • 不連続マルチ Pod CIDR は、VPC ネイティブのクラスタでのみ使用できます。
  • クラスタ内のすべてのノードプールは、バージョン 1.19.8-gke.1000 から 1.20、または 1.20.4-gke.500 以降である必要があります。
  • 不連続マルチ Pod CIDR には、Google Cloud CLI バージョン 353 以降が必要です。
  • ノードプールのセカンダリ Pod IP 範囲は、一旦作成すると変更できません。ただし、新しい範囲でノードプールを作成し、そのノードプールへワークロードをローテーションできます。

注意点

  • nonMasqueradeCIDRs パラメータで構成された ip-masq-agent を使用する場合、すべての Pod CIDR 範囲が含まれるように nonMasqueradeCIDRs を更新する必要があります。
  • ipBlock で構成された NetworkPolicy を使用してトラフィックを指定する場合は、cidr 値を更新してすべての Pod CIDR 範囲を含める必要があります。

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

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

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

始める前に

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

  • Google Kubernetes Engine API が有効になっていることを確認します。
  • Google Kubernetes Engine API の有効化
  • Google Cloud CLI がインストールされていることを確認します。
  • 次のいずれかの方法で、プロジェクトにデフォルトの Google Cloud CLI 設定をセットアップします。
    • プロジェクトのデフォルトの設定全般を確認する場合は、gcloud init を使用します。
    • gcloud config を使用して、プロジェクト ID、ゾーン、リージョンを個別に設定します。

    gcloud init

    1. gcloud init を実行して、次の操作を行います。

      gcloud init

      リモート サーバーで SSH を使用している場合は、--console-only フラグを指定して、コマンドがブラウザを起動しないようにします。

      gcloud init --console-only
    2. Google Cloud アカウントを使用できるように、gcloud CLI の承認手順を行います。
    3. 新しい構成を作成するか、既存の構成を選択します。
    4. Google Cloud プロジェクトを選択します。
    5. デフォルトの Compute Engine ゾーンを選択します。
    6. デフォルトの Compute Engine リージョンを選択します。

    gcloud config

    1. デフォルトのプロジェクト ID を設定します。
      gcloud config set project PROJECT_ID
    2. デフォルトの Compute Engine リージョン(例: us-central1)を設定します。
      gcloud config set compute/region COMPUTE_REGION
    3. デフォルトの Compute Engine ゾーン(例: us-central1-c)を設定します。
      gcloud config set compute/zone COMPUTE_ZONE
    4. gcloud を最新バージョンに更新します。
      gcloud components update

    デフォルトの場所を設定することで、gcloud CLI のエラー(One of [--zone, --region] must be supplied: Please specify location など)を防止できます。

新しいセカンダリ 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)が表示されます。

トラブルシューティング

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

次のステップ