VPC ネイティブ クラスタの作成

このページでは、Google Kubernetes Engine(GKE)で VPC ネイティブ クラスタを構成する方法について説明します。

VPC ネイティブ クラスタの利点と要件の詳細については、VPC ネイティブ クラスタの概要をご覧ください。

始める前に

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

次のいずれかの方法で gcloud のデフォルトの設定を指定します。

  • gcloud init。デフォルトの設定全般を確認する場合に使用します。
  • gcloud config。プロジェクト ID、ゾーン、リージョンを個別に設定する場合に使用します。

gcloud init の使用

エラー One of [--zone, --region] must be supplied: Please specify location を受信した場合は、このセクションの内容を実施します。

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

    gcloud init

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

    gcloud init --console-only
  2. 手順に従って gcloud を承認し、Google Cloud アカウントを使用します。
  3. 新しい構成を作成するか、既存の構成を選択します。
  4. Google Cloud プロジェクトを選択します。
  5. ゾーンクラスタの場合はデフォルトの Compute Engine ゾーン、リージョン クラスタまたは Autopilot クラスタの場合はデフォルトの Compute Engine リージョンを選択します。

gcloud config の使用

  • デフォルトのプロジェクト ID を設定します。
    gcloud config set project PROJECT_ID
  • ゾーンクラスタを使用する場合は、デフォルトのコンピューティング ゾーンを設定します。
    gcloud config set compute/zone COMPUTE_ZONE
  • Autopilot クラスタまたはリージョン クラスタを使用する場合は、デフォルトのコンピューティング リージョンを設定します。
    gcloud config set compute/region COMPUTE_REGION
  • gcloud を最新バージョンに更新します。
    gcloud components update

手順

次の手順に従って、VPC ネイティブ クラスタを作成し、構成された Pod と Service の IP アドレス範囲を確認します。

既存のサブネットにクラスタを作成する

セカンダリ範囲割り当て方式を選択して、既存のサブネットで VPC ネイティブ GKE クラスタを作成する方法を次の手順で示します。

gcloud

  • GKE によって管理されているセカンダリ範囲割り当て方式を使用するには、次のようにします。

    gcloud container clusters create cluster-name \
      --region=region \
      --enable-ip-alias \
      --subnetwork=subnet-name \
      --cluster-ipv4-cidr=pod-ip-range \
      --services-ipv4-cidr=services-ip-range
    
  • ユーザーによって管理されているセカンダリ範囲割り当て方式を使用するには、次のようにします。

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

プレースホルダを有効な値に置き換えます。

  • cluster-name は GKE クラスタの名前です。
  • region は、クラスタを作成するリージョンです。ゾーンクラスタを作成するには、このフラグを --zone=zone に置き換えます。zone は Google Cloud ゾーンです。
  • subnet-name は、既存のサブネットの名前です。ノードにはサブネットのプライマリ IP アドレス範囲が使用されます。サブネットは、クラスタによって使用されるリージョンと同じリージョンに存在する必要があります。省略した場合、GKE はクラスタのリージョンにある default VPC ネットワーク内のサブネットの使用を試みます。
  • セカンダリ範囲の割り当て方式が GKE によって管理されている場合:
    • pod-ip-range は、CIDR 表記の IP アドレス範囲(10.0.0.0/14 など)、または CIDR ブロックのサブネット マスクのサイズ(/14 など)です。これは、Pod 用のサブネット セカンダリ IP アドレス範囲を作成するために使用されます。--cluster-ipv4-cidr オプションを省略すると、GKE は自動的に /14 範囲(218 のアドレス)を選択します。自動選択範囲が 10.0.0.0/8(範囲 224 のアドレス)からランダムに選択されます。この範囲には、VM、既存のルート、他のクラスタに割り振られた IP アドレス範囲は含まれません。自動選択範囲は、予約済み IP アドレス動的ルート、またはこのクラスタとピアリングする VPC 内のルートと競合する可能性があります。これらの範囲を使用する場合は、競合を避けるため --cluster-ipv4-cidr を指定する必要があります。
    • services-ip-range は、CIDR 表記の IP アドレス範囲(10.4.0.0/19 など)、または CIDR ブロックのサブネット マスクのサイズ(/19 など)です。これは、Service 用のサブネット セカンダリ IP アドレス範囲を作成するために使用されます。
  • セカンダリ範囲の割り当て方式がユーザーによって管理されている場合:
    • secondary-range-pods は、指定された subnet-name 内の既存のセカンダリ IP アドレス範囲の名前です。GKE は、クラスタの Pod にサブネット セカンダリ IP アドレス範囲全体を使用します。
    • secondary-range-services は、指定された subnet-name 内の既存のセカンダリ IP アドレス範囲の名前です。GKE は、クラスタの Service にサブネット セカンダリ IP アドレス範囲全体を使用します。

Console

  1. Cloud Console で Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

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

  3. ナビゲーション パネルの [クラスタ] の下の [ネットワーキング] をクリックします。

  4. [ネットワーク] プルダウン リストで、任意の VPC を選択します。

  5. [ノードのサブネット] プルダウン リストで、クラスタのサブネットを選択します。

  6. [VPC ネイティブのトラフィック ルーティングを有効にする(エイリアス IP を使用)] チェックボックスが選択されていることを確認します。

  7. セカンダリ範囲割り当て方式を GKE によって管理する場合は、[セカンダリ範囲を自動的に作成する] チェックボックスを選択します。選択したサブネットのセカンダリ範囲をすでに作成していて、セカンダリ範囲割り当て方式をユーザーによって管理する場合は、このチェックボックスをオフにします。

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

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

  10. 必要に応じてクラスタを構成します。

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

API

VPC ネイティブ クラスタを作成する場合、IPAllocationPolicy オブジェクトを定義します。既存のサブネット セカンダリ IP アドレス範囲を参照することも、CIDR ブロックを指定することもできます。既存のサブネット セカンダリ IP アドレス範囲を参照して、セカンダリ範囲の割り当てがユーザーによって管理されるクラスタを作成します。この範囲の割り当てを GKE によって管理する場合は、CIDR ブロックを指定します。

{
  "name": cluster-name,
  "description": description,
  ...
  "ipAllocationPolicy": {
    "useIpAliases": true,
    "clusterIpv4CidrBlock"      : string,
    "servicesIpv4CidrBlock"     : string,
    "clusterSecondaryRangeName" : string,
    "servicesSecondaryRangeName": string,

  },
  ...
}

ここで

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

Terraform

Terraform モジュールを使用すると、Terraform を介して VPC ネイティブ クラスタを簡単に作成できます。

たとえば、このブロックを Terraform 構成に追加できます。

module "gke" {
  source  = "terraform-google-modules/kubernetes-engine/google"
  version = "~> 12.0"

  project_id        = "project-id"
  name              = "cluster-name"
  region            = "region"
  network           = "network-name"
  subnetwork        = "subnet-name"
  ip_range_pods     = "secondary-range-pods"
  ip_range_services = "secondary-range-services"
}

以下を置き換えます。

  • project-id は、クラスタを作成するプロジェクト ID です。
  • cluster-name は GKE クラスタの名前です。
  • region は、クラスタを作成するリージョンです。
  • network-name は、既存のネットワークの名前です。
  • subnet-name は、既存のサブネットの名前です。ノードにはサブネットのプライマリ IP アドレス範囲が使用されます。サブネットは、クラスタによって使用されるリージョンと同じリージョンに存在する必要があります。
  • secondary-range-pods は、指定された subnet-name 内の既存のセカンダリ IP アドレス範囲の名前です。GKE は、クラスタの Pod にサブネット セカンダリ IP アドレス範囲全体を使用します。
  • secondary-range-services は、指定された subnet-name 内の既存のセカンダリ IP アドレス範囲の名前です。GKE は、クラスタの Service にサブネット セカンダリ IP アドレス範囲全体を使用します。

クラスタとサブネットを同時に作成する

VPC ネイティブ GKE クラスタとサブネットを同時に作成する方法を次に示します。1 つのコマンドでこれらの 2 つのステップを実行すると、セカンダリ範囲割り当て方式は GKE によって管理されます。

gcloud

VPC ネイティブ クラスタとサブネットを同時に作成するには、次のようにします。

gcloud container clusters create cluster-name \
    --region=region \
    --enable-ip-alias \
    --create-subnetwork name=subnet-name,range=node-ip-range \
    --cluster-ipv4-cidr=pod-ip-range \
    --services-ipv4-cidr=services-ip-range

ここで

  • cluster-name は GKE クラスタの名前です。
  • region は、クラスタを作成するリージョンです。ゾーンクラスタを作成するには、このフラグを --zone=zone に置き換えます。zone は GKE ゾーンです。
  • subnet-name は、作成するサブネットの名前です。サブネットのリージョンは、クラスタと同じリージョンです(つまり、ゾーンクラスタが含まれているリージョン)。GKE によって自動的に名前を生成する場合は、空のストリング(name="")を使用します。
  • node-ip-range は、CIDR 表記の IP アドレス範囲(10.5.0.0/20 など)、または CIDR ブロックのサブネット マスクのサイズ(/20 など)です。これは、ノードのサブネット プライマリ IP アドレス範囲を作成するために使用されます。省略した場合、GKE は /20 のサイズで VPC 内で使用可能な IP 範囲を選択します。
  • pod-ip-range は、CIDR 表記の IP アドレス範囲(10.0.0.0/14 など)、または CIDR ブロックのサブネット マスクのサイズ(/14 など)です。これは、Pod 用のサブネット セカンダリ IP アドレス範囲を作成するために使用されます。省略した場合、GKE は 218 のアドレスを含むランダムに選択された /14 範囲を使用します。自動選択範囲が 10.0.0.0/8(範囲 224 のアドレス)からランダムに選択されます。この範囲には、VM、既存のルート、他のクラスタに割り振られた IP アドレス範囲は含まれません。自動選択範囲は、予約済み IP アドレス動的ルート、またはこのクラスタとピアリングする VPC 内のルートと競合する可能性があります。これらの範囲を使用する場合は、競合を避けるため --cluster-ipv4-cidr を指定する必要があります。
  • services-ip-range は、CIDR 表記の IP アドレス範囲(10.4.0.0/19 など)、または CIDR ブロックのサブネット マスクのサイズ(/19 など)です。これは、Service 用のサブネット セカンダリ IP アドレス範囲を作成するために使用されます。省略した場合、GKE はデフォルトの Service IP アドレス範囲のサイズである /20 を使用します。

Console

Cloud Console を使用して、クラスタとサブネットを同時に作成することはできません。代わりに、最初にサブネットを作成し、次に既存のサブネットにクラスタを作成します。

API

VPC ネイティブ クラスタを作成するには、クラスタ リソースに [IPAllocationPolicy] オブジェクトを定義します。

{
  "name": cluster-name,
  "description": description,
  ...
  "ipAllocationPolicy": {
    "useIpAliases": true,
    "createSubnetwork": true,
    "subnetworkName": subnet-name
  },
  ...
}

createSubnetwork フィールドによって、クラスタのサブネットワークが自動的に作成され、プロビジョニングされます。subnetworkName フィールドはオプションです。空のままにすると、サブネットワークの名前が自動的に選択されます。

RFC 1918 以外のプライベート IP アドレス範囲の使用

GKE クラスタでは、ノード、Pod、Service に RFC 1918 以外のプライベート IP アドレス範囲を使用できます。サブネット範囲の内部 IP アドレスとして使用できる RFC 1918 以外のプライベート範囲については、VPC ネットワークのドキュメントで有効範囲をご覧ください。

RFC 1918 以外のプライベート IP アドレス範囲は、限定公開クラスタと非限定公開クラスタの両方に対応しています。

RFC 1918 以外のプライベート範囲はサブネット範囲です。この範囲のみを使用するか、RFC 1918 サブネット範囲と組み合わせて使用できます。VPC ネイティブ クラスタの IP 範囲で説明しているように、ノード、Pod、Service は引き続きサブネット範囲を使用します。RFC 1918 以外の範囲を使用する場合、次の点に注意してください。

  • サブネット範囲(RFC 1918 以外の範囲を使用するサブネット範囲を含む)は、クラスタのノードを作成する前に手動で割り当てるか、GKE によって割り当てる必要があります。クラスタを置き換えない限り、RFC 1918 以外のサブネット範囲の使用に切り替えることも、使用を停止することもできません。

  • 内部 TCP / UDP ロードバランサは、サブネットのプライマリ IP アドレス範囲の IP アドレスのみを使用します。RFC 1918 以外のアドレスを持つ内部 TCP / UDP ロードバランサを作成するには、サブネットのプライマリ IP アドレス範囲を RFC 1918 以外のアドレスにする必要があります。

クラスタ外の宛先で、RFC 1918 以外のプライベート範囲からのトラフィックを受信できない可能性があります。たとえば、RFC 1112(クラス E)のプライベート範囲は通常、マルチキャスト アドレスとして使用されます。クラスタ外の宛先で、送信元が RFC 1918 以外のプライベート IP アドレスのパケットを処理できない場合、次の両方を実行できます。

  • サブネットのプライマリ IP アドレス範囲に RFC 1918 範囲を使用します。これにより、クラスタ内のノードは RFC 1918 アドレスを使用します。

  • クラスタで IP マスカレード エージェントが実行され、宛先が nonMasqueradeCIDRs リストに含まれていないことを確認します。これにより、Pod から送信したパケットの送信元が SNAT によりノードアドレス(RFC 1918)に変換されます。

プライベートで使用されたパブリック IP アドレス範囲を有効にする

GKE クラスタは、特定のパブリック IP アドレス範囲を内部のサブネット IP アドレス範囲としてプライベートに使用できます。パブリック IP アドレスは、VPC ネットワークのドキュメントに記載されている特定の制限付きの範囲を除いてすべてプライベートに使用できます。

プライベートで使用されるパブリック IP アドレス範囲を利用するには、クラスタが VPC ネイティブ クラスタである必要があります。ルートベース クラスタはサポートされていません。

プライベートで使用されたパブリック範囲はサブネット範囲です。個別に使用することも、プライベート アドレスを使用するその他のサブネットの範囲と併用することもできます。VPC ネイティブ クラスタの IP 範囲で説明しているように、ノード、Pod、Service は引き続きサブネット範囲を使用します。パブリック IP アドレスをプライベートで再利用するときは、次の点に注意してください。

  • パブリック IP アドレス範囲をサブネット範囲として使用すると、クラスタはそのパブリック範囲を使用するインターネット上のシステムと通信できなくなります。範囲は、クラスタの VPC ネットワークの内部 IP アドレス範囲になります。

  • サブネット範囲(パブリック IP アドレス範囲をプライベートで使用する範囲も含む)は、クラスタのノードを作成する前に、手動で割り当てるか、GKE によって割り当てる必要があります。クラスタを置き換えない限り、プライベートで使用されたパブリック IP 範囲の使用への切り替えや使用の停止はできません。

GKE のデフォルトでは、ノードにパブリック IP の宛先への SNAT が実装されます。Pod CIDR においてパブリック IP アドレス範囲がプライベートに使用されていると、SNAT ルールが Pod 間トラフィックに適用されることになります。これを回避するには、2 つの方法があります。

プライベートで使用されたパブリック範囲のあるクラスタの例

次の例では、gcloud を使用して、プライベートで再利用されたパブリック IP アドレス範囲を使用するクラスタを作成します。次のフラグを使用する必要があります。

  • --enable-ip-alias: これにより、VPC ネイティブ クラスタが作成されます。これは、パブリック IP アドレス範囲をプライベートで使用するときに必要です。

このコマンドで、次の機能を備えた VPC ネイティブの限定公開クラスタを作成します。

  • ノードは、サブネットの 10.0.0.0/24 プライマリ IP アドレス範囲を使用します。
  • Pod は、5.0.0.0/16 パブリック IP アドレス範囲を、Pod 用のサブネットのセカンダリ IP アドレス範囲としてプライベートに使用します。
  • Service は、5.1.0.0/16 パブリック IP アドレス範囲を、Service 用のサブネットのセカンダリ IP アドレス範囲として、プライベートに使用します。
gcloud container clusters create cluster-name \
  --enable-ip-alias \
  --enable-private-nodes \
  --disable-default-snat \
  --zone=zone \
  --create-subnetwork name=cluster-subnet,range=10.0.0.0/24 \
  --cluster-ipv4-cidr=5.0.0.0/16 \
  --services-ipv4-cidr=5.1.0.0/16 \
  --master-ipv4-cidr=master-CIDR

Pod と Service の範囲を確認する

VPC ネイティブ クラスタを作成すると、その Pod と Service の範囲を確認できます。

gcloud

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

gcloud container clusters describe cluster-name

コマンド出力で、ipAllocationPolicy フィールドの下を確認します。

  • clusterIpv4Cidr が、Pod のセカンダリ範囲です。
  • servicesIpv4Cidr が、Service のセカンダリ範囲です。

Console

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

  1. Cloud Console で Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタリストで、検査するクラスタの名前をクリックします。

セカンダリ範囲は [ネットワーキング] セクションに表示されます。

  • [Pod のアドレス範囲] は、Pod のセカンダリ範囲です。
  • [Service のアドレスの範囲] は、Service のセカンダリ範囲です。

トラブルシューティング

このセクションでは、VPC ネイティブ クラスタに関連する問題を解決するためのガイダンスを示します。

The resource 'projects/[PROJECT_NAME]/regions/XXX/subnetworks/default' is not ready

考えられる原因
同じサブネット上で操作が平行して行われています。たとえば、別の VPC ネイティブ クラスタが作成されている、サブネット上でセカンダリ範囲の追加または削除が行われている、などです。
解決策
コマンドを再試行してください。

Invalid value for field 'resource.secondaryIpRanges[1].ipCidrRange': 'XXX'. Invalid IPCidrRange: XXX conflicts with existing subnetwork 'default' in region 'XXX'."

考えられる原因

別の VPC ネイティブ クラスタが同時に作成されていて、同じ VPC ネットワークの同じ範囲を割り当てようとしています。

同じセカンダリ範囲が同じ VPC ネットワークのサブネットワークに追加されようとしています。

解決策

セカンダリ範囲がまだ指定されていない状態でクラスタ作成コマンドを実行して、このエラーが返された場合は、しばらくしてからクラスタの作成コマンドを再試行してください。

Pod 用の空き IP スペースが不足している

現象

クラスタが長い時間プロビジョニング状態で停止している

クラスタの作成時にマネージド インスタンス グループ(MIG)エラーが返される

新しいノードを既存のクラスタに追加できない

考えられる原因

Pod IP 範囲内の未割り当てスペースが、クラスタ内でリクエストされたノードに対して十分な大きさではありません。たとえば、クラスタの Pod IP アドレス範囲にサイズが /23(512 個のアドレス)のネットマスクがあり、ノードあたりの Pod 最大数が 110 である場合、2 個より多くのノードを作成することはできません(各ノードには、サイズが /24 のネットマスクを持つエイリアス IP 範囲が割り当てられます)。

ソリューション

連続していないマルチ Pod CIDR を使用して、Pod IP 範囲をクラスタに追加できます。

適切にサイズ調整されたプライマリとセカンダリの IP アドレス範囲を確認して計画した後、代替クラスタを作成します。VPC ネイティブ クラスタの IP 範囲IP 範囲の計画をご覧ください。

クラスタを置き換えることができない場合、ノードあたりの Pod 最大数をより少なく設定して新しいノードプールを作成することで、問題を回避できる可能性があります。可能であれば、ワークロードをそのノードプールに移行してから、以前のノードプールを削除してください。ノードあたりの Pod 最大数を減らすと、Pod の固定されたセカンダリ IP アドレス範囲でより多くのノードをサポートできるようになります。関連する計算の詳細については、Pod 用のサブネット セカンダリ IP アドレス範囲ノード制限範囲をご覧ください。

デフォルトの SNAT が無効になっているかどうか確認する

デフォルトの SNAT のステータスを確認するには、次のコマンドを使用します。

gcloud container clusters describe cluster-name

cluster-name は、使用するクラスタの名前に置き換えます。

次のように、出力に disableDefaultSnat フィールドが含まれます。

networkConfig:
  disableDefaultSnat: true
  network: ...

--enable-ip-alias なしで --disable-default-snat は使用できない

このエラー メッセージと must disable default sNAT (--disable-default-snat) before using public IP address privately in the cluster が表示された場合、限定公開クラスタでパブリック IP アドレスが使用されているため、クラスタの作成時に --disable-default-snat フラグを明示的に設定する必要があります。

cannot disable default sNAT ... などのエラー メッセージが表示された場合、クラスタでデフォルトの SNAT を無効にすることはできません。クラスタ構成を確認します。

デフォルトの SNAT を無効にして Cloud NAT をデバッグする

--disable-default-snat フラグを使用して限定公開クラスタを作成し、インターネット アクセスに Cloud NAT を設定しているときに、Pod からインターフェースに向かうトラフィックが表示されない場合は、Cloud NAT 構成に Pod の範囲が含まれていることを確認します。

Pod 間の通信に問題がある場合は、ノードの iptables ルールを調べて、Pod 範囲が iptables ルールによってマスカレードされていないことを確認します。IP マスカレードの iptables の出力例で、iptables ルールとデフォルト ルールのリストを確認してください。クラスタに IP マスカレード エージェントが構成されていない場合、GKE は Pod 間の通信が自動的にマスカレードされないようにします。IP マスカレード エージェントが構成されている場合は、デフォルトの IP マスカレード ルールがオーバーライドされます。Pod 範囲のマスカレードを無視するように、IP マスカレード エージェントで追加のルールが構成されていることを確認します。

制限事項

  • VPC ネイティブ クラスタをルートベース クラスタに変換することはできません。また、ルートベース クラスタを VPC ネイティブ クラスタに変換することもできません。
  • VPC ネイティブ クラスタには VPC ネットワークが必要です。レガシー ネットワークはサポートされていません。
  • GKE クラスタの場合と同様に、Service(ClusterIP)のアドレスはクラスタ内部にのみ公開されています。クラスタの内部ではないが、クラスタと同じ VPC ネットワークとリージョン内にある VM インスタンスから Kubernetes Service にアクセスする必要がある場合、内部 TCP / UDP ロードバランサを作成します。
  • サブネット内のすべての Pod IP アドレスを使用する場合、クラスタを不安定な状態にすることなくサブネットのセカンダリ IP アドレス範囲を置き換えることはできません。ただし、連続していないマルチ Pod CIDR を使用すると、追加の Pod IP アドレス範囲を作成できます。

次のステップ