プロキシレス gRPC サービスの設定
このガイドでは、Mesh
リソースと GRPCRoute
リソースを使用してプロキシレス gRPC サービス メッシュを設定する方法について説明します。
始める前に
Envoy とプロキシレス ワークロードでの設定の準備を読んで、ドキュメントに記載されている前提条件を満たすようにします。
Mesh
リソースを構成する
プロキシレス gRPC アプリケーションが xds://hostname
に接続すると、gRPC クライアント ライブラリは Cloud Service Mesh への接続を確立します。クライアント ライブラリは、その接続を使用して、ホスト名のリクエストのルーティングに必要なルーティング構成を取得します。
Mesh
リソースの名前をメモしてください。これは、プロキシレス gRPC アプリケーションがこの Mesh に関連付けられた構成をリクエストするために使用する鍵です。
Mesh
仕様を作成し、mesh.yaml というファイルに保存します。name: grpc-mesh
mesh.yaml
仕様を使用してMesh
リソースを作成します。gcloud network-services meshes import grpc-mesh \ --source=mesh.yaml \ --location=global
Mesh
リソースが作成されると、Cloud Service Mesh は構成を提供する準備が整いますが、サービスがまだ定義されていないため、構成は空になります。次のセクションでは、サービスを定義して Mesh
リソースに接続します。
gRPC サーバーを構成する
デモ用に、自動スケーリングされた VM を使用するバックエンド サービスをマネージド インスタンス グループに作成します。VM は、ポート 50051
で gRPC プロトコルを使用し、フレーズ hello world
を処理します。
ポート
50051
で公開されているhelloworld
gRPC サービスを使用して、Compute Engine VM インスタンス テンプレートを作成します。gcloud compute instance-templates create grpc-td-vm-template \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --tags=allow-health-checks \ --image-family=debian-10 \ --image-project=debian-cloud \ --metadata-from-file=startup-script=<(echo '#! /bin/bash set -e cd /root sudo apt-get update -y sudo apt-get install -y openjdk-11-jdk-headless curl -L https://github.com/grpc/grpc-java/archive/v1.38.0.tar.gz | tar -xz cd grpc-java-1.38.0/examples/example-hostname ../gradlew --no-daemon installDist sudo systemd-run ./build/install/hostname-server/bin/hostname-server')
作成したテンプレートに基づいて、マネージド インスタンス グループを作成します。
gcloud compute instance-groups managed create grpc-td-mig-us-east1 \ --zone=ZONE \ --size=2 \ --template=grpc-td-vm-template
gRPC サービス用に名前付きポートを作成します。名前付きポートとは、gRPC サービスがリクエストをリッスンするポートです。次の例では、
50051
が名前付きポートです。gcloud compute instance-groups set-named-ports grpc-td-mig-us-east1 \ --named-ports=grpc-helloworld-port:50051 \ --zone=ZONE
gRPC ヘルスチェックを作成します。サービスは、gRPC ヘルスチェックが正常に機能するように、gRPC ヘルスチェック プロトコルを実装する必要があります。 詳細については、ヘルスチェックをご覧ください。
gcloud compute health-checks create grpc grpc-helloworld-health-check \ --use-serving-port
ネットワーク内のインスタンスに対する受信ヘルスチェック接続を許可するように、ファイアウォール ルールを作成します。
gcloud compute firewall-rules create grpc-vm-allow-health-checks \ --network=default \ --action=ALLOW \ --direction=INGRESS \ --source-ranges=35.191.0.0/16,130.211.0.0/22 \ --target-tags allow-health-checks \ --rules=tcp:50051
INTERNAL_SELF_MANAGED
のロード バランシング方式でグローバル バックエンド サービスを作成し、バックエンド サービスにヘルスチェックを追加します。ここで指定したポートは、マネージド インスタンス グループ内の VM に接続するために使用されます。gcloud compute backend-services create grpc-helloworld-service \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --protocol=GRPC \ --port-name=grpc-helloworld-port \ --health-checks grpc-helloworld-health-check
マネージド インスタンス グループをバックエンド サービスに追加します。
gcloud compute backend-services add-backend \ grpc-helloworld-service \ --instance-group=grpc-td-mig-us-east1 \ --instance-group-zone=ZONE \ --global
Mesh
リソースとサービスが構成されます。次のセクションで、ルーティングを設定します。
GRPCRoute
でルーティングを設定する
次の手順を使用してルーティングを設定します。
GRPCRoute
仕様を作成し、grpc_route.yaml
というファイルに保存します。PROJECT_ID
またはPROJECT_NUMBER
を使用できます。name: helloworld-grpc-route hostnames: - helloworld-gce meshes: - projects/PROJECT_NUMBER/locations/global/meshes/grpc-mesh rules: - action: destinations: - serviceName: projects/PROJECT_NUMBER/locations/global/backendServices/grpc-helloworld-service
grpc_route.yaml
仕様を使用してGrpcRoute
リソースを作成します。gcloud network-services grpc-routes import helloworld-grpc-route \ --source=grpc_route.yaml \ --location=global
GRPCRoute
リソースで指定されたサービスのトラフィックをマネージド インスタンス グループのバックエンド間で負荷分散するように Cloud Service Mesh が構成されました。
gRPC クライアントを作成する
プロキシレス gRPC アプリケーションをインスタンス化して Cloud Service Mesh に接続することで、構成を確認できます。ブートストラップ ファイルで、アプリケーションに Mesh 内の VPC ネットワークを指定する必要があります。
構成が完了すると、アプリケーションは xds:///helloworld-gce
サービス URI を使用して、helloworld-gce
に関連付けられているインスタンスまたはエンドポイントにリクエストを送信できます。
次の例では、grpcurl ツールを使用して gRPC サービスをテストします。
クライアント VM を作成します。
gcloud compute instances create grpc-client \ --zone=ZONE\ --scopes=https://www.googleapis.com/auth/cloud-platform \ --image-family=debian-10 \ --image-project=debian-cloud \ --metadata-from-file=startup-script=<(echo '#! /bin/bash set -e export GRPC_XDS_BOOTSTRAP=/run/td-grpc-bootstrap.json echo export GRPC_XDS_BOOTSTRAP=$GRPC_XDS_BOOTSTRAP | sudo tee /etc/profile.d/grpc-xds-bootstrap.sh curl -L https://storage.googleapis.com/traffic-director/td-grpc-bootstrap-0.16.0.tar.gz | tar -xz ./td-grpc-bootstrap-0.16.0/td-grpc-bootstrap --config-mesh-experimental grpc-mesh | tee $GRPC_XDS_BOOTSTRAP')
ブートストラップ ファイルを設定する
クライアント アプリケーションにはブートストラップ構成ファイルが必要です。前のセクションの起動スクリプトで GRPC_XDS_BOOTSTRAP
環境変数を設定し、ヘルパー スクリプトを使用してブートストラップ ファイルを生成します。生成されたブートストラップ ファイル内の TRAFFICDIRECTOR_GCP_PROJECT_NUMBER
とゾーンの値は、VM インスタンスの詳細を把握しているメタデータ サーバーから取得されます。これらの値は、--gcp-project-number
オプションを使用してヘルパー スクリプトに手動で指定できます。--config-mesh-experimental
オプションを使用して、Mesh
リソースと一致するメッシュ名を指定する必要があります。
構成を確認するには、クライアント VM にログインして次のコマンドを実行します。
クライアント VM に SSH で接続します。
gcloud compute ssh grpc-client
grpcurl
ツールをダウンロードしてインストールします。curl -L https://github.com/fullstorydev/grpcurl/releases/download/v1.8.1/grpcurl_1.8.1_linux_x86_64.tar.gz | tar -xz
サービス URI として
xds:///helloworld-gce
を使用し、呼び出すサービス名とメソッドとしてhelloworld.Greeter/SayHello
を指定して、grpcurl
ツールを実行します。SayHello
メソッドのパラメータは-d
オプションで渡します。./grpcurl --plaintext \ -d '{"name": "world"}' \ xds:///helloworld-gce helloworld.Greeter/SayHello
次のような出力が表示されます。ここで、INSTANCE_HOSTNAME
は VM インスタンスの名前です。
Greeting: Hello world, from INSTANCE_HOSTNAME
この出力より、プロキシレス gRPC クライアントが Cloud Service Mesh に接続され、helloworld-gce
のバックエンドが xds
の名前解決機能で解決されていることを確認できます。クライアントは、IP アドレスの把握や DNS 解決の実行なしに、サービスのバックエンドの 1 つに対してリクエストを送信しています。
次のステップ
Mesh
またはGateway
リソースに関連付けられた Route リソースを一覧表示する方法については、Route
リソースを一覧表示するをご覧ください。この機能はプレビュー中です。