Cloud Build プライベート プールを使用した限定公開 Google Kubernetes Engine クラスタへのアクセス


このチュートリアルでは、Cloud Build プライベート プールを使用して限定公開 Google Kubernetes Engine(GKE)クラスタにアクセスする方法について説明します。このアクセス権により、Cloud Build を使用して限定公開 GKE クラスタにアプリケーションをデプロイできるようになります。このチュートリアルは、ネットワーク管理者を対象としています。また、Cloud Build のプライベート プールがピアリングした Virtual Private Cloud(VPC)ネットワークで実行されているサービスと通信するすべての状況を対象としています。たとえば、プライベート プールのワーカーは、次のサービスと通信できます。

  • 限定公開 GKE クラスタ
  • Cloud SQL データベース
  • Memorystore インスタンス
  • VPC ネットワーク(Cloud Build のプライベート プールとピアリングされているものとは異なる)で動作する Compute Engine インスタンス

Cloud Build のプライベート プールと GKE クラスタ コントロール プレーンは、どちらも Google が所有する VPC ネットワークで実行されます。これらの VPC ネットワークは、Google Cloud 上の独自の VPC ネットワークにピアリングされます。ただし、VPC ネットワーク ピアリングでは推移的なピアリングがサポートされていないため、Cloud Build のプライベート プールを使用する場合は制限となる可能性があります。このチュートリアルでは、Cloud VPN を使用して、Cloud Build プライベート プールのワーカーが限定公開 GKE クラスタのコントロール プレーンにアクセスできるようにするソリューションを紹介します。

このチュートリアルでは、Google Kubernetes Engine、Cloud Build、gcloud コマンド、VPC ネットワーク ピアリング、Cloud VPN に精通していることを前提としています。

アーキテクチャの概要

パブリック エンドポイントへのクライアント アクセス権のない限定公開 GKE クラスタを作成すると、クライアントがアクセスできるのはプライベート IP アドレスを使用した GKE クラスタのコントロール プレーンのみになります。kubectl などのクライアントは、VPC ネットワークにアクセスでき、承認済みネットワーク内のインスタンスで実行されている場合にのみ、コントロール プレーンと通信できます。

Cloud Build を使用してこの限定公開 GKE クラスタにアプリケーションをデプロイする場合は、Cloud Build のプライベート プールを使用して GKE クラスタにアクセスする必要があります。プライベート プールは、Google 所有の Google Cloud プロジェクトで実行される一連のワーカー インスタンスで、VPC ネットワーク ピアリング接続を使用して VPC ネットワークとピアリングされます。この設定では、ワーカー インスタンスは GKE クラスタ コントロール プレーンのプライベート IP アドレスと通信できます。

ただし、GKE クラスタ コントロール プレーンは Google 所有のプロジェクトでも実行され、ピアリング接続を使用して VPC ネットワークとピアリングされます。VPC ネットワーク ピアリングでは推移的ピアリングがサポートされていないため、Cloud Build プライベート プールと GKE クラスタ コントロール プレーンの間でパケットを直接ルーティングすることはできません。

Cloud Build ワーカー インスタンスが GKE クラスタ コントロール プレーンにアクセスできるようにするには、プライベート プールと GKE クラスタ コントロール プレーンを、所有する 2 つの VPC ネットワークとピアリングして、Cloud VPN を使用しているこれら 2 つの VPC ネットワークを接続します。このピアリングと接続により、VPC トンネルの両側でプライベート プールと GKE クラスタ コントロール プレーンのネットワークをアドバタイズし、ルートを完成させることができます。

次のアーキテクチャ図では、このチュートリアルで使用するリソースを示します。

Cloud Build プライベート プールと GKE クラスタ コントロール プレーン間のルートを完了している VPN トンネル。

このチュートリアルで使用するすべてのリソースは、低レイテンシを実現するために同じ Google Cloud リージョンに作成することをおすすめします。このリージョン間通信が実装に必要な場合、VPN トンネルは 2 つの異なるリージョンを通過できます。所有している 2 つの VPC ネットワークは、異なるプロジェクトに属することもできます。

目標

  • 限定公開 GKE クラスタの作成
  • Cloud Build プライベート プールの設定
  • 2 つの VPC ネットワーク間の HA VPN 接続を作成する
  • 2 つの VPC ネットワーク ピアリングと VPC 接続間でのパケットのルーティングを有効にする

料金

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

  1. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  2. Google Cloud プロジェクトで課金が有効になっていることを確認します

  3. Cloud Build, Google Kubernetes Engine, and Service Networking API を有効にします。

    API を有効にする

  4. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

独自のプロジェクトで 2 つの VPC ネットワークを作成する

このセクションでは、2 つの VPC ネットワークと GKE クラスタノード用のサブネットを作成します。

  1. Cloud Shell で、最初の VPC ネットワーク(上の図では「プライベート プール ピアリング VPC ネットワーク」)を作成します。このネットワークでサブネットを作成する必要はありません。

    gcloud compute networks create PRIVATE_POOL_PEERING_VPC_NAME \
        --subnet-mode=CUSTOM
    

    PRIVATE_POOL_PEERING_VPC_NAME は、Cloud Build プライベート プール ネットワークとピアリングされる VPC ネットワークの名前に置き換えます。

  2. 2 番目の VPC ネットワーク(上の図では GKE ピアリング VPC ネットワーク)を作成します。

    gcloud compute networks create GKE_PEERING_VPC_NAME \
        --subnet-mode=CUSTOM
    

    GKE_PEERING_VPC_NAME は、GKE クラスタ コントロール プレーンとピアリングする VPC ネットワークの名前に置き換えます。

  3. GKE クラスタノードのサブネットを作成します。

    gcloud compute networks subnets create GKE_SUBNET_NAME \
        --network=GKE_PEERING_VPC_NAME \
        --range=GKE_SUBNET_RANGE \
        --region=REGION
    

    以下を置き換えます。

    • GKE_SUBNET_NAME: GKE クラスタノードをホストすることを目的とするサブネットワークの名前。
    • GKE_PEERING_VPC_NAME: GKE クラスタ コントロール プレーンとピアリングする VPC ネットワークの名前。
    • GKE_SUBNET_RANGE: GKE_SUBNET_NAME の IP アドレス範囲。このチュートリアルでは、10.244.252.0/22 を使用できます。
    • REGION: GKE クラスタをホストする Google Cloud リージョン。このチュートリアルでは、us-central1 を使用できます。

これで、プロジェクトに 2 つの VPC ネットワークが設定され、他のサービスとピアリングできるようになりました。

限定公開 GKE クラスタの作成

このセクションでは、限定公開の GKE クラスタを作成します。

  1. Cloud Shell で、コントロール プレーンのパブリック エンドポイントへのクライアント アクセス権を付与されていない GKE クラスタを作成します。

    gcloud container clusters create PRIVATE_CLUSTER_NAME \
        --region=REGION \
        --enable-master-authorized-networks \
        --network=GKE_PEERING_VPC_NAME \
        --subnetwork=GKE_SUBNET_NAME \
        --enable-private-nodes \
        --enable-private-endpoint \
        --enable-ip-alias \
        --master-ipv4-cidr=CLUSTER_CONTROL_PLANE_CIDR
    

    以下を置き換えます。

    • PRIVATE_CLUSTER_NAME: 限定公開 GKE クラスタの名前。
    • REGION: GKE クラスタのリージョン。このチュートリアルでは、リージョンに us-central1 を使用します。これは、VPC ネットワークに使用したリージョンと同じです。
    • GKE_PEERING_VPC_NAME: GKE クラスタ コントロール プレーンとピアリングする VPC ネットワークの名前。
    • GKE_SUBNET_RANGE: GKE_SUBNET_NAME の IP アドレス範囲。このチュートリアルでは、10.244.252.0/22 を使用できます。
    • CLUSTER_CONTROL_PLANE_CIDR: GKE クラスタ コントロール プレーンの IP アドレス範囲。/28 接頭辞が必要です。このチュートリアルでは、172.16.0.32/28 を使用します。

    これで、独自のプロジェクトに VPC ネットワークとピアリングされた限定公開 GKE クラスタを作成できました。

  2. GKE クラスタの VPC ネットワーク ピアリングの名前を取得します。この VPC ネットワーク ピアリングは、GKE クラスタの作成時に自動的に作成されました。

    export GKE_PEERING_NAME=$(gcloud container clusters describe PRIVATE_CLUSTER_NAME \
        --region=REGION \
        --format='value(privateClusterConfig.peeringName)')
    

    以下を置き換えます。

    • PRIVATE_CLUSTER_NAME: 限定公開 GKE クラスタの名前。
    • REGION: GKE クラスタのリージョン。このチュートリアルでは、リージョンに us-central1 を使用します。これは、VPC ネットワークに使用したリージョンと同じです。
  3. プライベート プール ネットワークを GKE クラスタ コントロール プレーンにアドバタイズするために、カスタムルートのエクスポートを有効にします。

    gcloud compute networks peerings update $GKE_PEERING_NAME \
        --network=GKE_PEERING_VPC_NAME \
        --export-custom-routes \
        --no-export-subnet-routes-with-public-ip
    

    GKE_PEERING_VPC_NAME は、GKE クラスタ コントロール プレーンとピアリングする VPC ネットワークの名前に置き換えます。

    カスタムルートの詳細については、カスタムルートのインポートとエクスポートをご覧ください。

Cloud Build プライベート プールの作成

このセクションでは、Cloud Build プライベート プールを作成します。

  1. Cloud Shell で、PRIVATE_POOL_PEERING_VPC_NAME VPC ネットワーク内の名前付き VPC アドレス範囲を Cloud Build プライベート プールに割り振ります。

    gcloud compute addresses create RESERVED_RANGE_NAME \
        --global \
        --purpose=VPC_PEERING \
        --addresses=PRIVATE_POOL_NETWORK \
        --prefix-length=PRIVATE_POOL_PREFIX \
        --network=PRIVATE_POOL_PEERING_VPC_NAME
    

    以下を置き換えます。

    • RESERVED_RANGE_NAME: Cloud Build プライベート プールをホストするプライベート IP アドレス範囲の名前。
    • PRIVATE_POOL_NETWORK: RESERVED_RANGE_NAME の最初の IP アドレス。このチュートリアルでは、192.168.0.0 を使用できます。
    • PRIVATE_POOL_PREFIX: RESERVED_RANGE_NAME の接頭辞。作成された各プライベート プールでは、この範囲の /24 が使用されます。このチュートリアルでは、20 を使用できます。これにより、最大 16 個のプールを作成できます。
    • PRIVATE_POOL_PEERING_VPC_NAME: Cloud Build プライベート プール ネットワークとピアリングされる VPC ネットワークの名前。
    • IP 範囲は global です。--purposeVPC_PEERING の場合、名前付き IP アドレス範囲は global でなければならないためです。
  2. Cloud Build プライベート プールを含む VPC ネットワークと PRIVATE_POOL_PEERING_VPC_NAME の間にプライベート接続を作成します。

    gcloud services vpc-peerings connect \
        --service=servicenetworking.googleapis.com \
        --ranges=RESERVED_RANGE_NAME \
        --network=PRIVATE_POOL_PEERING_VPC_NAME
    

    以下を置き換えます。

    • RESERVED_RANGE_NAME: Cloud Build プライベート プールをホストするプライベート IP アドレス範囲の名前。
    • PRIVATE_POOL_PEERING_VPC_NAME: Cloud Build プライベート プール ネットワークとピアリングされる VPC ネットワークの名前。
  3. GKE クラスタ コントロール プレーン ネットワークをプライベート プールにアドバタイズするために、カスタムルートのエクスポートを有効にします。

    gcloud compute networks peerings update servicenetworking-googleapis-com \
        --network=PRIVATE_POOL_PEERING_VPC_NAME \
        --export-custom-routes \
        --no-export-subnet-routes-with-public-ip
    

    PRIVATE_POOL_PEERING_VPC_NAME は、Cloud Build プライベート プール ネットワークとピアリングされる VPC ネットワークの名前に置き換えます。

  4. PRIVATE_POOL_PEERING_VPC_NAME とピアリングされる Cloud Build プライベート プールを作成します。

    gcloud builds worker-pools create PRIVATE_POOL_NAME \
       --region=REGION \
       --peered-network=projects/$GOOGLE_CLOUD_PROJECT/global/networks/PRIVATE_POOL_PEERING_VPC_NAME
    

    以下を置き換えます。

    • PRIVATE_POOL_NAME: Cloud Build プライベート プールの名前。
    • REGION: GKE クラスタのリージョン。このチュートリアルでは、リージョンに us-central1 を使用します。これは、VPC ネットワークに使用したリージョンと同じです。

これで、Cloud Build のプライベート プールが作成され、独自のプロジェクトの VPC ネットワークとピアリングされました。

2 つの VPC ネットワーク間の Cloud VPN 接続の作成

独自のプロジェクトに、Cloud Build プライベート プールとピアリングされた VPC ネットワークと、限定公開 GKE クラスタにピアリングされた 2 つ目の VPC ネットワークがあります。

このセクションでは、プロジェクト内の 2 つの VPC ネットワーク間に Cloud VPN 接続を作成します。この接続によりルートが完成されて、Cloud Build プライベート プールが GKE クラスタにアクセスできるようになります。

  1. Cloud Shell で、相互に接続する 2 つの HA VPN ゲートウェイを作成します。これらのゲートウェイを作成するには、相互に接続する 2 つの完全に構成された HA VPN ゲートウェイの作成の手順に従ってください。BGP セッションを作成したら、設定は完了します。これらの手順を実施する際は、次の値を使用します。

    • PRIVATE_POOL_PEERING_VPC_NAMENETWORK_1
    • GKE_PEERING_VPC_NAMENETWORK_2
    • REGIONREGION_1REGION_2
  2. 作成した 4 つの BGP セッションをそれぞれ構成して、プライベート プール VPC ネットワークと GKE クラスタ コントロール プレーン VPC ネットワークにルートをアドバタイズします。

    gcloud compute routers update-bgp-peer ROUTER_NAME_1 \
        --peer-name=PEER_NAME_GW1_IF0 \
        --region=REGION \
        --advertisement-mode=CUSTOM \
        --set-advertisement-ranges=PRIVATE_POOL_NETWORK/PRIVATE_POOL_PREFIX
    
    gcloud compute routers update-bgp-peer ROUTER_NAME_1 \
        --peer-name=PEER_NAME_GW1_IF1 \
        --region=REGION \
        --advertisement-mode=CUSTOM \
        --set-advertisement-ranges=PRIVATE_POOL_NETWORK/PRIVATE_POOL_PREFIX
    
    gcloud compute routers update-bgp-peer ROUTER_NAME_2 \
        --peer-name=PEER_NAME_GW2_IF0 \
        --region=REGION \
        --advertisement-mode=CUSTOM \
        --set-advertisement-ranges=CLUSTER_CONTROL_PLANE_CIDR
    
    gcloud compute routers update-bgp-peer ROUTER_NAME_2 \
        --peer-name=PEER_NAME_GW2_IF1 \
        --region=REGION \
        --advertisement-mode=CUSTOM \
        --set-advertisement-ranges=CLUSTER_CONTROL_PLANE_CIDR
    

    ここで、次の値は、2 つの HA VPN ゲートウェイを作成したときに使用した名前です。

    • ROUTER_NAME_1
    • PEER_NAME_GW1_IF0
    • PEER_NAME_GW1_IF1
    • ROUTER_NAME_2
    • PEER_NAME_GW2_IF0
    • PEER_NAME_GW2_IF1

Cloud Build から GKE クラスタ コントロール プレーンへのアクセスを有効にする

プロジェクトの 2 つの VPC ネットワーク間に VPN 接続ができたので、GKE クラスタ コントロール プレーンへの Cloud Build のアクセスを有効にします。

  1. Cloud Shell で、GKE のコントロール プレーン承認済みネットワークにプライベート プール ネットワーク範囲を追加します。

    gcloud container clusters update PRIVATE_CLUSTER_NAME \
        --enable-master-authorized-networks \
        --region=REGION \
        --master-authorized-networks=PRIVATE_POOL_NETWORK/PRIVATE_POOL_PREFIX
    

    以下を置き換えます。

    • PRIVATE_CLUSTER_NAME: 限定公開 GKE クラスタの名前。
    • REGION: GKE クラスタのリージョン。このチュートリアルでは、リージョンに us-central1 を使用します。これは、VPC ネットワークに使用したリージョンと同じです。
    • PRIVATE_POOL_NETWORK: RESERVED_RANGE_NAME の最初の IP アドレス。このチュートリアルでは、192.168.0.0 を使用できます。
    • PRIVATE_POOL_PREFIX: RESERVED_RANGE_NAME の接頭辞。作成された各プライベート プールでは、この範囲の /24 が使用されます。このチュートリアルでは、20 を使用できます。これにより、最大 16 個のプールを作成できます。
  2. Cloud Build サービス アカウントに GKE クラスタ コントロール プレーンへのアクセスを許可します。

    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format 'value(projectNumber)')
    
    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
        --role=roles/container.developer
    

これで、Cloud Build プライベート プールが GKE クラスタ コントロール プレーンにアクセスできるようになりました。

ソリューションの確認

このセクションでは、プライベート プールで実行されているビルドステップでコマンド kubectl get nodes を実行して、ソリューションが機能していることを確認します。

  1. Cloud Shell で、コマンド kubectl get nodes を実行する Cloud Build 構成ファイルを使用して、一時フォルダを作成します。

    mkdir private-pool-test && cd private-pool-test
    
    cat > cloudbuild.yaml <<EOF
    steps:
    - name: "gcr.io/cloud-builders/kubectl"
      args: ['get', 'nodes']
      env:
      - 'CLOUDSDK_COMPUTE_REGION=REGION'
      - 'CLOUDSDK_CONTAINER_CLUSTER=PRIVATE_CLUSTER_NAME'
    options:
      workerPool:
        'projects/$GOOGLE_CLOUD_PROJECT/locations/REGION/workerPools/PRIVATE_POOL_NAME'
    EOF
    

    以下を置き換えます。

    • REGION: GKE クラスタのリージョン。このチュートリアルでは、リージョンに us-central1 を使用します。これは、VPC ネットワークに使用したリージョンと同じです。
    • PRIVATE_CLUSTER_NAME: 限定公開 GKE クラスタの名前。
    • PRIVATE_POOL_NAME: Cloud Build プライベート プールの名前。
  2. ビルドジョブを開始します。

    gcloud builds submit --config=cloudbuild.yaml
    
  3. 出力が GKE クラスタ内のノードのリストであることを確認します。コンソールに表示されるビルドログには、次のようなテーブルが含まれています。

    NAME                                     STATUS   ROLES    AGE   VERSION
    gke-private-default-pool-3ec34262-7lq9   Ready    <none>   9d    v1.19.9-gke.1900
    gke-private-default-pool-4c517758-zfqt   Ready    <none>   9d    v1.19.9-gke.1900
    gke-private-default-pool-d1a885ae-4s9c   Ready    <none>   9d    v1.19.9-gke.1900
    

これで、プライベート プールのワーカーが GKE クラスタにアクセスできることが確認できました。このアクセス権により、Cloud Build を使用してこの限定公開 GKE クラスタにアプリケーションをデプロイできるようになります。

トラブルシューティング

このチュートリアルで問題が発生した場合は、次のドキュメントをご覧ください。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

個々のリソースの削除

  1. Cloud Shell で、GKE クラスタを削除します。

    gcloud container clusters delete PRIVATE_CLUSTER_NAME \
        --region=REGION \
        --async
    

    このコマンドを実行すると、VPC ネットワーク ピアリングは自動的に削除されます。

  2. Cloud Build プライベート プールを削除します。

    gcloud builds worker-pools delete PRIVATE_POOL_NAME \
        --region=REGION
    
  3. サービス プロデューサー VPC ネットワークと PRIVATE_POOL_PEERING_VPC_NAME の間のプライベート接続を削除します。

    gcloud services vpc-peerings delete \
       --network=PRIVATE_POOL_PEERING_VPC_NAME \
       --async
    
  4. プライベート プールに使用されている名前付き IP アドレス範囲を削除します。

    gcloud compute addresses delete RESERVED_RANGE_NAME \
        --global
    
  5. 4 つの VPN トンネルを削除します。VPN トンネルの作成で指定したものと同じ名前を使用します。

    gcloud compute vpn-tunnels delete \
        TUNNEL_NAME_GW1_IF0 \
        TUNNEL_NAME_GW1_IF1 \
        TUNNEL_NAME_GW2_IF0 \
        TUNNEL_NAME_GW2_IF1 \
        --region=REGION
    
  6. 2 つの Cloud Router を削除します。Cloud Router の作成で指定したものと同じ名前を使用します。

    gcloud compute routers delete \
        ROUTER_NAME_1 \
        ROUTER_NAME_2 \
        --region=REGION
    
  7. 2 つの VPN ゲートウェイを削除します。HA VPN ゲートウェイの作成で指定したものと同じ名前を使用します。

    gcloud compute vpn-gateways delete \
        GW_NAME_1 \
        GW_NAME_2 \
        --region=REGION
    
  8. GKE_SUBNET_NAME を削除します。これは、GKE クラスタノードをホストするサブネットワークです。

    gcloud compute networks subnets delete GKE_SUBNET_NAME \
        --region=REGION
    
  9. 2 つの VPC ネットワーク(PRIVATE_POOL_PEERING_VPC_NAMEGKE_PEERING_VPC_NAME)を削除します。

    gcloud compute networks delete \
        PRIVATE_POOL_PEERING_VPC_NAME \
        GKE_PEERING_VPC_NAME
    

次のステップ