プロキシレス gRPC サービスの設定

このガイドでは、Mesh リソースと GRPCRoute リソースを使用してプロキシレス gRPC サービス メッシュを設定する方法について説明します。

GRPCRoute リソースと Mesh リソースを使用したプロキシレス gRPC サービス
GRPCRoute リソースと Mesh リソースを使用したプロキシレス gRPC サービス(クリックして拡大)

始める前に

Envoy とプロキシレス ワークロードを使用した Cloud Service Mesh の設定を準備するを読み、ドキュメントに記載されている前提条件を完了してください。

Mesh リソースを構成する

プロキシレス gRPC アプリケーションが xds://hostname に接続すると、gRPC クライアント ライブラリは Cloud Service Mesh への接続を確立します。クライアント ライブラリは、その接続を使用して、ホスト名のリクエストのルーティングに必要なルーティング構成を取得します。

Mesh リソースの名前をメモしてください。これは、プロキシレス gRPC アプリケーションがこの Mesh に関連付けられた構成をリクエストするために使用する鍵です。

  1. Mesh 仕様を作成し、mesh.yaml というファイルに保存します。

    name: grpc-mesh
    
  2. 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 を処理します。

  1. ポート 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')
     
  2. 作成したテンプレートに基づいて、マネージド インスタンス グループを作成します。

    gcloud compute instance-groups managed create grpc-td-mig-us-east1 \
      --zone=ZONE \
      --size=2 \
      --template=grpc-td-vm-template
    
  3. gRPC サービス用に名前付きポートを作成します。名前付きポートとは、gRPC サービスがリクエストをリッスンするポートです。次の例では、50051 が名前付きポートです。

    gcloud compute instance-groups set-named-ports grpc-td-mig-us-east1 \
     --named-ports=grpc-helloworld-port:50051 \
     --zone=ZONE
    
  4. gRPC ヘルスチェックを作成します。サービスは、gRPC ヘルスチェックが正常に機能するように、gRPC ヘルスチェック プロトコルを実装する必要があります。 詳細については、ヘルスチェックをご覧ください。

    gcloud compute health-checks create grpc grpc-helloworld-health-check \
      --use-serving-port
    
  5. ネットワーク内のインスタンスに対する受信ヘルスチェック接続を許可するように、ファイアウォール ルールを作成します。

    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
    
  6. 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
    
  7. マネージド インスタンス グループをバックエンド サービスに追加します。

    gcloud compute backend-services add-backend \
      grpc-helloworld-service \
      --instance-group=grpc-td-mig-us-east1 \
      --instance-group-zone=ZONE \
      --global
    

Mesh リソースとサービスが構成されます。次のセクションで、ルーティングを設定します。

GRPCRoute でルーティングを設定する

次の手順を使用してルーティングを設定します。

  1. 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
    
  2. 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 サービスをテストします。

  1. クライアント 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 にログインして次のコマンドを実行します。

  1. クライアント VM に SSH で接続します。

    gcloud compute ssh grpc-client
    
  2. grpcurl ツールをダウンロードしてインストールします。

    curl -L https://github.com/fullstorydev/grpcurl/releases/download/v1.8.1/grpcurl_1.8.1_linux_x86_64.tar.gz | tar -xz
    
  3. サービス 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 リソースを一覧表示するをご覧ください。この機能はプレビュー中です。