このページでは、連続していないマルチ 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
を実行して最新のバージョンを取得します。
- 特定のユースケースに対して Pod IPv4 範囲を追加するのセクションを確認します。
- VPC ネイティブ クラスタのみを使用します。
GKE Autopilot で Pod の IPv4 範囲を追加する
バージョン 1.26 以降の GKE Autopilot クラスタの場合、追加のセカンダリ範囲を作成してクラスタに割り当てることで、Pod の IPv4 範囲を追加できます。
サブネットに追加のセカンダリ範囲を作成する
コンソール
Google Cloud コンソールで [VPC ネットワーク] ページに移動します。
[VPC ネットワーク] リストで、拡張するネットワークを選択します。
[サブネット] リストで、必要なサブネットを選択します。
[編集] をクリックします。
[IP の範囲を追加] をクリックします。
[サブネット範囲の名前] に、追加の Pod 範囲名を入力します。例:
pod-range-2
[セカンダリ IP 範囲] に、IP 範囲を入力します。例:
10.2.204.0/22
[保存] をクリックします。
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 を使用できます。
コンソール
Google Cloud コンソールで Google Kubernetes Engine のページに移動します。
編集するクラスタの横にあるmore_vert [アクション] をクリックし、[edit 編集] をクリックします。
[ネットワーキング] セクションで、[クラスタ Pod の IPv4 範囲(追加)] の横にある edit [編集] をクリックします。
[追加のクラスタ Pod の IPv4 範囲の編集] ダイアログで、クラスタに追加する Pod セカンダリ CIDR 範囲を選択します。クラスタへの追加のセカンダリ範囲として、サブネットで作成した Pod 範囲と同じ名前を使用します。
[変更内容を保存] をクリックします。
gcloud
追加の 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 のロケーション。
新しい 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 を使用している場合、podRange
と podIpv4CidrBlock
には、このノードプールに構成済みの値が表示されます。
ノードプールが不連続マルチ Pod CIDR を使用していない場合、podRange
と podIpv4CidrBlock
には、IPAllocationPolicy からクラスタのデフォルト値(clusterSecondaryRangeName
と clusterIpv4CidrBlock
)が表示されます。
特定のユースケースに 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 番目のノードを追加するように、クラスタが展開されます。
変更されたファイアウォール ルール
GKE は、クラスタを作成するとファイアウォール ルールを作成し、Pod 間の通信(gke-[cluster-name]-[cluster-hash]-all
)を有効にします。
不連続のマルチ Pod CIDR が有効になっているノードプールを作成または削除すると、GKE は Pod IP のクラスタで使用されるすべての Pod CIDR でこのファイアウォール ルールのソース値を更新します。
トラブルシューティング
VPC フローログを有効にすると、パケットがノードに正しく送信されているかどうかを判別できます。