エイリアス IP アドレスを使用した VPC ネイティブ クラスタの作成

このページでは、エイリアス IP を使用して Google Kubernetes Engine で VPC ネイティブ クラスタを作成する方法について説明します。GKE ネットワーキングに関する一般的な情報については、ネットワークの概要をご覧ください。

概要

エイリアス IP アドレスを使用すると、GKE クラスタは Google Cloud Platform(GCP)によって認識される CIDR ブロックから IP アドレスを割り当てることができます。これによりクラスタのスケーラビリティが向上し、クラスタが他の GCP プロダクトやエンティティとより適切にやりとりできるようになります。

利点

エイリアス IP アドレスには次のような利点があります。

  • ポッド IP アドレスが GCP ネットワーク内(VPC ネットワーク ピアリング経由も含む)でネイティブにルーティング可能であるため、ルート割り当てを使い切ることがなくなります。
  • ポッド IP アドレスがネットワーク内であらかじめ予約されるため、他のコンピューティング リソースとの競合を防止できます。
  • ネットワーク層でなりすまし対策チェックを行い、下りトラフィックが任意の送信元 IP アドレスで送信されないようにできます。
  • エイリアスが設定された IP アドレスを Cloud Router が BGP 経由でアナウンスできます。
  • エイリアス IP アドレスを使用すると、ポッドは NAT ゲートウェイを使用せずにホストされているサービスに直接アクセスできます。

制限事項

  • 現在、VPC ネイティブ クラスタは、高度なルートを使用するクラスタに移行できません。
  • 現在、ポッド ルーティングのルートを使用する既存のクラスタは、エイリアス IP アドレスを使用するクラスタに移行できません。
  • VPC ネイティブ クラスタでは、レガシー ネットワークを使用できません。
  • 内部サービス用のクラスタ IP アドレスはクラスタ内でのみ使用できます。VPC 内でクラスタの外部から(たとえば、Compute Engine インスタンスから)Kubernetes サービスにアクセスする場合は、内部ロードバランサを使用してください。

始める前に

このタスクの準備として、次の手順を行います。

  • Google Kubernetes Engine API が有効になっていることを確認します。
  • Google Kubernetes Engine API の有効化
  • Cloud SDK がインストール済みであることを確認します。
  • デフォルトのプロジェクト ID を設定します。
    gcloud config set project [PROJECT_ID]
  • ゾーンクラスタを使用する場合は、デフォルトのコンピューティング ゾーンを設定します。
    gcloud config set compute/zone [COMPUTE_ZONE]
  • リージョン クラスタを使用する場合は、デフォルトのコンピューティング リージョンを設定します。
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud を最新バージョンに更新します。
    gcloud components update

セカンダリ範囲

エイリアス IP アドレスを使用して作成されたクラスタは、以下の 2 つのセカンダリ範囲を使用して、IP アドレスを VPC 内で割り当てます。

  • ポッド IP アドレスのエイリアス IP アドレスを割り当てる範囲
  • ClusterIP サービスのスペースを確保して VPC 内でサービス IP アドレスが再利用されないようにする範囲

エイリアス IP アドレスの割り当て方式は、高度なルートで使用される方式とは異なります。高度なルートを使用すると、1 つの CIDR 範囲がクラスタ全体に割り当てられ、範囲がポッドとサービスで分割されます(範囲の最後の /20)。エイリアス IP アドレスを使用すると、サービスの範囲はクラスタ範囲外の別個の CIDR 範囲となります。

セカンダリ範囲の管理

セカンダリ範囲をクラスタに関連付けるには、2 つの方法があります。

GKE による管理

コントロール プレーンにセカンダリ範囲を管理させることができます。これは、エイリアス IP アドレスを使用してクラスタを作成する場合と、CIDR 範囲 / ネットマスクのフラグ(--cluster-ipv4-cidr--services-ipv4-cidr)を使用する場合に使われるデフォルト モードです。

セカンダリ範囲のサイズと配置をカスタマイズするには、CIDR 範囲を明示的に命名する(たとえば 10.0.0.0/16)か、ネットマスクのサイズを定義(/16 など)します。クラスタをこの方法で作成または削除すると、GKE が自動的にセカンダリ範囲を VPC に作成または削除します。

ユーザー管理

セカンダリ範囲を手動で作成し、これらの範囲を使用してクラスタを作成できます。セカンダリ範囲を手動で作成する場合は、自分で管理する必要があります。

共有 VPC ネットワーク上のクラスタのセカンダリ範囲は、手動で作成する必要があります。共有 VPC では、GKE クラスタを作成するユーザーは、セカンダリ範囲を自分のテナント資格情報で作成できません。ホスト プロジェクトのオーナーがセカンダリ範囲を作成し、それらの範囲をテナントに渡してテナントのクラスタが使用できるようにします。

クラスタのサイズに関する考慮事項

所定の GKE クラスタのノードとサービスの最大数は、クラスタのセカンダリ範囲のサイズによって決まります。セカンダリ範囲のサイズは、クラスタを作成した後は変更できません。クラスタを作成する際、クラスタの予想される増大に対応できる十分な大きさのセカンダリ範囲を選択するようにしてください。

検討すべき 3 つの範囲(ノード、ポッド、サービス)について、次の表に概要を示します。

範囲 ガイダンス
ノード

ノード IP は、クラスタに関連付けられたサブネットワークのプライマリ範囲から取得されます。クラスタのサブネットワークは、クラスタ内のノードの総数に合った十分な大きさでなければなりません。

たとえば、900 ノードのクラスタを作成する予定であれば、クラスタで使用されるサブネットは少なくとも /22 のサイズでなければなりません。サブネット サイズ /22 では 2(32-22) = 210 = 1,024 - 4 個の予約済み IP アドレス = 1,020 の IP アドレスが含まれます。この数であれば、クラスタに必要となる 900 ノード IP アドレスに十分です。

ポッド

現在、各ノードには /24(2(32-24) = 28 = 256)ブロックのポッド IP アドレスが割り当てられています。ポッド IP アドレスは、ポッドの関連するセカンダリ範囲から取得されます。--cluster-ipv4-cidr または --cluster-secondary-range-name フラグにより決定されるボット範囲は、少なくとも(ノード総数 × 256)の IP アドレス数に合った大きさでなければなりません。

たとえば、900 ノードクラスタの場合、900 × 256 = 230,400 の IP アドレスが必要です。IP アドレスは /24 サイズのブロック内でなければなりません。これはノードに割り当てられた粒度です。サイズが /14 以上のセカンダリ範囲が必要です。/14 範囲の IP アドレスの場合、2(32-14) = 218 ≈ 262,000 の IP アドレスということになります。

サービス

すべてのクラスタで、Kubernetes Service クラスタ IP アドレス用の IP アドレスの範囲を予約する必要があります。サービス IP アドレスは、サービスの関連するセカンダリ範囲から割り当てられます。IP アドレスのブロックが、クラスタ内で実行することが予想されるサービスの総数を十分に満たせるようにする必要があります。範囲を定義するには --services-ipv4-cidr フラグか --services-secondary-range-name フラグを使用します。

たとえば、最大で 3,000 個のサービスを実行するクラスタの場合、クラスタ IP アドレスに使用する IP アドレスは 3,000 個必要になります。サイズが /20 以上のセカンダリ範囲が必要です。/20 範囲の IP アドレスの場合、2(32-20) = 212 ≈ 4,000 の IP アドレスということになります。

ノードの作成は、ポッドのアドレス範囲から割り当て可能なアドレスに限定されます。ポッドのアドレス範囲に使用可能な IP アドレスがない場合、ノードの作成に失敗し、エラー Instance [instance name] creation failed: IP space of [cluster subnet] is exhausted が返されます(1 つのノードを作成するのに 256 以上は必要です)。

ユーザーが管理するセカンダリ範囲を使用している場合は、次の表を参考にして、特定のクラスタ サブネット サイズの最大ノード数に達しているかどうか確認してください。

ノードのサブネット サイズ 最大ノード数 必要な最大ポッド IP アドレス数 ポッドアドレスの推奨範囲
/29 4 1,024 /21
/28 12 3,072 /20
/27 28 7,168 /19
/26 60 15,360 /18
/25 124 31,744 /17
/24 252 64,512 /16
/23 508 130,048 /15
/22 1,020 261,120 /14
/21 2,044 523,264 /13
/20 4,092 1,047,552 /12
/19 8,188 2,096,128 /11(最大のポッドアドレス範囲)

範囲サイズのデフォルトと制限

範囲 デフォルト サイズ 最小サイズ 最大サイズ
ノード(クラスタ サブネット)

/20 = 212 = 4,096 - 4 個の予約済み IP アドレス = ノード用に 4,092 個の IP アドレス

/29 = 23 = 8 - 4 個の予約済み IP アドレス = ノード用に 4 個の IP アドレス

/7 = 225 = ノード用に約 3,300 万個の IP アドレス

ポッド(セカンダリ範囲)

/14 = 218 = ポッド用に 262,114 個の IP アドレス

/24 = 28 = ポッド用に 256 個の IP アドレス


/21 = 211 = ポッド用に 2,048 個の IP アドレス(GKE マネージドの範囲

/11 = 221 = 約 200 万個の IP アドレス

サービス(セカンダリ範囲)

/20 = 212 = サービス用に 4,096 個の IP アドレス

/27 = 25 = サービス用に 32 個の IP アドレス

/16 = 216 = サービス用に 65,536 個の IP アドレス

エイリアス IP アドレスを使用してクラスタを作成する

エイリアス IP アドレスを使用して VPC ネイティブのクラスタを作成するには、Google Cloud Platform Console を使用します。

ノードに割り当てることができるポッドの最大数を構成することで、クラスタでの IP アドレス空間の使用を最適化できます。

gcloud コマンドライン ツールまたは GKE API を使用します。

gcloud

エイリアス IP アドレスを使用してクラスタを作成するには、次のコマンドを実行します。[CLUSTER_NAME] は、クラスタに付ける名前です。

gcloud container clusters create [CLUSTER_NAME] --enable-ip-alias

Console

エイリアス IP アドレスを使用してクラスタを作成するには:

  1. GCP Console で Google Kubernetes Engine のメニューに移動します。

    Google Kubernetes Engine のメニューに移動

  2. [クラスタを作成] をクリックします。

  3. 必要に応じてクラスタを構成します。次に、[詳細オプション] をクリックします。

  4. [VPC ネイティブ] セクションで、[VPC ネイティブを有効にする(エイリアス IP を使用)] を選択します。

  5. [作成] をクリックします。

API

エイリアス IP アドレスを使用してクラスタを作成するには、クラスタ リソースで IPAllocationPolicy オブジェクトを定義します。

{
  "name": [CLUSTER_NAME],
  "description": [DESCRIPTION],
  ...
  "ipAllocationPolicy": {
    "useIpAliases": true,
    "clusterIpv4CidrBlock"      : string,
    "servicesIpv4CidrBlock"     : string,
    "clusterSecondaryRangeName" : string,
    "servicesSecondaryRangeName": string,

  },
  ...
}

ここで:

  • "useIpAliases": true で、エイリアス IP アドレスを持つクラスタを作成します。
  • "clusterIpv4CidrBlock" は、ポッドの CIDR 範囲のサイズ / 場所です。ポッドのセカンダリ範囲のサイズを決定し、CIDR 表記の IP/サイズ(例: 10.0.0.0/14)、あるいは /サイズ(例: /14)となります。指定されたサイズの空きスペースが、VPC 内の使用可能なスペースから選ばれます。空白にしておくと、有効な範囲を探してデフォルトのサイズで作成します。
  • "servicesIpv4CidrBlock" は、サービスの CIDR 範囲のサイズ / 場所です。"clusterIpv4CidrBlock" の説明をご覧ください。
  • "clusterSecondaryRangeName" は、ポッドのセカンダリ範囲の名前です。セカンダリ範囲は、すでに存在している必要があり、クラスタに関連付けられているサブネットワーク(--subnetwork フラグで指定されたサブネットワークなど)に属していなければなりません。
  • "serviceSecondaryRangeName" は、サービスのセカンダリ範囲の名前です。セカンダリ範囲は、すでに存在している必要があり、クラスタに関連付けられているサブネットワーク(--subnetwork フラグで指定されたサブネットワークなど)に属していなければなりません。

他のクラスタの例は、をご覧ください。

クラスタのセカンダリ範囲を確認する

エイリアス IP アドレスを使用してクラスタを作成したら、クラスタの範囲を確認する必要があります。

gcloud

クラスタを確認するには、次のコマンドを実行します。

gcloud container clusters describe [CLUSTER_NAME]

コマンド出力で、ipAllocationPolicy フィールドの下を見てください。

  • clusterIpv4Cidr は、ポッドのセカンダリ範囲です。
  • servicesIpv4Cidr は、サービスのセカンダリ範囲です。

Console

クラスタを確認するには、次の手順を行います。

  1. GCP Console で Google Kubernetes Engine のメニューに移動します。

    Google Kubernetes Engine のメニューに移動

  2. 目的のクラスタを選択します。

セカンダリ範囲は、[詳細] タブの下の [クラスタ] セクションに表示されます。

  • [コンテナ アドレスの範囲] は、ポッドのセカンダリ範囲です。
  • [サービス アドレスの範囲] は、サービスのセカンダリ範囲です。

以降のセクションでは、エイリアス IP アドレスを使用する場合の例を示します。

特定の IP アドレス範囲を持つクラスタを作成する

gcloud

このコマンドは、指定されたポッドおよびサービスの範囲を持つ my-cluster を作成します。セカンダリ範囲が自動的に作成され、デフォルトのサブネットワークに接続され、GKE により管理されます。

gcloud container clusters create my-cluster \
  --enable-ip-alias --cluster-ipv4-cidr=10.0.0.0/14 \
  --services-ipv4-cidr=10.4.0.0/19

Console

以下により、指定されたポッドおよびサービスの範囲を持つ my-cluster が作成されます。セカンダリ範囲が自動的に作成され、デフォルトのサブネットワークに接続され、GKE により管理されます。

  1. GCP Console で Google Kubernetes Engine のメニューに移動します。

    Google Kubernetes Engine のメニューに移動

  2. [クラスタを作成] をクリックします。

  3. 必要に応じてクラスタを構成します。次に、[詳細オプション] をクリックします。

  4. [VPC ネイティブ] セクションで、[VPC ネイティブを有効にする(エイリアス IP を使用)] を選択します。

  5. [ポッドのアドレス範囲] フィールドに、ポッド範囲(例: 10.0.0.0/14)を入力します。

  6. [サービス アドレスの範囲] フィールドに、サービス範囲(例: 10.4.0.0/19)を入力します。

特定のサイズを持つクラスタを別のサブネットワーク上に作成する

このコマンドは、指定されたポッドおよびサービスの範囲サイズを持つ my-cluster を作成します。CIDR 範囲の場所は VPC の空き容量により決定します。セカンダリ範囲が作成されて、サブネットワーク my-subnet に接続されます。セカンダリ範囲は GKE により管理されます。

gcloud container clusters create my-cluster \
  --subnetwork my-subnet \
  --enable-ip-alias --cluster-ipv4-cidr=/16 \
  --services-ipv4-cidr=/22

既存のセカンダリ範囲を持つクラスタを作成する

エイリアス IP アドレスのセカンダリ範囲の作成方法については、エイリアス IP アドレス範囲の概要をご覧ください。

サブネット上で 2 つのセカンダリ範囲を作成する必要があります。1 つはポッド用に my-pods という名前にし、もう 1 つはサービス用に my-services という名前にします。

gcloud compute networks subnets update my-subnet \
    --add-secondary-ranges my-pods=10.0.0.0/16,my-services=10.1.0.0/16 \
    --region us-central1

次に、クラスタを作成します。

gcloud

次のコマンドを実行します。

gcloud container clusters create my-cluster \
--enable-ip-alias \
--cluster-secondary-range-name=my-pods \
--services-secondary-range-name=my-services

Console

次の手順を行います。

  1. GCP Console で Google Kubernetes Engine のメニューに移動します。

    Google Kubernetes Engine のメニューに移動

  2. [クラスタを作成] をクリックします。

  3. 必要に応じてクラスタを構成します。次に、[詳細オプション] をクリックします。

  4. [VPC ネイティブ] セクションで、[VPC ネイティブを有効にする(エイリアス IP を使用)] を選択します。

  5. [セカンダリ範囲を自動的に作成する] を false に設定します。

  6. クラスタで使用するネットワークノードのサブネットを選択します。

  7. クラスタで使用するポッドのセカンダリ範囲サービスのセカンダリ範囲を選択します。

自動的にサブネットワークを作成する

次の手順で、自動的に生成されたサブネットワークを持つ新しいエイリアス IP アドレスのクラスタを作成します。

gcloud

エイリアス IP アドレスを使用する新しいクラスタを作成するには、次のコマンドを実行します。

gcloud container clusters create --enable-ip-alias --create-subnetwork name=my-cluster-subnet

このコマンドでは、新しいクラスタが IP アドレス範囲とサブネットワークを使用して自動的に構成されます。サブネットワークの名前(この例では name=my-cluster-subnet)を指定するか、空の文字列("")を指定して名前を自動的に生成できます。

自分でクラスタを設定するには、次のコマンドを実行します。

gcloud container clusters create [CLUSTER_NAME] --enable-ip-alias \
--create-subnetwork="" [--cluster-ipv4-cidr [RANGE] --services-ipv4-cidr [RANGE] ]

コマンドの内容:

  • [CLUSTER_NAME] はクラスタに付ける名前です。
  • --enable-ip-alias フラグは、クラスタがエイリアス IP アドレスを使用することを示します。
  • --create-subnetwork フラグを指定すると、クラスタのサブネットワークが自動的に作成されます。
  • オプションの --cluster-ipv4-cidr フラグは、クラスタの CIDR 範囲のサイズと場所を示します。[RANGE] は、[IP address]/[SIZE] の形式(例: 10.0.0.0/18)または /[SIZE] になります。後者の場合、IP アドレスが自動的に割り当てられます。このフラグを省略すると、CIDR 範囲がデフォルトのサイズで自動的に割り当てられます。
  • オプションの --services-ipv4-cidr フラグは、サービスの CIDR 範囲のサイズと場所を示します。[RANGE] の指定方法は --cluster-ipv4-cidr と同じです。この範囲を --cluster-ip4-cidr と重複させることはできません。その逆も同じです。このフラグを省略すると、CIDR 範囲がデフォルトのサイズで自動的に割り当てられます。

API

エイリアス IP アドレスを使用してクラスタを作成するには、クラスタ リソースで IPAllocationPolicy オブジェクトを定義します。

{
  "name": [CLUSTER_NAME],
  "description": [DESCRIPTION],
  ...
  "ipAllocationPolicy": {
    "useIpAliases": true,
    "createSubnetwork": true,
    "subnetworkName": [SUBNET_NAME]
  },
  ...
}

"useIpAliases": true で、エイリアス IP アドレスを持つクラスタを作成します。 createSubnetwork は、クラスタのサブネットワークを自動的に作成してプロビジョニングします。subnetworkName はオプションです。空のままにすると、サブネットワークの名前が自動的に選択されます。

トラブルシューティング

このセクションでは、エイリアス IP アドレスに関連する問題を解決する際の指針について説明します。

ポッド用の空き IP アドレス空間が不足している

症状: * クラスタが長い時間プロビジョニング状態で停止している * クラスタの作成時にマネージド インスタンス グループ(MIG)エラーが返される * 新しいノードを既存のクラスタに追加できない

考えられる原因

ポッドのセカンダリ範囲内の未割り当てスペースが、クラスタ内でリクエストされたノードに十分な大さではありません。たとえば、ユーザーがポッドに /23 セカンダリ範囲を指定し、3 ノード以上をリクエストすると、クラスタがプロビジョニング状態で停止する可能性があります。IP アドレス範囲のサイズを適正にする際の指針について、クラスタのサイズに関する考慮事項を参照してください。

この問題がクラスタの作成時に発生する場合は、プロビジョニング状態で停止しているクラスタを削除して、クラスタにとってスペースが十分にあるセカンダリ範囲を持つ別のクラスタを作成します。

1 つのサブネットに最大で 5 個のセカンダリ範囲を設定できます。また、VPC ネイティブ クラスタごとに、2 個以上のセカンダリ範囲が必要です(1 つはポッド用、もう 1 つはサービス用)。

この問題がノードのプールのサイズ変更中に発生する場合は、既存ノードを削除して新しいノードのためのスペースを空ける必要があります。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のドキュメント