🦀

GKE クラスタのサービス IP アドレス範囲の予約が不要になりました

2024/05/15に公開

こんにちは、クラウドエース SRE 部の阿部です。
この記事では、Google Kubernetes Engine (以降、GKE と表記) における サービス IP アドレスのデフォルト値が変更されたことについて紹介します。
また、それに伴って GKE を構築する場合の VPC ネットワークの IP アドレス設計についても述べます。

これまでの GKE のネットワーク設計の話(TL;DR)

GKE で VPC ネイティブクラスタを作成するとき、GKE では主に 4 つの IP アドレス範囲を必要としていました。

IP アドレス範囲 作成する対象
GKE ノード VPC サブネットワークのプライマリ IP アドレス範囲
GKE ポッド VPC サブネットワークのセカンダリ IP アドレス範囲
GKE サービス VPC サブネットワークのセカンダリ IP アドレス範囲
GKE コントロールプレーン VPC ネットワークのピアリングネットワークの IP アドレス範囲

このうち、 GKE サービスの IP アドレス範囲は特に指定せず自動設定すると、デフォルトでノードに指定した VPC サブネットワークに /20 (4096 個の Service オブジェクト)で自動的にセカンダリ IP アドレス範囲を作成して設定する動作でした。
また、任意で指定する場合も、事前にある程度の大きさ(最低でも /28)で予約する必要がありました。なお、 /28 だとクラスタ全体で Service オブジェクトが 16 個しか作れないため実用的ではなく、せめて /22 (1024 個の Service オブジェクト)の大きさは欲しいところです。

なお、GKE の Service オブジェクトの IP アドレス (ClusterIP) はクラスタ内部で完結する通信でのみ有効なアドレスであるため、クラスタ外で使えるように予約してもあまり意味はありません。
ただし、クラスタ外の IP アドレスと Service オブジェクトの IP アドレスが重複すると GKE クラスタの通信で不都合が発生するため、予約する仕様にしていたのだと推測します。

上記のように GKE クラスタは多数の IP アドレス範囲を消費するため、共有 VPC を使用しているケースやオンプレミスネットワークと接続しているケースでは IP アドレス空間の設定に頭を悩ませることが多いです。

新しい GKE クラスタの サービス IP アドレス範囲

GKE クラスタを新しく作成し、かつ、サービス の IP アドレス範囲を自動付与(デフォルト設定)にすると、サービスの IP アドレス範囲は 34.118.224.0/20 が使用されます。
この機能は、 GKE Autopilot クラスタは 2023 年 7 月 23 日から、GKE Standard クラスタは 2024 年 5 月 10 日から提供されています。
34.118.224.0/20 は、RFC1918 として知られるプライベート IP アドレス範囲とは異なる、Google が管理している IP アドレス範囲です。
プライベートネットワークで予約する IP アドレス範囲をはじめとして、他の IP アドレス範囲とは重複しないため、この IP アドレスを使用できるとネットワーク全体の IP アドレス設計が楽になります。

新しいサービス IP アドレス範囲の使い方

34.118.224.0/20 でサービスの IP アドレス範囲を設定したい場合、GKE クラスタが以下の条件を満たす必要があります。

  • GKE Autopilot クラスタ: GKE バージョン 1.27 以降
  • GKE Standard クラスタ: GKE バージョン 1.29 以降 ※なお、筆者が検証した限りではパッチバージョン 1.29.1 では設定できず、1.29.3 以降のパッチバージョンで有効化できました。

上記のバージョンの条件を満たしたクラスタを新規作成するときに、GKE サービスの IP アドレス範囲を未設定にすることで有効になります。
以下は GKE Autopilot クラスタ作成時のコマンドライン例です。(--region オプションはクラスタを作成したいリージョンを指定します。)

クラスタ作成コマンド例
gcloud container clusters create-auto test-autopilot --region REGION

また、/20より小さい IP アドレス範囲を設定したい場合は、以下のように --services-ipv4-cidr オプションに範囲を指定します。

クラスタ作成コマンド例
gcloud container clusters create-auto test-autopilot --region REGION --services-ipv4-cidr "/22"

Terraform で設定したい場合は、 google_container_cluster リソースの ip_allocation_policy ブロック内で、 services_secondary_range_name および services_ipv4_cidr_block を省略します。

resource "google_container_cluster" "example" {
...
  ip_allocation_policy {
    cluster_secondary_range_name  = "セカンダリIPアドレス範囲の名前"
    # services_secondary_range_name や services_ipv4_cidr_block は設定しない
  }
...
}

既存のクラスタのサービス IP アドレス範囲について

既存のクラスタのサービス IP アドレス範囲は、クラスタバージョンをアップグレードしても変更されません。
この仕様は、Service 用のサブネット セカンダリ IP アドレス範囲のドキュメントに以下の通り記載されています。

Service のセカンダリ IP アドレス範囲は慎重に計画してください。これはサブネット セカンダリ IP アドレス範囲でもあるため、クラスタの作成後にこの範囲を変更することはできません。

よって、サービスの IP アドレス範囲を削減して、ネットワーク全体の利用可能な IP アドレスを増やしたい場合は、既存のクラスタから新しいクラスタに置き換えていく必要があります。

注意事項

なお、クラスタ作成コマンドの --services-ipv4-cidr や Terraform の services_ipv4_cidr_block 等で 34.118.224.0/20 を指定してクラスタを作成すると、以下のようなエラーが発生してクラスタの作成に失敗します。
(おそらくサブネットワークにセカンダリ IP 範囲を設定する際に意図しないエラーとなってしまうようです。また、エラー扱いになるまでかなり時間がかかります。)

Retry budget exhausted (80 attempts): Google Compute Engine: Invalid value for field 'resource.secondaryIpRanges[2].ipCidrRange': '34.118.224.0/20'. Invalid IP address range.

やる人はあまりいないと思いますが、注意しましょう。

今後の GKE クラスタのネットワーク設計

今後 GKE クラスタを含むネットワークの IP アドレス範囲を設計する場合、GKE サービス の IP アドレス範囲は 34.118.224.0/20 を使用することを推奨します。
また、GKE コントロールプレーンの IP アドレスも、2024 年 3 月 11 日から Private Service Connect として設定できるようになっています。
そのため、以下のように IP アドレス範囲を節約することが可能です。

IP アドレス範囲 作成する対象 設計要否
GKE ノード VPC サブネットワークのプライマリ IP アドレス範囲 必要
GKE ポッド VPC サブネットワークのセカンダリ IP アドレス範囲 必要
GKE サービス デフォルトの IP アドレス(34.118.224.0/20)を使用 不要
GKE コントロールプレーン Private Service Connect として GKE ノードの IP アドレス範囲と共有可 不要

まとめ

GKE のサービス IP アドレス範囲のデフォルト値の変更について紹介しました。
プライベート IP アドレス範囲の消費を抑えながら設計できるようになったため、ネットワーク管理担当者には嬉しいニュースかも知れません。
(ただ、既存の GKE クラスタをリプレースするのはなかなか厳しいですが……)

この記事が GKE を使う方のお役に立ちましたら幸いです。

Discussion