1. はじめに
Cloud Load Balancing は、オンプレミス データセンターや他のパブリック クラウドなど、ハイブリッド接続で到達できる Google Cloud の外部に拡張されたエンドポイントへのトラフィックのロード バランシングをサポートします。
ハイブリッド戦略は、変化する市場の需要に適応し、アプリケーションを段階的にモダナイズするための実際的なソリューションです。これは、最新のクラウドベースのソリューションに移行するための一時的なハイブリッド デプロイか、組織の IT インフラストラクチャの恒久的な設備かも知れません。
ハイブリッド ロード バランシングを設定すると、Cloud Load Balancing のネットワーク機能のメリットを、Google Cloud 外部の既存のインフラストラクチャで実行されているサービスでも活用できます。
ハイブリッド サービスを他の VPC ネットワークで利用できるようにするには、Private Service Connect を使用してサービスを公開します。サービス アタッチメントを内部リージョン HTTP(S) ロードバランサの前に配置することで、他の VPC ネットワーク内のクライアントが、オンプレミス環境または他のクラウド環境で実行されている ハイブリッド サービスにアクセスできるようになります。
作成するアプリの概要
この Codelab では、ネットワーク エンドポイント グループを使用して、オンプレミス サービスへのハイブリッド接続が可能な内部 HTTP(S) ロードバランサを構築します。コンシューマ VPC は、ポート 80 を使用してオンプレミス サービスと通信できます。ポート 443 は、この Codelab の対象外です。
学習内容
- ハイブリッド NEG バックエンドを使用して内部 HTTP(S) ロードバランサを作成する方法
- Private Service Connect プロデューサー(サービス アタッチメント)とコンシューマ(転送ルール)を確立する方法
必要なもの
- 確立済みのハイブリッド ネットワーキング(HA VPN、相互接続、SW-WAN など)
- Google Cloud プロジェクト
ハイブリッド接続を確立する
Google Cloud とオンプレミスまたは他のクラウド環境は、Cloud Router とともに Cloud Interconnect VLAN アタッチメントまたは Cloud VPN トンネルを使用して、ハイブリッド接続で接続する必要があります。高可用性接続の使用をおすすめします。
グローバル動的ルーティングが有効になっている Cloud Router は、BGP を介して特定のエンドポイントを学習し、Google Cloud VPC ネットワークにプログラムします。リージョン動的ルーティングはサポートされていません。静的ルートもサポートされていません。
Cloud Interconnect または Cloud VPN の構成に使用する Google Cloud VPC ネットワークは、ハイブリッド ロード バランシングのデプロイに使用するネットワークと同じです。VPC ネットワークのサブネットの CIDR 範囲がリモートの CIDR 範囲と競合しないようにしてください。IP アドレスが重複する場合、リモート接続よりもサブネット ルートが優先されます。
手順については、次をご覧ください。
カスタムルート アドバタイズ
以下のサブネットでは、Cloud Router からオンプレミス ネットワークへのカスタム アドバタイズが必要です。これにより、オンプレミスのファイアウォール ルールが更新されます。
サブネット | 説明 |
172.16.0.0/23 | オンプレミス サービスと直接通信するために使用されるプロキシ サブネット |
130.211.0.0/22、35.191.0.0/16 |
2. 始める前に
Codelab をサポートするようにプロジェクトを更新する
この Codelab では、Cloud Shell での gcloud 構成の実装に役立つ $variables を使用します。
Cloud Shell 内で、次のコマンドを実行します。
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
psclab=YOUR-PROJECT-NAME
echo $psclab
3. プロデューサーの設定
プロデューサー VPC を作成する
Cloud Shell 内で、次のコマンドを実行します。
gcloud compute networks create producer-vpc --project=$psclab --subnet-mode=custom
プロデューサー サブネットを作成する
Cloud Shell 内で、次のコマンドを実行します。
gcloud compute networks subnets create subnet-201 --project=$psclab --range=10.10.1.0/24 --network=producer-vpc --region=us-central1
gcloud compute networks subnets create subnet-202 --project=$psclab --range=10.20.1.0/24 --network=producer-vpc --region=us-central1
内部ロードバランサの IP アドレスを予約する
Cloud Shell 内で以下を実行します。Private Service Connect では SHARED_VIP の使用はサポートされていません。代わりに GCE_ENDPOINT を使用してください。
gcloud compute addresses create lb-ip \
--region=us-central1 \
--subnet=subnet-202 \
--purpose=GCE_ENDPOINT
compute addresses describe コマンドを使用して、割り振られた IP アドレスを表示します。
gcloud compute addresses describe lb-ip --region=us-central1 | grep address:
リージョン プロキシ サブネットを作成する
プロキシの割り当ては、ロードバランサ レベルではなく VPC レベルで行われます。Envoy ベースのロードバランサを使用する仮想ネットワーク(VPC)の各リージョンにプロキシ専用サブネット を 1 つ作成する必要があります。同じリージョンおよび同じ VPC ネットワーク内に複数のロードバランサをデプロイすると、ロード バランシング用に同じプロキシ専用サブネットが共有されます。
- クライアントは、ロードバランサの転送ルールの IP アドレスとポートに接続します。
- 各プロキシは、対応するロードバランサの転送ルールで指定された IP アドレスとポートをリッスンします。いずれかのプロキシがクライアントのネットワーク接続を受信して終了します。
- プロキシは、NEG 内の適切なバックエンド VM またはエンドポイントへの接続を確立します。これは、ロードバランサの URL マップとバックエンド サービスによって決まります。
ネットワークが自動モードかカスタムモードかにかかわらず、プロキシ専用サブネットを作成する必要があります。プロキシ専用サブネットでは 64 個以上の IP アドレスを指定する必要があります。これは、/26 以下のプレフィックス長に対応します。推奨されるサブネット サイズは /23(512 個のプロキシ専用アドレス)です。
Cloud Shell 内で、次のコマンドを実行します。
gcloud compute networks subnets create proxy-subnet-us-central \
--purpose=REGIONAL_MANAGED_PROXY \
--role=ACTIVE \
--region=us-central1 \
--network=producer-vpc \
--range=172.16.0.0/23
Private Service Connect NAT サブネットを作成する
Private Service Connect で使用する専用サブネットを 1 つ以上作成します。Google Cloud コンソールを使用してサービスを公開する場合、その手順でサブネットを作成できます。サービスのロードバランサと同じリージョンにサブネットを作成します。通常のサブネットを Private Service Connect のサブネットに変換することはできません。
Cloud Shell 内で、次のコマンドを実行します。
gcloud compute networks subnets create psc-nat-subnet --network=producer-vpc --region=us-central1 --range=100.100.10.0/24 --purpose=private-service-connect
プロデューサーのファイアウォール ルールを作成する
Private Service Connect エンドポイントとサービス アタッチメント間のトラフィックを許可するように ファイアウォール ルールを構成します。この Codelab では、NAT サブネット 100.100.10.0/24 に Private Service Connect サービス アタッチメント(内部ロードバランサ)へのアクセスを許可する上り(内向き)ファイアウォール ルールを作成しました。
Cloud Shell 内で、次のコマンドを実行します。
gcloud compute --project=$psclab firewall-rules create allow-to-ingress-nat-subnet --direction=INGRESS --priority=1000 --network=producer-vpc --action=ALLOW --rules=all --source-ranges=100.100.10.0/24
Cloud Shell 内で、Google Cloud ヘルスチェックが TCP ポート 80 でオンプレミス サービス(バックエンド サービス)に到達することを許可する fw-allow-health-check ルールを作成する
gcloud compute firewall-rules create fw-allow-health-check \
--network=producer-vpc \
--action=allow \
--direction=ingress \
--source-ranges=130.211.0.0/22,35.191.0.0/16 \
--rules=tcp:80
ロードバランサが TCP ポート 80 でバックエンド インスタンスと通信することを許可するプロキシ専用サブネットの上り(内向き)許可ファイアウォール ルールを作成する
gcloud compute firewall-rules create fw-allow-proxy-only-subnet \
--network=producer-vpc \
--action=allow \
--direction=ingress \
--source-ranges=172.16.0.0/23 \
--rules=tcp:80
ハイブリッド接続 NEG を設定する
NEG を作成するときは、Google Cloud とオンプレミスまたは他のクラウド環境との間の地理的距離を最小限に抑えるゾーンを使用します。たとえば、ドイツのフランクフルトのオンプレミス環境にサービスをホストする場合、NEG の作成時に europe-west3-a Google Cloud ゾーンを指定できます。
また、Cloud Interconnect を使用している場合、NEG の作成に使用するゾーンは、Cloud Interconnect アタッチメントが構成されているリージョンと同じにする必要があります。
使用可能なリージョンとゾーンについては、Compute Engine ドキュメントの: 使用可能なリージョンとゾーンをご覧ください。
Cloud Shell 内で gcloud compute network-endpoint-groups create コマンドを使用して、ハイブリッド接続 NEG を作成する
gcloud compute network-endpoint-groups create on-prem-service-neg \
--network-endpoint-type=NON_GCP_PRIVATE_IP_PORT \
--zone=us-central1-a \
--network=producer-vpc
Cloud Shell 内で、オンプレミスの IP:Port エンドポイントをハイブリッド NEG に追加します。
gcloud compute network-endpoint-groups update on-prem-service-neg \
--zone=us-central1-a \
--add-endpoint="ip=192.168.1.5,port=80"
ロードバランサを構成する
次の手順では、ロードバランサ(転送ルール)を構成し、ネットワーク エンドポイント グループに関連付けることができます。
Cloud Shell 内で、オンプレミス サービスに渡すリージョン ヘルスチェックを作成する
gcloud compute health-checks create http http-health-check \
--region=us-central1 \
--use-serving-port
Cloud Shell 内で、ハイブリッド NEG を活用してオンプレミス バックエンド用のバックエンド サービスを作成する
gcloud compute backend-services create on-premise-service-backend \
--load-balancing-scheme=INTERNAL_MANAGED \
--protocol=HTTP \
--health-checks=http-health-check \
--health-checks-region=us-central1 \
--region=us-central1
Cloud Shell 内で、ハイブリッド NEG バックエンドをバックエンド サービスに追加します。RATE には、バックエンドで処理する最大 RATE を入力します。
gcloud compute backend-services add-backend on-premise-service-backend \
--region=us-central1 \
--balancing-mode=RATE \
--max-rate-per-endpoint=100 \
--network-endpoint-group=on-prem-service-neg \
--network-endpoint-group-zone=us-central1-a
Cloud Shell 内で、受信リクエストをバックエンド サービスに転送するための URL マップを作成する
gcloud compute url-maps create on-prem-svc-url-map \
--default-service on-premise-service-backend \
--region=us-central1
HTTP ターゲット プロキシを作成する
gcloud compute target-http-proxies create proxy-subnet-us-central\
--url-map=on-prem-svc-url-map \
--url-map-region=us-central1 \
--region=us-central1
受信リクエストをプロキシに転送する転送ルールを作成します。転送ルールの作成にプロキシ専用サブネットを使用しないでください。
gcloud compute forwarding-rules create http-hybrid-neg-fwd-rule \
--load-balancing-scheme=INTERNAL_MANAGED \
--network=producer-vpc \
--subnet=subnet-202 \
--address=lb-ip \
--ports=80 \
--region=us-central1 \
--target-http-proxy=proxy-subnet-us-central \
--target-http-proxy-region=us-central1
4. ロードバランサを検証する
Cloud コンソールで、[ネットワーク サービス] → [ロード バランシング] → [ロードバランサ] に移動します。1 つの NEG は「Green」です。オンプレミス サービスへのヘルスチェックが成功したことを示す
‘on-premise-svc-url-map' を選択すると、フロントエンドの IP アドレスが生成され、バックエンド サービスを特定します。
5. オンプレミスから学習したルートを表示する
[VPC ネットワーク] → [ルート] に移動します。なお、学習したオンプレミス サービスのサブネット 192.168.1.0/27 は、
6. オンプレミス サービスへの接続を検証する
プロデューサー VPC から、オンプレミス サービスへの接続をテストするための VM を作成します。その後、サービス アタッチメントが次の構成になります。
Cloud Shell 内で、プロデューサー VPC にテスト インスタンスを作成する
gcloud compute instances create test-box-us-central1 \
--zone=us-central1-a \
--image-family=debian-10 \
--image-project=debian-cloud \
--subnet=subnet-201 \
--no-address
IAP に VM インスタンスへの接続を許可するには、次のファイアウォール ルールを作成します。
- IAP を使用してアクセスできるようにするすべての VM インスタンスに適用します。
- IP 範囲 35.235.240.0/20 からの上り(内向き)トラフィックを許可する。この範囲には、IAP が TCP 転送に使用するすべての IP アドレスが含まれています。
Cloud Shell 内で、プロデューサー VPC にテスト インスタンスを作成する
gcloud compute firewall-rules create ssh-iap \
--network producer-vpc \
--allow tcp:22 \
--source-ranges=35.235.240.0/20
Cloud Shell で IAP を使用して test-box-us-central1 にログインし、ロード バランシングの IP アドレスに対して curl を実行してオンプレミス サービスへの接続を検証します。タイムアウトした場合は再試行する。
gcloud compute ssh test-box-us-central1 --project=$psclab --zone=us-central1-a --tunnel-through-iap
オンプレミス サービスへの接続を検証する curl を実行します。確認したら、VM を終了して Cloud Shell プロンプトに戻ります。ステップ 4 で特定した出力に基づいて、内部ロードバランサの IP を置き換えます。
user@test-box-us-central1:~$ curl -v 10.20.1.2
* Expire in 0 ms for 6 (transfer 0x55b7725c10f0)
* Trying 10.20.1.2...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55b7725c10f0)
* Connected to 10.20.1.2 (10.20.1.2) port 80 (#0)
> GET / HTTP/1.1
> Host: 10.20.1.2
> User-Agent: curl/7.64.0
> Accept: */*
>
< HTTP/1.1 200 OK
< content-type: text/html; charset=utf-8
< accept-ranges: bytes
< etag: "3380914763"
< last-modified: Mon, 05 Dec 2022 15:10:56 GMT
< expires: Mon, 12 Dec 2022 03:17:20 GMT
< cache-control: max-age=0
< content-length: 37
< date: Mon, 12 Dec 2022 03:17:20 GMT
< server: lighttpd/1.4.53
< via: 1.1 google
<
Welcome to my on-premise service!!
7. Private Service Connect サービス アタッチメントを作成する
次の手順ではサービス アタッチメントを作成します。コンシューマ エンドポイントとペアにすると、VPC ピアリングを必要とせずにオンプレミス サービスへのアクセスが実現します。
サービス アタッチメントを作成する
Cloud Shell 内でサービス アタッチメントを作成する
gcloud compute service-attachments create service-1 --region=us-central1 --producer-forwarding-rule=http-hybrid-neg-fwd-rule --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=psc-nat-subnet
省略可: 共有 VPC を使用する場合は、サービス プロジェクトにサービス アタッチメントを作成する
gcloud compute service-attachments create service-1 --region=us-central1 --producer-forwarding-rule=http-hybrid-neg-fwd-rule --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=projects/<hostproject>/regions/<region>/subnetworks/<natsubnet>
TCP サービス アタッチメントを検証する
gcloud compute service-attachments describe service-1 --region us-central1
省略可: [ネットワーク サービス] → [Private Service Connect] に移動して、新しく確立されたサービス アタッチメントを表示します。
[Service-1] を選択すると、コンシューマがプライベート サービス接続を確立するために使用するサービス アタッチメント URI など、より詳細な情報が提供されます。後のステップで使用するため、URI をメモしておきます。
サービス アタッチメントの詳細: projects/<projectname>/regions/us-central1/serviceAttachments/service-1
8. ユーザー設定
コンシューマ VPC を作成する
Cloud Shell 内で、次のコマンドを実行します。
gcloud compute networks create consumer-vpc --project=$psclab --subnet-mode=custom
コンシューマ サブネットを作成する
Cloud Shell 内で GCE サブネットを作成する
gcloud compute networks subnets create subnet-101 --project=$psclab --range=10.100.1.0/24 --network=consumer-vpc --region=us-central1
Cloud Shell 内でコンシューマ エンドポイント サブネットを作成する
gcloud compute networks subnets create subnet-102 --project=$psclab --range=10.100.2.0/24 --network=consumer-vpc --region=us-central1
コンシューマ エンドポイント(転送ルール)を作成する
Cloud Shell 内で、コンシューマ エンドポイントとして使用する静的 IP アドレスを作成します。
gcloud compute addresses create psc-consumer-ip-1 --region=us-central1 --subnet=subnet-102 --addresses 10.100.2.10
前に生成したサービス アタッチメント URI を使用して、コンシューマ エンドポイントを作成します。
Cloud Shell 内でコンシューマ エンドポイントを作成する
gcloud compute forwarding-rules create psc-consumer-1 --region=us-central1 --network=consumer-vpc --address=psc-consumer-ip-1 --target-service-attachment=projects/$psclab/regions/us-central1/serviceAttachments/service-1
9. コンシューマー Private Service Connect を検証する - コンシューマー VPC
コンシューマ VPC から [ネットワーク サービス] > [Private Service Connect] > [接続エンドポイント] に移動して、Private Service 接続が成功したことを確認します。確立済みの psc-consumer-1 接続と、それに対応する先ほど作成した IP アドレスをメモしておきます。
psc-consumer-1 を選択すると、サービス アタッチメントの URI を含む詳細が提供されます。
10. コンシューマー Private Service Connect を検証する - プロデューサー VPC
プロデューサー VPC から [ネットワーク サービス] → [Private Service Connect] → [公開サービス] に移動し、プライベート サービス接続が成功したことを確認します。公開された service-1 接続は、1 つの転送ルール(接続エンドポイント)を示しています。
11. 限定公開 DNS ゾーンを作成し、A レコード
PSC 接続エンドポイントにマッピングされた限定公開 DNS ゾーンを作成して、VPC 内の任意のホストからプロデューサーへのシームレスなアクセスを可能にする。
Cloud Shell から
gcloud dns --project=$psclab managed-zones create codelab-zone --description="" --dns-name="codelab.net." --visibility="private" --networks="consumer-vpc"
gcloud dns --project=$psclab record-sets create service1.codelab.net. --zone="codelab-zone" --type="A" --ttl="300" --rrdatas="10.100.2.10"
12. VM を使用してプロデューサー サービスへのコンシューマ アクセスを検証する
コンシューマ VPC から、コンシューマ エンドポイント service1.codelabs.net にアクセスしてオンプレミス サービスへの接続をテストする VM を作成します。
Cloud Shell 内でコンシューマ VPC にテスト インスタンスを作成する
gcloud compute instances create consumer-vm \
--zone=us-central1-a \
--image-family=debian-10 \
--image-project=debian-cloud \
--subnet=subnet-101 \
--no-address
IAP に VM インスタンスへの接続を許可するには、次のファイアウォール ルールを作成します。
- IAP を使用してアクセスできるようにするすべての VM インスタンスに適用します。
- IP 範囲 35.235.240.0/20 からの上り(内向き)トラフィックを許可する。この範囲には、IAP が TCP 転送に使用するすべての IP アドレスが含まれています。
Cloud Shell 内でコンシューマ VPC にテスト インスタンスを作成する
gcloud compute firewall-rules create ssh-iap-consumer \
--network consumer-vpc \
--allow tcp:22 \
--source-ranges=35.235.240.0/20
Cloud Shell で IAP を使用して consumer-vm にログインし、dns FQDN service1.codelab.net に対して curl を実行してオンプレミス サービスへの接続を検証します。タイムアウトした場合は再試行する。
gcloud compute ssh consumer-vm --project=$psclab --zone=us-central1-a --tunnel-through-iap
オンプレミス サービスへの接続を検証する curl を実行します。確認したら、VM を終了して Cloud Shell プロンプトに戻ります。
Cloud Shell 内で curl を実行する
$ curl -v service1.codelab.net
* Trying 10.100.2.10...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x5650fc3390f0)
* Connected to service1.codelab.net (10.100.2.10) port 80 (#0)
> GET / HTTP/1.1
> Host: service1.codelab.net
> User-Agent: curl/7.64.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=utf-8
< Accept-Ranges: bytes
< ETag: "3380914763"
< Last-Modified: Mon, 05 Dec 2022 15:10:56 GMT
< Expires: Mon, 05 Dec 2022 15:15:41 GMT
< Cache-Control: max-age=0
< Content-Length: 37
< Date: Mon, 05 Dec 2022 15:15:41 GMT
< Server: lighttpd/1.4.53
<
Welcome to my on-premise service!!
以下は、オンプレミス サービスからのキャプチャの例です。送信元 IP アドレス 172.16.0.13 は、プロキシ サブネット範囲 172.16.0.0/23 からのものです。
13. プロデューサーのクリーンアップ
Producer コンポーネントを削除する
Cloud Shell 内でプロデューサー VPC のテスト インスタンスを削除する
gcloud compute instances delete test-box-us-central1 --zone=us-central1-a --quiet
gcloud compute service-attachments delete service-1 --region=us-central1 --quiet
gcloud compute forwarding-rules delete http-hybrid-neg-fwd-rule --region=us-central1 --quiet
gcloud compute target-http-proxies delete proxy-subnet-us-central --region=us-central1 --quiet
gcloud compute url-maps delete on-prem-svc-url-map --region=us-central1 --quiet
gcloud compute backend-services delete on-premise-service-backend --region=us-central1 --quiet
gcloud compute network-endpoint-groups delete on-prem-service-neg --zone=us-central1-a --quiet
gcloud compute addresses delete lb-ip --region=us-central1 --quiet
gcloud compute networks subnets delete psc-nat-subnet subnet-201 subnet-202 proxy-subnet-us-central --region=us-central1 --quiet
gcloud compute firewall-rules delete ssh-iap fw-allow-proxy-only-subnet allow-to-ingress-nat-subnet fw-allow-health-check --quiet
gcloud compute health-checks delete http-health-check --region=us-central1 --quiet
gcloud compute networks delete producer-vpc --quiet
14. ユーザーのクリーンアップ
コンシューマ コンポーネントを削除する
Cloud Shell 内でコンシューマ VPC のテスト インスタンスを削除する
gcloud compute instances delete consumer-vm --zone=us-central1-a --quiet
gcloud compute forwarding-rules delete psc-consumer-1 --region=us-central1 --quiet
gcloud compute addresses delete psc-consumer-ip-1 --region=us-central1 --quiet
gcloud compute networks subnets delete subnet-101 subnet-102 --region=us-central1 --quiet
gcloud compute firewall-rules delete ssh-iap-consumer --quiet
gcloud dns record-sets delete service1.codelab.net --type=A --zone=codelab-zone --quiet
gcloud dns managed-zones delete codelab-zone --quiet
gcloud compute networks delete consumer-vpc --quiet
15. 完了
これで、内部 HTTP(S) ロードバランサを使用した Private Service Connect の構成と検証が完了しました。
また、プロデューサー インフラストラクチャを作成し、オンプレミス サービスを指すプロデューサー VPC にサービス アタッチメントを追加しました。オンプレミス サービスへの接続を許可するコンシューマ VPC にコンシューマ エンドポイントを作成する方法を学習しました。
次のステップ
以下の Codelab をご覧ください。
- GKE で Private Service を使用してサービスを公開して使用する
- Private Service Connect でサービスを公開して使用する
- Private Service Connect と内部 TCP プロキシ ロードバランサを使用して、ハイブリッド ネットワークでオンプレミス サービスに接続する