限定公開クラスタの作成

このページでは、Google Kubernetes Engine(GKE)で限定公開クラスタを作成する方法について説明します。限定公開クラスタでは、ノードRFC 1918 の内部 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
  • マスターへのアクセス

    限定公開クラスタには、マスターにプライベート エンドポイントとパブリック エンドポイントがあります。クラスタ エンドポイントへのアクセスを制御するための構成の組み合わせが 3 つあります。

    • パブリック エンドポイント アクセスが無効。パブリック エンドポイントへのクライアント アクセス権のない限定公開クラスタが作成されます。
    • パブリック エンドポイント アクセスが有効、マスター認証済みネットワークが有効。パブリック エンドポイントへのアクセスが制限された限定公開クラスタが作成されます。
    • パブリック エンドポイント アクセスが有効、マスター認証済みネットワークが無効。パブリック エンドポイントに無制限にアクセスできる限定公開クラスタが作成されます。

    上記の構成オプションの違いの概要については、「クラスタ エンドポイントへのアクセス」をご覧ください。

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

    このセクションでは、プライベート ノードを持ち、パブリック エンドポイントへのアクセス権のない限定公開クラスタを作成します。

    gcloud

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

    gcloud container clusters create private-cluster-0 \
        --create-subnetwork name=my-subnet-0 \
        --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-0 を指定すると、GKE によって my-subnet-0 という名前のサブネットが自動的に作成されます。
    • --enable-ip-alias を指定すると、クラスタが VPC ネイティブになります。
    • --enable-private-nodes は、クラスタのノードに外部 IP アドレスがないことを示します。
    • --master-ipv4-cidr 172.16.0.32/28 は、マスターの RFC 1918 範囲を指定します。この設定はこのクラスタでは永続的です。

    Console

    次の手順を行います。

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

      GKE メニューに移動

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

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

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

    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-0 のプライマリ範囲。
    • ポッドに使用されるセカンダリ範囲。

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

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

    デフォルト ネットワーク内の VM が、クラスタと同じリージョンで my-subnet-0 とは別のサブネットにあるとします。

    例:

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

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

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

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

    この構成を使用してプライベート クラスタを作成すると、自動生成されたサブネットまたはカスタム サブネットを使用できます。

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

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

    gcloud

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

    gcloud container clusters create private-cluster-1 \
        --create-subnetwork name=my-subnet-1 \
        --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-1 を指定すると、GKE によって my-subnet-1 という名前のサブネットが自動的に作成されます。
    • --enable-ip-alias を指定すると、クラスタが VPC ネイティブになります。
    • --enable-private-nodes は、クラスタのノードに外部 IP アドレスがないことを示します。
    • --master-ipv4-cidr 172.16.0.0/28 は、マスターの RFC 1918 範囲を指定します。この設定はこのクラスタでは永続的です。

    Console

    次の手順を行います。

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

      GKE メニューに移動

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

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

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

    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-1",
      ...
      "ipAllocationPolicy": {
        "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-1 のプライマリ範囲。
    • ポッドに使用されるセカンダリ範囲。

    VPC ネットワークの外に、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 のプライマリ範囲。
    • ポッドに使用されるセカンダリ範囲。
    • 承認したアドレス範囲(203.0.113.0/29 など)。

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

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

    gcloud

    ネットワークの作成

    まず、クラスタ用のネットワークを作成します。次のコマンドによって、ネットワーク my-net-0 が作成されます。

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

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

    次に、ポッドのセカンダリ範囲を my-pods-2、サービスのセカンダリ範囲を my-services-2 に設定して、my-net-0 ネットワークに my-subnet-2 サブネットを作成します。

    gcloud compute networks subnets create my-subnet-2 \
        --network my-net-0\
        --region us-central1 \
        --range 192.168.0.0/20 \
        --secondary-range my-pods-2=10.4.0.0/14,my-services-2=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 \
        --network my-net-0 \
        --subnetwork my-subnet-2 \
        --cluster-secondary-range-name my-pods-2 \
        --services-secondary-range-name my-services-2 \
        --enable-private-nodes \
        --enable-ip-alias \
        --master-ipv4-cidr 172.16.0.16/28 \
        --no-enable-basic-auth \
        --no-issue-client-certificate
    

    Console

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

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

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

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

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

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

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

    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. Cloud Console の GKE メニューに移動します。

      GKE メニューに移動

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

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

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

    5. メニューの下部にある [可用性、ネットワーキング、セキュリティ、その他の機能] をクリックします。

    6. VPC ネイティブの場合は、[VPC ネイティブを有効にする(エイリアス IP を使用)] を選択したままにします。

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

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

    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-2 のプライマリ範囲。
    • セカンダリ範囲 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-2 のプライマリ範囲。
    • セカンダリ範囲 my-pods-1
    • 承認したアドレス範囲(203.0.113.0/29 など)。

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

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

    方法は次のとおりです。

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

      dig +short myip.opendns.com @resolver1.opendns.com
      
    2. 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] は、既存のマスター承認済みネットワークのリストです。コンソールで次のコマンドを実行すると、マスター認証ネットワークを確認できます。gcloud container clusters describe private-cluster-1 --format "flattened(masterAuthorizedNetworksConfig.cidrBlocks[])"
      • [SHELL_IP] は、Cloud Shell の外部 IP アドレスです。
    3. 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
    

    パブリック エンドポイントへ無制限にアクセス可能な限定公開クラスタの作成

    このセクションでは、任意の IP アドレスでマスターにアクセスできる限定公開クラスタを作成します。

    gcloud

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

    gcloud container clusters create private-cluster-2 \
        --create-subnetwork name=my-subnet-3 \
        --no-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-3 を指定すると、GKE によって my-subnet-3 という名前のサブネットが自動的に作成されます。
    • --enable-ip-alias を指定すると、クラスタが VPC ネイティブになります。
    • --enable-private-nodes は、クラスタのノードに外部 IP アドレスがないことを示します。
    • --master-ipv4-cidr 172.16.0.32/28 は、マスターの RFC 1918 範囲を指定します。この設定はこのクラスタでは永続的です。

    Console

    次の手順を行います。

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

      GKE メニューに移動

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

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

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

    5. メニューの下部にある [可用性、ネットワーキング、セキュリティ、その他の機能] をクリックします。

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

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

    8. [外部 IP アドレスを使用したマスターへのアクセス] チェックボックスをオフにします。

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

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

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

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

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

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

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

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

    プライベート ノードにインターネットへの送信アクセスを提供するには、Cloud NAT を使用するか、独自の NAT ゲートウェイを管理します。

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

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

    オンプレミスまたはクラスタ VPC とクラスタ マスターの間のルーティング

    GKE 限定公開クラスタを作成してマスター エンドポイントを限定公開した場合、そのクラスタのマスターは公共のインターネットからアクセスできませんが、クライアント側の kubectl などのツールからアクセスできるようにする必要が生じます。クラスタ マスターとオンプレミス ネットワークの間のトラフィックを有効にするには、オンプレミス ネットワークと、クラスタ マスターをホストする Google 所有の VPC ネットワーク間のルートが必要です。

    Google VPC は、Cloud VPN または Cloud Interconnect を使用してオンプレミス ネットワークに接続されているお客様の VPC に、マスター CIDR へのルートを自動的にエクスポートします。ただし、オンプレミス環境へのルートをお客様の VPC から Google VPC にエクスポートする必要もあります。

    ルートを共有するには、お客様の VPC と Google 所有の VPC との間のピアリングで --export-custom-routes フラグを有効にします。

    1. お客様のクラスタの VPC と Google 所有の VPC の間のピアリングを特定します。

      gcloud beta container clusters describe [CLUSTER-NAME]
      

      このコマンドの出力には、クラスタの privateClusterConfig.peeringName フィールドが含まれます。これがお客様のクラスタと Google 所有の VPC の間のピアリングの名前になります。例:

      privateClusterConfig:
      enablePrivateNodes: true
      masterIpv4CidrBlock: 172.16.1.0/28
      peeringName: gke-1921aee31283146cdde5-9bae-9cf1-peer
      privateEndpoint: 172.16.1.2
      publicEndpoint: 34.68.128.12
      
    2. ピアリングで --export-custom-routes を有効にします。

      gcloud beta compute networks peerings update [PEERING] --network [NETWORK] \
         --export-custom-routes
      

      ここで、[PEERING] は前のステップで特定された privateClusterConfig.peeringName の値、[NETWORK] はお客様の VPC の名前です。

      このフラグにより、[NETWORK] は、クラスタ マスターが配置されている Google 所有の VPC へのルートをアドバタイズします。次の手順では、お客様の VPC から Google 所有の VPC へのルートを、オンプレミス環境にアドバタイズする方法を説明します。

    3. 省略可: 双方向の接続を有効にするには、クラスタ マスターの CIDR へのルートも、お客様の VPC からオンプレミス環境にアドバタイズする必要があります。作成する方法は次の 2 つです。

      • おすすめの手法: Cloud Router から eBGP 経由で、マスター サブネットへのルートをカスタムルートとしてアドバタイズします。詳細は、カスタム IP 範囲のアドバタイズをご覧ください。この方法をおすすめする理由は、eBGP が利用できない場合にはアドバタイズしたルートが取り消され、トラフィックのブラックホール機能を助けることができるからです。

      • オンプレミス ルーターまたはエッジデバイス上で、Google Cloud に向かう静的ルートをプロビジョニングします。

    カスタムルートのエクスポートが有効になっていることを確認する

    お客様の VPC と Google 所有の VPC の間のピアリングで --export-custom-routes オプションが有効になっていることを確認するには、次のコマンドを使用します。

    gcloud beta compute networks peerings list
    

    このコマンドの出力では、Compute Engine ネットワークのピアリングが一覧表示されます。ピアリング(上記手順のステップ 1 で確認した名前)を見つけて、EXPORT_CUSTOM_ROUTES 列が TrueSTATE 列が ACTIVE になっていることを確認します。

    カスタムルートのエクスポートを無効にする

    VPC からカスタムルートのエクスポートを無効にするには:

    gcloud beta compute networks peerings update [PEERING] --network [NETWORK] --no-export-custom-routes
    

    ここで [PEERING]privateClusterConfig.peeringName の値、[NETWORK] はお客様の VPC の名前です。peeringName を確認するには、カスタムルートのエクスポートを有効にする手順の最初のステップをご覧ください。

    ノードに外部 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. Cloud 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. Cloud Console の [VPC ネットワーク] ページにアクセスします。

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

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

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

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

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

    限定公開クラスタのエンドポイントの表示には、gcloud コマンドライン ツールまたは Cloud 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. Cloud 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
    

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

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

    ファイアウォール ルールを追加すると、クラスタ マスターから次のポートへのトラフィックが許可されます。

    • 各ノードの指定ポート(hostPort)。
    • これらのノードで実行されている各ポッドの指定ポート。
    • こうしたノードで実行されている各サービスの指定ポート。

    ファイアウォール ルールの詳細は、Cloud Load Balancing ドキュメントのファイアウォール ルールをご覧ください。

    ファイアウォール ルールを限定公開クラスタに追加するには、使用するクラスタ マスターの CIDR ブロックとターゲットを記録する必要があります。記録したらルールを作成します。

    手順 1. クラスタ マスターの CIDR ブロックの表示

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

    gcloud

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

    gcloud container clusters describe [CLUSTER_NAME]
    

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

    Console

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

      GKE メニューに移動

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

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

    手順 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. Cloud Console の [ファイアウォール ルール] メニューに移動します。

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

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

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

    手順 3. ファイアウォール ルールの追加

    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. Cloud Console の [ファイアウォール ルール] メニューに移動します。

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

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

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

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

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

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

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

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

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

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

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

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

    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 の設定ページをご覧ください。

    クリーンアップ

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

    クラスタを削除する

    gcloud

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

    Console

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

      GKE メニューに移動

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

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

    ネットワークを削除する

    gcloud

    gcloud compute networks delete net-0

    Console

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

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

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

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

    要件、制約、制限

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

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

    • 既存の非限定公開クラスタを限定公開クラスタに変換することはできません。
    • 1.14.4 よりも前のバージョンのクラスタが稼働している場合は、172.17.0.0/16 と重複するクラスタ マスター、ノード、ポッドサービスの IP 範囲を使用できません。
    • クラスタ マスターとクラスタノード間の VPC ピアリングの削除、クラスタ マスターからポート 10250 上のノードへの上りトラフィックを許可するファイアウォール ルールの削除、デフォルトのインターネット ゲートウェイへのデフォルト ルートの削除を行うと、限定公開クラスタは機能しなくなります。デフォルト ルートの削除後に限定公開クラスタを再び起動するには、制限された VIP を静的にプロビジョニングする必要があります。
    • 1 つのプロジェクトに追加できる承認済みネットワーク(ホワイトリストに登録された CIDR ブロック)は最大 50 個です。詳しくは、承認済みネットワークを既存のクラスタに追加するをご覧ください。

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

    • 作成した各限定公開クラスタは、固有の VPC ネットワーク ピアリングを使用します。各 VPC ネットワークは、最大 25 個の他の VPC ネットワークとピアリングできます。
    • クラスタ マスターの RFC 1918 ブロックのサイズは、/28 でなければなりません。
    • GKE ではクラスタ マスターのアドレス ブロックとの重複を検出できますが、共有 VPC ネットワーク内の重複は検出できません。
    • 限定公開クラスタ内のノードには公共インターネットへのアウトバウンド アクセスがありません。Google API やサービスへのアクセスが制限されています。
    • リージョン クラスタ内のマスターのプライベート IP アドレスは、同じリージョン内のサブネットワークまたは同じリージョンに接続されているオンプレミス環境からのみアクセスできます。

    トラブルシューティング

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

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

    現象
    限定公開クラスタを作成しようとすると、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 でホストされているイメージを使用します。Container Registry の Docker Hub ミラーは限定公開クラスタからアクセスできますが、完全に信頼できるアクセスではありません。ミラーはキャッシュにすぎないため、イメージは定期的に削除され、限定公開クラスタは Docker Hub にフォールバックできません。

    次のステップ