限定公開クラスタの設定

このページでは、Google Kubernetes Engine で限定公開クラスタを作成する方法について説明します。

概要

限定公開クラスタでは、ノードRFC 1918 の内部 IP アドレスのみがあるため、ワークロードが公共のインターネットから隔離されるようになります。

各クラスタには、マスターと呼ばれる Kubernetes API サーバーがあります。マスターは、Google が所有するプロジェクトの VM 上で動作します。限定公開クラスタでは、マスターへのアクセスを制御できます。

限定公開クラスタは、クラスタノードにパブリック IP アドレスがなくても、HTTP(S) ロードバランサまたはネットワーク ロードバランサを使用して受信トラフィックを受け入れることができます。限定公開クラスタは、内部ロードバランサを使用して VPC ネットワーク内からのトラフィックを受け入れることもできます。

機能

限定公開クラスタは、次の GCP 機能を使用します。

VPC ネットワーク ピアリング
限定公開クラスタには、VPC ネットワーク ピアリングが必要です。クラスタノードがお使いの VPC ネットワークに存在する一方で、マスターは Google が所有するプロジェクト内の別の VPC ネットワークに存在します。2 つの VPC ネットワークは、VPC ネットワーク ピアリングを使用して接続されています。ノードとマスターの間のトラフィックは、すべて内部 IP アドレスを使用してルーティングされます。
限定公開の Google アクセス
プライベート ノードには外部 IP アドレスが指定されていないため、インターネットへの送信アクセスは許可されません。限定公開の Google アクセスでは、プライベート ノードとそのワークロードに対して、Google のプライベート ネットワークを介した Google Cloud Platform API およびサービスへの送信アクセスが制限されています。プライベート ノードが Google Container Registry からコンテナ イメージを pull し、Stackdriver にログを送信するといったことも、限定公開の Google アクセスによって可能になります。

要件

限定公開クラスタには次の要件があります。

VPC ネイティブ
限定公開クラスタは、エイリアス IP 範囲が有効な VPC ネイティブ クラスタである必要があります。VPC ネイティブ クラスタにはレガシー ネットワークとの互換性がありません。
Kubernetes バージョン 1.8.14-gke.0 以降
限定公開クラスタ内のノードは、Kubernetes バージョン 1.8.14-gke.0 以降が動作している必要があります。

制限事項

限定公開クラスタには次の制約があります。

  • 既存の非限定公開クラスタを限定公開クラスタに変換することはできません。
  • 172.17.0.0/16 と重複するクラスタ マスター、ノード、ポッドサービス IP の範囲は使用できません。
  • クラスタ マスターとクラスタノード間の VPC ピアリングの削除、クラスタ マスターからポート 10250 上のノードへの上りトラフィックを許可するファイアウォール ルールの削除、デフォルトのインターネット ゲートウェイへのデフォルト ルートの削除を行うと、限定公開クラスタは機能しなくなります。

制限事項

限定公開クラスタには次の制限があります。

  • 作成した各限定公開クラスタは、固有の VPC ネットワーク ピアリングを使用します。各 VPC ネットワークは、最大 25 個の他の VPC ネットワークとピアリングできます。
  • クラスタ マスターの RFC 1918 ブロックのサイズは、/28 でなければなりません。
  • GKE ではクラスタ マスターのアドレス ブロックとの重複を検出できますが、共有 VPC ネットワーク内の重複は検出できません。

リージョン クラスタの制限事項

  • 現在、プロキシを使用してプライベート IP アドレス経由でクラスタ マスターにアクセスすることはできません。

始める前に

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

  • 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

マスターへのアクセス

限定公開クラスタでは、マスターに 2 つのエンドポイントがあります

  • プライベート エンドポイント: マスターの VPC ネットワーク内の内部ロードバランサの背後にあるマスターの内部 IP アドレス。ノードはプライベート エンドポイントを使用してマスターと通信します。限定公開クラスタと同じリージョンに存在する、VPC ネットワークの VM は、プライベート エンドポイントを使用できます。

  • パブリック エンドポイント: マスターの外部 IP アドレス。パブリック エンドポイントへのアクセスは構成可能です。最も厳しく制限するケースでは、パブリック エンドポイントへのアクセスは一切許可されません。特定のアドレス範囲にパブリック エンドポイントへのアクセスを許可することで、制限を緩和できます。また、すべての制限を解除して、誰でもパブリック エンドポイントにアクセスできるようにすることもできます。

クラスタ エンドポイントの特定

クラスタ エンドポイントを特定するには、以下のコマンドを使用してクラスタ情報を取得します。

gcloud container clusters describe [CLUSTER-NAME] \
    --zone=[ZONE] | --region=[REGION] \
    --format="get(privateClusterConfig.privateEndpoint)"
gcloud container clusters describe [CLUSTER-NAME] \
    --zone=[ZONE] | --region=[REGION] \
    --format="get(privateClusterConfig.publicEndpoint)"

ここで

  • [CLUSTER-NAME] は、クラスタの名前です。
  • [ZONE] はゾーンクラスタのゾーンであり、[REGION] はリージョン クラスタのリージョンです。

クラスタ エンドポイントへのアクセス

限定公開クラスタには、クラスタ エンドポイントへのアクセスを制御するための構成の組み合わせが 3 つあります。次の表では、これら 3 つの構成について説明しています。

パブリック エンドポイント アクセスが無効 パブリック エンドポイント アクセスが有効
マスター承認済みネットワークが有効
パブリック エンドポイント アクセスが有効
マスター承認済みネットワークが無効
セキュリティ マスターへの最高レベルのアクセス制限。マスターのパブリック エンドポイントへのクライアント アクセスがブロックされます。内部 IP アドレスからマスターにアクセスする必要があります。 定義した IP アドレス(内部、外部とも)のみマスターへアクセス可能。 任意の IP アドレスからマスターへアクセス可能。
GCP Console の構成オプション

[VPC ネイティブを有効にする] を選択します。
[限定公開クラスタ] を選択します。
[外部 IP アドレスを使用したマスターへのアクセス] を選択解除します。

[マスター承認済みネットワークを有効にする] は自動的に有効になります。

[VPC ネイティブを有効にする] を選択します。
[限定公開クラスタ] を選択します。
[外部 IP アドレスを使用したマスターへのアクセス] を選択します。
[マスター承認済みネットワークを有効にする] を選択します。
[VPC ネイティブを有効にする] を選択します。
[限定公開クラスタ] を選択します。
[外部 IP アドレスを使用したマスターへのアクセス] を選択します。
[マスター承認済みネットワークを有効にする] を選択解除します。
gcloud クラスタ作成フラグ --enable-ip-alias
--enable-private-nodes
--enable-private-endpoint
--enable-master-authorized-networks
--enable-ip-alias
--enable-private-nodes
--enable-master-authorized-networks
--enable-ip-alias
--enable-private-nodes
--no-enable-master-authorized-networks
ノードとマスターの間の通信

ノードは常にプライベート エンドポイントを使用してマスターと通信します。

マスター承認済みネットワーク

ノードおよびポッド以外の内部 IP アドレスからマスターにアクセスする場合に必要です。

ノードとポッドの内部 IP アドレス範囲を明示的に承認する必要はありません。これらの内部アドレスは常にプライベート エンドポイントとの通信を許可されています。

マスターにアクセスできる追加の内部 IP アドレスを指定するには、--master-authorized-networks を使用します。パブリック エンドポイントへのアクセスが無効になっているため、マスター承認済みネットワークのリストに外部 IP アドレスを含めることはできません。

外部 IP アドレスとノードおよびポッド以外の内部 IP アドレスからマスターにアクセスする場合に必要です。

マスターにアクセスできる、外部 IP アドレスとノードおよびポッド以外の内部 IP アドレスを指定するには、--master-authorized-networks を使用します。

使用されません。

マスター承認済みネットワークを有効にせずにマスターのパブリック エンドポイントへのアクセスを有効にした場合、マスターのパブリック エンドポイントへのアクセスは制限されません。

kubectl を使用したアクセス

ノードから: 常にプライベート エンドポイントを使用します。 kubectlプライベート エンドポイントを使用するように構成する必要があります。

クラスタの VPC ネットワーク内の他の VM から: 他の VM は、クラスタと同じリージョンにあり、その内部 IP アドレスがマスター承認済みネットワークのリストに含まれている場合にのみ、kubectl を使用してプライベート エンドポイントと通信できます。

パブリック IP アドレスから: 不可。

ノードから: 常にプライベート エンドポイントを使用します。 kubectlプライベート エンドポイントを使用するように構成する必要があります。

クラスタの VPC ネットワーク内の他の VM から: 他の VM は、クラスタと同じリージョンにあり、その内部 IP アドレスがマスター承認済みネットワークのリストに含まれている場合にのみ、kubectl を使用してプライベート エンドポイントと通信できます。

パブリック IP アドレスから: パブリック IP アドレスを持つマシンは、パブリック IP アドレスがマスター承認済みネットワークのリストに含まれている場合にのみ、kubectl を使用してパブリック エンドポイントと通信できます。これには、GCP 外のマシンと外部 IP アドレスを持つ GCP VM が含まれます。

ノードから: 常にプライベート エンドポイントを使用します。 kubectlプライベート エンドポイントを使用するように構成する必要があります。

クラスタの VPC ネットワーク内の他の VM から: 他の VM は、クラスタと同じリージョンにある場合にのみ、kubectl を使用してプライベート エンドポイントと通信できます。

パブリック IP アドレスから: パブリック IP アドレスを持つマシンは、kubectl を使用してパブリック エンドポイントと通信できます。これには、GCP 外のマシンと外部 IP アドレスを持つ GCP VM が含まれます。

パブリック エンドポイントへのアクセスが制限された限定公開クラスタの作成

限定公開クラスタを作成する場合は、クラスタ マスターが使用する /28 分の RFC 1918 アドレス範囲を指定する必要があります。クラスタ マスター用に指定する範囲は、VPC ネットワーク内のサブネットワークと重複しないようにしてください。クラスタを作成した後、クラスタ マスターのアドレス範囲を変更することはできません。

自動生成されたサブネットの使用

このセクションでは、private-cluster-0 という名前の限定公開クラスタを作成します。GKE はクラスタノードのサブネットを自動的に生成します。サブネットでは、限定公開の Google アクセスが有効になっています。サブネット内で、GKE はポッド用とサービス用の 2 つのセカンダリ範囲を自動的に作成します。

gcloud

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

gcloud container clusters create private-cluster-0 \
    --create-subnetwork name=my-subnet-0 \
    --enable-master-authorized-networks \
    --enable-ip-alias \
    --enable-private-nodes \
    --master-ipv4-cidr 172.16.0.0/28 \
    --no-enable-basic-auth \
    --no-issue-client-certificate

ここで

  • --enable-master-authorized-networks は、パブリック エンドポイントへのアクセスを、承認した IP アドレス範囲に制限するよう指定します。
  • --create-subnetwork name=my-subnet-0 を指定すると、GKE は my-subnet-0 という名前のサブネットを自動的に作成します。
  • --enable-ip-alias は、クラスタを VPC ネイティブにします。
  • --enable-private-nodes は、クラスタのノードに外部 IP アドレスがないことを示します。
  • --master-ipv4-cidr 172.16.0.0/28 は、マスターの RFC 1918 範囲を指定します。この設定はこのクラスタでは永続的です。

Console

次の手順を行います。

  1. Google Cloud Platform Console の GKE メニューにアクセスします。

    GKE メニューに移動

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

  3. [標準クラスタ] テンプレートを選択するか、ワークロードに適切なテンプレートを選択します。

  4. [名前] に「my-subnet-0」と入力します。

  5. メニューの下部にある [詳細オプション] をクリックします。

  6. [VPC ネイティブ] で [VPC ネイティブを有効にする(エイリアス IP を使用)] チェックボックスをオンにします。[ネットワーク] プルダウン メニューを default のままにし、[ノードのサブネット] プルダウン メニューを default のままにします。これにより、GKE によってクラスタのサブネットが生成されます。

  7. [ネットワーク セキュリティ] で [限定公開クラスタ] チェックボックスをオンにします。

  8. 承認済み外部 IP 範囲からアクセス可能なマスターを作成するには、[外部 IP アドレスを使用したマスターへのアクセス] チェックボックスをオンのままにします。

  9. [マスター IP 範囲] を 172.16.0.0/28 に設定します。

  10. [マスター承認済みネットワークを有効にする] チェックボックスをオンにしたままにします。

  11. [Kubernetes ダッシュボードを有効にする] チェックボックスをオフにします。

  12. [クライアント証明書を発行する] チェックボックスをオフにします。

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

API

Cluster API リソースの privateClusterConfig フィールドを指定します。

{
  "name": "private-cluster-0",
  ...
  "ipAllocationPolicy": {
    "useIpAliases": true,
    "createSubnetwork": true,
  },
  ...
    "privateClusterConfig" {
      "enablePrivateNodes": boolean # Creates nodes with internal IP addresses only
      "enablePrivateEndpoint": boolean # false creates a cluster master with a publicly-reachable endpoint
      "masterIpv4CidrBlock": string # CIDR block for the cluster master
      "privateEndpoint": string # Output only
      "publicEndpoint": string # Output only
  }
}

この時点で、クラスタ マスターへのアクセス権を持つ IP アドレスは次のものに限られます。

  • my-subnet-0 のプライマリ範囲。
  • ポッドに使用されるセカンダリ範囲。

VPC ネットワークの外に、203.0.113.0/29 の範囲のアドレスを持つマシンのグループがあるとします。これらのマシンのパブリック エンドポイントへのアクセスを承認するには、次のコマンドを入力します。

gcloud container clusters update private-cluster-0 \
    --enable-master-authorized-networks \
    --master-authorized-networks 203.0.113.0/29

クラスタ マスターにアクセスできる IP アドレスは次のようになりました。

  • my-subnet-0 のプライマリ範囲。
  • ポッドに使用されるセカンダリ範囲。
  • 承認したアドレス範囲(203.0.113.0/29 など)。

カスタム サブネットの使用

このセクションでは、private-cluster-1 という名前の限定公開クラスタを作成します。ネットワーク my-net-1 を作成します。クラスタノード用に、プライマリ範囲が 192.168.0.0/20 であるサブネット my-subnet-1 を作成します。サブネットには 2 つのセカンダリ アドレス範囲があります。my-pods-1ポッド IP アドレス用、my-services-1サービス IP アドレス用です。

gcloud

ネットワークの作成

まず、クラスタ用のネットワークを作成します。次のコマンドは、ネットワーク my-net-1 を作成します。

gcloud compute networks create my-net-1 \
    --subnet-mode custom

サブネットとセカンダリ範囲の作成

次に、my-net-1 ネットワーク内にセカンダリ範囲が my-pods-1(ポッド用)と my-services-1(サービス用)であるサブネット my-subnet-1 を作成します。

gcloud compute networks subnets create my-subnet-1 \
    --network my-net-1\
    --region us-central1 \
    --range 192.168.0.0/20 \
    --secondary-range my-pods-1=10.4.0.0/14,my-services-1=10.0.32.0/20 \
    --enable-private-ip-google-access

限定公開クラスタの作成

作成したネットワーク、サブネット、セカンダリ範囲を使用して、限定公開クラスタ private-cluster-1 を作成します。

gcloud container clusters create private-cluster-1 \
    --zone us-central1-c \
    --enable-master-authorized-networks \
    --enable-ip-alias \
    --network my-net-1 \
    --subnetwork my-subnet-1 \
    --cluster-secondary-range-name my-pods-1 \
    --services-secondary-range-name my-services-1 \
    --enable-private-nodes \
    --master-ipv4-cidr 172.16.0.16/28 \
    --no-enable-basic-auth \
    --no-issue-client-certificate

Console

ネットワーク、サブネット、セカンダリ範囲の作成

  1. GCP Console の [VPC ネットワーク] ページにアクセスします。

    [VPC ネットワーク] ページに移動

  2. [VPC ネットワークを作成] をクリックします。

  3. [名前] に「my-net-1」と入力します。

  4. [サブネット作成モード] が [カスタム] に設定されていることを確認します。

  5. [新しいサブネット] の [名前] に「my-subnet-1」と入力します。

  6. [リージョン] プルダウン メニューから、目的のリージョンを選択します。

  7. [IP アドレス範囲] に「192.168.0.0/20」と入力します。

  8. [セカンダリ IP 範囲を作成する] をクリックします。[サブネット範囲の名前] に「my-services-1」と入力し、[セカンダリ IP の範囲] に「10.0.32.0/20」と入力します。

  9. [IP の範囲を追加] をクリックします。[サブネット範囲の名前] に「my-pods-1」と入力し、[セカンダリ IP の範囲] に「10.4.0.0/14」と入力します。

  10. [限定公開の Google アクセス] で [オン] をクリックします。

  11. [完了] をクリックします。

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

限定公開クラスタの作成

サブネットを使用する限定公開クラスタを作成します。

  1. GCP Console の GKE メニューに移動します。

    GKE メニューに移動

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

  3. [標準クラスタ] テンプレートを選択するか、ワークロードに適切なテンプレートを選択します。

  4. [名前] に「private-cluster-1」と入力します。

  5. メニューの下部にある [詳細オプション] をクリックします。

  6. [VPC ネイティブ] で [VPC ネイティブを有効にする(エイリアス IP を使用)] チェックボックスをオンにします。

  7. [ネットワーク] メニューから [my-net-1] を選択します。

  8. [ノードのサブネット] プルダウン メニューから [my-subnet-1] を選択します。

  9. [セカンダリ範囲を自動的に作成する] チェックボックスをオフにします。

  10. [ポッドのセカンダリ CIDR 範囲] プルダウン メニューから [my-pods-1] を選択します。

  11. [サービスのセカンダリ CIDR 範囲] プルダウン メニューから [my-services-1] を選択します。

  12. [ネットワーク セキュリティ] で [限定公開クラスタ] チェックボックスをオンにします。

  13. [マスター IP 範囲] を 172.16.0.16/28 に設定します。

  14. [マスター承認済みネットワークを有効にする] チェックボックスをオンにしたままにします。

  15. [Kubernetes ダッシュボードを有効にする] チェックボックスをオフにします。

  16. [クライアント証明書を発行する] チェックボックスをオフにします。

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

この時点で、クラスタ マスターへのアクセス権を持つ IP アドレスは次のものに限られます。

  • my-subnet-1 のプライマリ範囲。
  • セカンダリ範囲 my-pods-1

my-net-1 の外に、203.0.113.0/29 の範囲のアドレスを持つマシンのグループがあるとします。これらのマシンのパブリック エンドポイントへのアクセスを承認するには、次のコマンドを入力します。

gcloud container clusters update private-cluster-1 \
    --enable-master-authorized-networks \
    --master-authorized-networks 203.0.113.0/29

この時点で、クラスタ マスターへのアクセス権を持つ IP アドレスは次のものに限られます。

  • my-subnet-1 のプライマリ範囲。
  • セカンダリ範囲 my-pods-1
  • 承認したアドレス範囲(203.0.113.0/29 など)。

Cloud Shell を使用した限定公開クラスタへのアクセス

前の演習で作成した限定公開クラスタ private-cluster-1 にはパブリック エンドポイントがあり、マスター承認済みネットワークが有効になっています。Cloud Shell を使用してクラスタにアクセスする場合は、Cloud Shell のパブリック IP アドレスをクラスタのマスター承認済みネットワークのリストに追加する必要があります。

Cloud Shell のコマンドライン ウィンドウで、dig を使用して Cloud Shell の外部 IP アドレスを見つけます。

dig +short myip.opendns.com @resolver1.opendns.com

Cloud Shell の外部アドレスをクラスタのマスター承認済みネットワークのリストに追加します。

gcloud container clusters update private-cluster-1 \
    --zone us-central1-c \
    --enable-master-authorized-networks \
    --master-authorized-networks [EXISTING_AUTH_NETS],[SHELL_IP]/32

ここで

  • [EXISTING_AUTH_NETS] は、既存のマスター承認済みネットワークのリストです。
  • [SHELL_IP] は Cloud Shell の外部 IP アドレスです。

kubectl を使用してクラスタにアクセスできるように認証情報を取得します。

gcloud container clusters get-credentials private-cluster-1 \
    --zone us-central1-a \
    --project [PROJECT_ID]

ここで、[PROJECT_ID] はプロジェクト ID です。

これで、Cloud Shell で kubectl を使用して限定公開クラスタにアクセスできます。次に例を示します。

kubectl get nodes

パブリック エンドポイントへのクライアント アクセス権のない限定公開クラスタの作成

このセクションでは、プライベート ノードを持ち、パブリック エンドポイントへのアクセス権のない限定公開クラスタを作成します。クラスタ マスターには、VPC ネットワーク内からのみアクセスできます。VPC ネットワークの外部からマスターにアクセスすることはできません。

gcloud

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

gcloud container clusters create private-cluster-2 \
    --create-subnetwork name=my-subnet-2 \
    --enable-master-authorized-networks \
    --enable-ip-alias \
    --enable-private-nodes \
    --enable-private-endpoint \
    --master-ipv4-cidr 172.16.0.32/28 \
    --no-enable-basic-auth \
    --no-issue-client-certificate

ここで

  • --enable-master-authorized-networks は、パブリック エンドポイントへのアクセスを、承認した IP アドレス範囲に制限するよう指定します。
  • --create-subnetwork name=my-subnet-2 を指定すると、GKE は my-subnet-2 という名前のサブネットを自動的に作成します。
  • --enable-ip-alias は、クラスタを VPC ネイティブにします。
  • --enable-private-nodes は、クラスタのノードに外部 IP アドレスがないことを示します。
  • --master-ipv4-cidr 172.16.0.32/28 は、マスターの RFC 1918 範囲を指定します。この設定はこのクラスタでは永続的です。

Console

次の手順を行います。

  1. Google Cloud Platform Console の GKE メニューにアクセスします。

    GKE メニューに移動

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

  3. [標準クラスタ] テンプレートを選択するか、ワークロードに適切なテンプレートを選択します。

  4. [名前] に「my-subnet-2」と入力します。

  5. メニューの下部にある [詳細オプション] をクリックします。

  6. [VPC ネイティブ] で [VPC ネイティブを有効にする(エイリアス IP を使用)] チェックボックスをオンにします。[ネットワーク] プルダウン メニューを default のままにし、[ノードのサブネット] プルダウン メニューを default のままにします。これにより、GKE によってクラスタのサブネットが生成されます。

  7. [ネットワーク セキュリティ] で [限定公開クラスタ] チェックボックスをオンにします。

  8. [外部 IP アドレスを使用したマスターへのアクセス] チェックボックスをオフにします。マスター承認済みが有効になっていることに注意してください。

  9. [マスター IP 範囲] を 172.16.0.32/28 に設定します。

  10. [マスター承認済みネットワークを有効にする] チェックボックスが自動的にオンになります。

  11. [Kubernetes ダッシュボードを有効にする] チェックボックスをオフにします。

  12. [クライアント証明書を発行する] チェックボックスをオフにします。

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

API

公開アクセス可能なマスターを持つクラスタを作成するには、privateClusterConfig リソースで enablePrivateEndpoint: true フィールドを指定します。

この時点で、クラスタ マスターへのアクセス権を持つ IP アドレスは次のものに限られます。

  • my-subnet-2 のプライマリ範囲。
  • ポッドに使用されるセカンダリ範囲。

たとえば、my-subnet-2 プライマリ範囲で VM を作成したとします。その VM でマスターの内部 IP アドレスを使用するように kubectl を構成できます。

my-subnet-2 の外部からクラスタ マスターにアクセスする場合は、プライベート エンドポイントにアクセスするために少なくとも 1 つのアドレス範囲を承認する必要があります。

デフォルトのネットワークにあり、クラスタと同じリージョンにあるものの、my-subnet-2 にはない VM があるとします。

例:

  • my-subnet-2: 10.0.0.0/22
  • ポッドのセカンダリ範囲: 10.52.0.0/14
  • VM アドレス: 10.128.0.3

VM のマスターへのアクセスを承認するには、次のコマンドを使用します。

gcloud container clusters update private-cluster-2 \
    --enable-master-authorized-networks \
    --master-authorized-networks 10.128.0.3/32

共有 VPC ネットワーク内での限定公開クラスタの作成

共有 VPC ネットワーク内で限定公開クラスタを作成する方法については、共有 VPC のドキュメントをご覧ください。

VPC Service Controls による限定公開クラスタの保護

VPC Service Controls を使用して GKE 限定公開クラスタの保護を強化します。

VPC Service Controls は GKE 限定公開クラスタ向けの追加のセキュリティ機能を提供して、データ漏洩のリスクを低減します。VPC Service Controls の活用により、境界の外部から発生するリクエストからリソースとサービスを保護するサービス境界にプロジェクトを追加できます。

サービス境界の詳細については、VPC Service Controls のドキュメントのサービス境界の構成のページをご覧ください。

Container Registry と GKE 限定公開クラスタを併用する場合、VPC Service Controls とこの限定公開クラスタを併用するための追加の手順を実行する必要があります。詳細については、GKE 限定公開クラスタの Container Registry の設定ページをご覧ください。

マスター承認済みネットワークに関する注意事項

承認済みネットワークには次のような制限があります。

  • 1 つのプロジェクトに追加できる承認済みネットワーク(ホワイトリストに登録された CIDR ブロック)は最大 20 個です。

詳しくは、承認済みネットワークを既存のクラスタに追加するをご覧ください。

ノードに外部 IP が指定されていないことの確認

限定公開クラスタを作成したら、クラスタのノードに外部 IP アドレスが指定されていないことを確認する必要があります。

gcloud

クラスタのノードに外部 IP アドレスが指定されていないことを確認するには、次のコマンドを実行します。

kubectl get nodes --output wide

出力の EXTERNAL-IP 列が空になっています。

STATUS ... VERSION   EXTERNAL-IP  OS-IMAGE ...
Ready      v.8.7-gke.1                 Container-Optimized OS from Google
Ready      v1.8.7-gke.1                Container-Optimized OS from Google
Ready      v1.8.7-gke.1                Container-Optimized OS from Google

Console

クラスタのノードに外部 IP アドレスが指定されていないことを確認するには、次の手順を行います。

  1. GCP Console の GKE メニューに移動します。

    GKE メニューに移動

  2. クラスタのリストで、目的のクラスタをクリックします。

  3. [ノードプール] で、インスタンス グループの名前をクリックします。たとえば、gke-private-cluster-0-default-pool-5c5add1f-grp などです。

  4. インスタンスのリストで、インスタンスに外部 IP アドレスが指定されていないことを確認します。

クラスタのサブネットとセカンダリ アドレス範囲の表示

クラスタの作成後に、ユーザーまたは GKE によってクラスタに指定されたサブネットとセカンダリ アドレス範囲を表示できます。

gcloud

すべてのサブネットの一覧表示

クラスタのネットワークのサブネットを一覧表示するには、次のコマンドを実行します。

gcloud compute networks subnets list --network [NETWORK]

ここで、[NETWORK] は限定公開クラスタのネットワークです。自動的に作成されたサブネットでクラスタを作成した場合は、default を使用します。

コマンド出力で、クラスタのサブネットの名前を見つけます。

クラスタのサブネットの表示

自動的に作成されたサブネットについての情報を取得します。

gcloud compute networks subnets describe [SUBNET_NAME]

ここで、[SUBNET_NAME] はサブネットの名前です。

出力には、ノード用のプライマリ アドレス範囲(最初の ipCidrRange フィールド)とポッドとサービス用のセカンダリ範囲(secondaryIpRanges の下)が表示されます。

...
ipCidrRange: 10.0.0.0/22
kind: compute#subnetwork
name: gke-private-cluster-1-subnet-163e3c97
...
privateIpGoogleAccess: true
...
secondaryIpRanges:
- ipCidrRange: 10.40.0.0/14
  rangeName: gke-private-cluster-1-pods-163e3c97
- ipCidrRange: 10.0.16.0/20
  rangeName: gke-private-cluster-1-services-163e3c97
...

Console

  1. GCP Console の [VPC ネットワーク] ページに移動します。

    [VPC ネットワーク] ページに移動

  2. サブネットの名前をクリックします。たとえば、gke-private-cluster-0-subnet-163e3c97 などです。

  3. [IP アドレス範囲] で、サブネットのプライマリ アドレス範囲を確認できます。これはノードに使用される範囲です。

  4. [セカンダリ IP 範囲] で、ポッドのアドレス範囲とサービスのアドレス範囲を確認できます。

限定公開クラスタのエンドポイントの表示

gcloud コマンドライン ツールまたは GCP Console を使用して、限定公開クラスタのエンドポイントを表示できます。

gcloud

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

gcloud container clusters describe [CLUSTER_NAME]

出力には、プライベート エンドポイントとパブリック エンドポイントの両方が表示されます。

...
privateClusterConfig:
enablePrivateEndpoint: true
enablePrivateNodes: true
masterIpv4CidrBlock: 172.16.0.32/28
privateEndpoint: 172.16.0.34
publicEndpoint: 35.239.154.67

Console

次の手順を行います。

  1. GCP Console の GKE メニューに移動します。

    GKE メニューに移動

  2. リストで、目的のクラスタをクリックします。

  3. [詳細] タブの [クラスタ] で、[エンドポイント] フィールドを探します。

イメージ レジストリからコンテナ イメージを pull する

限定公開クラスタでは、コンテナ ランタイムはコンテナ イメージを Container Registry から pull できますが、インターネット上の他のコンテナ イメージ レジストリからイメージを pull することはできません。これは、限定公開クラスタ内のノードには外部 IP アドレスが指定されておらず、デフォルトでは Google ネットワーク外のサービスと通信できないためです。

限定公開クラスタ内のノードが、限定公開の Google アクセスが有効になっているサブネット上にある場合、Container Registry などの Google サービスと通信できます。

次のコマンドは、Google が所有する Container Registry リポジトリからサンプル イメージを pull する Deployment を作成します。

kubectl run hello-deployment --image gcr.io/google-samples/hello-app:2.0

その他の限定公開クラスタ構成

前述の構成に加えて、次の構成で限定公開クラスタを実行できます。

プライベート ノードにインターネットへの送信アクセスを許可する

プライベート ノードには外部 IP アドレスが指定されていないため、インターネットへの送信アクセスは許可されません。プライベート ノードにインターネットへの送信アクセスを提供する場合は、Cloud NAT を使用するか、独自の NAT ゲートウェイを管理します。

マスター用のネットワーク プロキシを使用した限定公開クラスタの実行

ネットワーク プロキシを使用した限定公開クラスタを作成することで、ネットワーク外部からのクラスタ マスターへのアクセスを、プライベート IP 空間で作成してホストしているプロキシ経由に限定することができます。

詳細については、外部アクセス用のネットワーク プロキシを使用した Kubernetes Engine 限定公開クラスタの作成をご覧ください。

特定のユースケースに対するファイアウォール ルールの追加

デフォルトでは、ファイアウォール ルールによって、クラスタ マスターがポート 443(HTTPS)および 10250(kubelet)のみでノードへの TCP 接続を開始するように制限されます。一部の Kubernetes 機能では、その他のポートへのアクセスを許可するためにファイアウォール ルールを追加する必要があります。たとえば、Kubernetes 1.9 以前では、kubectl topheapster にアクセスしますが、これにはポート 8080 での TCP 接続を許可するファイアウォール ルールが必要です。このようなアクセスを許可するには、ファイアウォール ルールを追加します。

以降のセクションでは、限定公開クラスタにファイアウォール ルールを追加する方法について説明します。

クラスタ マスターの CIDR ブロックの表示

ファイアウォール ルールを追加するには、クラスタ マスターの CIDR ブロックが必要です。

gcloud

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

gcloud container clusters describe [CLUSTER_NAME]

コマンド出力で、masterIpv4CidrBlock フィールドの値をメモしておきます。

Console

  1. GCP Console の GKE メニューに移動します。

    GKE メニューに移動

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

[詳細] タブの [クラスタ] で、[マスター アドレスの範囲] フィールドの値をメモしておきます。

既存のファイアウォール ルールの表示

クラスタの既存のファイアウォール ルールが使用するターゲット(この場合は宛先ノード)を指定する必要があります。

gcloud

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

gcloud compute firewall-rules list \
    --filter 'name~^gke-[CLUSTER_NAME]' \
    --format 'table(
        name,
        network,
        direction,
        sourceRanges.list():label=SRC_RANGES,
        allowed[].map().firewall_rule().list():label=ALLOW,
        targetTags.list():label=TARGET_TAGS
    )'

コマンド出力で、[ターゲット] フィールドの値をメモしておきます。

Console

次の手順を行います。

  1. GCP Console の [ファイアウォール ルール] メニューに移動します。

    [ファイアウォール ルール] メニューに移動

  2. [リソースをフィルタします] ボックスに「gke-[CLUSTER_NAME]」と入力します。

結果として出力される [ターゲット] フィールドの値をメモしておきます。

ファイアウォール ルールの追加

gcloud

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

gcloud compute firewall-rules create [FIREWALL_RULE_NAME] \
    --action ALLOW \
    --direction INGRESS \
    --source-ranges [MASTER_CIDR_BLOCK] \
    --rules [PROTOCOL]:[PORT] \
    --target-tags [TARGET]

ここで

  • [FIREWALL_RULE_NAME] は、ファイアウォール ルールに付ける名前です。
  • [MASTER_CIDR_BLOCK] は、以前に収集したクラスタ マスターの CIDR ブロックです。
  • [PROTOCOL]:[PORT] は、目的のポートとそのプロトコル tcp または udp です。
  • [TARGET] は、以前に収集したターゲット値です。

Console

次の手順を行います。

  1. GCP Console の [ファイアウォール ルール] メニューに移動します。

    [ファイアウォール ルール] メニューに移動

  2. [ファイアウォール ルールを作成] をクリックします。

  3. [名前] ボックスに、ファイアウォール ルールに付ける名前を入力します。

  4. [ネットワーク] プルダウン メニューから、関連するネットワークを選択します。

  5. [トラフィックの方向] で [上り] をオンにします。

  6. [一致したときのアクション] で [許可] をオンにします。

  7. [ターゲット] プルダウン メニューから [指定されたターゲットタグ] を選択します。

  8. [ターゲットタグ] ボックスに、以前に収集したターゲット値を入力します。

  9. [ソースフィルタ] プルダウン メニューから [IP 範囲] を選択します。

  10. [ソース IP の範囲] ボックスに、以前に収集したクラスタ マスターの CIDR ブロックを入力します。

  11. [プロトコルとポート] で [指定したプロトコルとポート] をオンにし、関連するプロトコル(TCP または UDP)のボックスをオンにして、そのボックスに目的のポートを入力します。

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

クリーンアップ

このページのタスクを完了したら、アカウントで不要な請求が発生しないように、以下の手順でリソースを削除します。

クラスタを削除する

gcloud

gcloud container clusters delete -q private-cluster-0 private-cluster-1

Console

  1. GCP Console の GKE メニューに移動します。

    GKE メニューに移動

  2. 各クラスタを選択します。

  3. [削除] をクリックします。

ネットワークを削除する

gcloud

gcloud compute networks delete net-0

Console

  1. GCP Console の [VPC ネットワーク] ページに移動します。

    [VPC ネットワーク] ページに移動

  2. ネットワークのリストの [net-0] で、ゴミ箱アイコンをクリックします。

  3. 各サブネットの横にあるゴミ箱アイコンをクリックします。

トラブルシューティング

以降のセクションでは、限定公開クラスタに関連する一般的な問題を解決する方法について説明します。

クラスタがアクティブピアと重複している

現象
限定公開クラスタを作成しようとすると、Google Compute Engine: An IP range in the peer network overlaps with an IP range in an active peer of the local network. のようなエラーが返されます。
考えられる原因
選択したマスター CIDR が重複しています。
解決策
クラスタを削除して、別のマスター CIDR を使用して再作成します。

マスターに到達できない

現象
限定公開クラスタを作成した後、クラスタに対して kubectl コマンドを実行しようとすると、Unable to connect to the server: dial tcp [IP_ADDRESS]: connect: connection timed outUnable to connect to the server: dial tcp [IP_ADDRESS]: i/o timeout のようなエラーが返されます。
考えられる原因
kubectl がクラスタ マスターと通信できません。
解決策
ネットワークの IP アドレスをホワイトリストに登録するには、クラスタに承認済みネットワークを追加する必要があります。

フラグが設定されていないためクラスタを作成できない

現象
gcloud container clusters create が、Cannot specify --enable-private-endpoint without --enable-private-nodes. のようなエラーを返します。
考えられる原因
必要なフラグが指定されていません。
解決策
必要なフラグを指定してください。プライベート ノードを有効にしないと、クラスタ マスターのプライベート エンドポイントを有効にできません。

マスター IPv4 CIDR ブロックが重複しているためクラスタを作成できない

現象
gcloud container clusters create が、The given master_ipv4_cidr 10.128.0.0/28 overlaps with an existing network 10.128.0.0/20. のようなエラーを返します。
考えられる原因
指定したマスター CIDR ブロックが VPC 内の既存のサブネットと重複しています。
解決策
既存のサブネットと重複しない --master-ipv4-cidr の CIDR ブロックを指定します。

サブネットを作成できない

現象
自動サブネットを持つ限定公開クラスタを作成しようとしたり、カスタム サブネットを作成しようとしたりすると、次のエラーが発生することがあります。 An IP range in the peer network overlaps with an IP range in one of the active peers of the local network.
考えられる原因
指定したマスター CIDR 範囲が、クラスタ内の別の IP 範囲と重複しています。これは、最近限定公開クラスタを削除して、同じマスター CIDR を使用して新しい限定公開クラスタを作成しようとする場合にも発生します。
解決策
別の CIDR 範囲を使用してみてください。

公開 Docker Hub からイメージを pull できない

現象
クラスタで実行中のポッドが kubectl describe に次のような警告を表示します。Failed to pull image: rpc error: code = Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
考えられる原因
限定公開クラスタ内のノードには、公共のインターネットへの送信アクセスが許可されていません。Container Registry を含む Google API やサービスへのアクセスが制限されています。
解決策
限定公開クラスタで Docker Hub のイメージを使用するには、Container Registry の Docker Hub ミラーからイメージをフェッチするように Docker デーモンを構成します。Docker Hub から直接ではなく、ミラーからイメージをフェッチするようになります。

次のステップ

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

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

Kubernetes Engine のドキュメント