Cloud Run 用に Cloud Service Mesh を構成する

このページでは、Cloud Run サービスのさまざまなコンピューティング インフラストラクチャで実行されるように Cloud Service Mesh を構成する方法について説明します。

Cloud Service Mesh では、重み付けトラフィック分割やグローバル ロード バランシングなど、メッシュの高度なトラフィック管理機能を有効にできます。また、Cloud Run サービス間のトラフィックに対するオブザーバビリティとセキュリティ ポリシーも有効にできます。フルマネージドのデータプレーン ソリューションのため、独自のサービス メッシュ サイドカーを維持する運用上の負担が軽減されます。

始める前に

  1. Cloud Service Mesh に精通します。

  2. プロジェクトを設定します。

    gcloud config set core/project PROJECT_ID
  3. Google Cloud コンソールで、プロジェクトに対して次の API を有効にします。

  4. gcloud コンポーネントを最新バージョン(488.0.0 以降)に更新します。

    gcloud components update

必要なロール

Cloud Run サービスの構成とデプロイに必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

Cloud Run クライアントのサービス アカウントには、次のロールも付与されている必要があります。

Cloud Run に関連付けられている IAM ロールと権限のリストについては、Cloud Run IAM ロールCloud Run IAM 権限をご覧ください。Cloud Run サービスが Google Cloud APIs(Cloud クライアント ライブラリなど)と連携している場合は、サービス ID の構成ガイドをご覧ください。ロールの付与の詳細については、デプロイ権限アクセスの管理をご覧ください。

Cloud Service Mesh を使用した Cloud Run サービス間の呼び出し

Cloud Run は、Cloud Service Mesh の service routing API を使用します。これらの API を使用すると、Cloud Run サービスは、指定された run.app URL ではなく、カスタマイズされた URL を使用して他の Cloud Run サービスを呼び出すことができます。また、Cloud Run は宛先の Cloud Run サービスに対して自動的に認証を行うため、他の Cloud Run サービスにリクエスト認証情報をアタッチするために独自の認証を構成する必要はありません。

Cloud Service Mesh を使用して Cloud Run サービス間で呼び出す手順は次のとおりです。

  1. Cloud Service Mesh を設定する
  2. Cloud DNS を設定する
  3. 宛先の Cloud Run サービスを作成する
  4. サーバーレス NEG を作成する
  5. クライアントの Cloud Run サービスを作成する
  6. メッシュ クライアントからサービスを呼び出す

Cloud Service Mesh を設定する

  1. デフォルトの URL を使用してサービス ルートを作成するには、Mesh 仕様を mesh.yaml という名前のファイルに保存します。

    name: MESH_NAME

    MESH_NAME は、メッシュ リソースの名前に置き換えます。

  2. 次のコマンドを実行して、仕様から Mesh リソースをインポートします。

    gcloud network-services meshes import MESH_NAME \
      --source=mesh.yaml \
      --location=global

    MESH_NAME は、メッシュ リソースの名前に置き換えます。

Cloud DNS を設定する

プライベート IP アドレスのみがキャプチャされるためホスト名として完全な run.app URL アドレスと併せて Private Service Connect エンドポイントと使用している場合は、Cloud DNS の設定をスキップして次のセクションに進んでください。

メッシュ クライアントが宛先サービスを呼び出す場合、リクエストで使用されるホスト名は DNS で解決可能である必要があります。サイドカーは、これらの IP アドレス範囲へのすべての IP トラフィックをキャプチャし、適切にリダイレクトするため、任意の有効な RFC 1918 IP アドレスを使用できます。

次の例は、単一の IP アドレスに解決する Cloud DNS ゾーンにワイルドカード * エントリを作成する方法を示しています。排他的な Cloud DNS ゾーンを使用しない場合は、メッシュからアドレス指定できるようにする Cloud Run サービスに対応するすべてのホスト名に対して、Cloud DNS エントリを作成します。

  • 排他的ゾーンに Cloud DNS レコードを作成するには、次のコマンドを実行します。

    1. Cloud DNS で、サービス メッシュ用の限定公開マネージド DNS ゾーンを作成します。

      gcloud dns managed-zones create MESH_NAME \
      --description="Domain for DOMAIN_NAME service mesh routes" \
      --dns-name=DOMAIN_NAME. \
      --network=VPC_NETWORK_NAME \
      --visibility=private
    2. 新しく作成した限定公開マネージド ゾーン内に DNS レコードを作成します。IP アドレス 10.0.0.1 が未使用であることを確認します。

      gcloud dns record-sets create "*.DOMAIN_NAME." \
      --type=A \
      --zone="MESH_NAME" \
      --rrdatas=10.0.0.1 \
      --ttl=3600

      以下のように置き換えます。

      • DOMAIN_NAME: DNS ドメインの名前。
      • MESH_NAME: メッシュ リソース名。
      • VPC_NETWORK_NAME: VPC ネットワークの名前(例:「default」)。

Cloud Service Mesh を使用して内部サービスにアクセスする

Cloud Run では、ネットワークの受信トラフィックを「内部」に制限できます。サービスでこの上り(内向き)制限が有効になっている場合、Cloud Run へのアクセス パスを有効にすると、メッシュから Virtual Private Cloud ネットワークを経由するトラフィックを「内部」として設定できます。

Cloud Service Mesh で内部サービスにアクセスするには、次のいずれかの方法を使用します。

宛先の Cloud Run サービスを作成する

Cloud Run の宛先でデフォルトの URL を無効にすることはできません

  1. 新しい Cloud Run サービスまたは既存の Cloud Run サービスをデプロイします。

    gcloud run deploy DESTINATION_SERVICE_NAME \
    --no-allow-unauthenticated \
    --region=REGION \
    --image=IMAGE_URL 

    以下を置き換えます。

    • DESTINATION_SERVICE_NAME: 宛先の Cloud Run サービスの名前。
    • REGION: リージョンの名前。
    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。

サーバーレス ネットワーク エンドポイント グループ(NEG)を作成する

  1. 次のコマンドを実行して、宛先 NEG を作成します。

    gcloud compute network-endpoint-groups create destination-neg \
    --region=REGION \
    --network-endpoint-type=serverless \
    --cloud-run-service=DESTINATION_SERVICE_NAME

    以下を置き換えます。

    • REGION: リージョンの名前。
    • DESTINATION_SERVICE_NAME: 宛先の Cloud Run サービスの名前。
  2. サーバーレス NEG を参照する内部セルフマネージド バックエンド サービスを作成します。

    1. バックエンド サービスを作成します。

      gcloud compute backend-services create DESTINATION_SERVICE_NAME-REGION \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED

      DESTINATION_SERVICE_NAME は宛先サービスの名前に、REGION はリージョンの名前に置き換えます。

    2. サーバーレス バックエンドをバックエンド サービスに追加します。

      gcloud compute backend-services add-backend DESTINATION_SERVICE_NAME-REGION \
      --global \
      --network-endpoint-group=destination-neg \
      --network-endpoint-group-region=REGION

      DESTINATION_SERVICE_NAME は宛先サービスの名前に、REGION はリージョンの名前に置き換えます。

  3. バックエンド サービスを参照する HTTP ルートを作成します。

    Mesh リソースとサービスが構成されます。ホスト名をバックエンド サービスに関連付ける HTTPRoute リソースを使用して接続します。

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

      name: "DESTINATION_SERVICE_NAME-route"
      hostnames:
      - "DESTINATION_SERVICE_NAME.DOMAIN_NAME"
      meshes:
      - "projects/PROJECT_ID/locations/global/meshes/MESH_NAME"
      rules:
      - action:
         destinations:
         - serviceName: "projects/PROJECT_ID/locations/global/backendServices/DESTINATION_SERVICE_NAME-REGION"
      

      ホスト名を、サービスのアドレスに使用する名前に設定します。同じサービス メッシュ内のすべてのクライアントは、呼び出し元のリージョンとプロジェクトに関係なく、http://<HOSTNAME> URL を使用してこのサービスを呼び出すことができます。プライベート IP アドレスを使用するように Cloud DNS を設定している場合、ルートのホスト名は完全な run.app URL アドレスにすることもできます。この場合、Cloud DNS の設定手順をスキップできます。

      以下を置き換えます。

      • DESTINATION_SERVICE_NAME: 宛先の Cloud Run サービスの名前。
      • DOMAIN_NAME: DNS ドメインの名前。
      • PROJECT_ID: プロジェクトの ID。
      • MESH_NAME: メッシュの名前。
      • REGION: リージョンの名前。
    2. http_route.yaml ファイルの仕様を使用して、HTTPRoute リソースを作成します。

      gcloud network-services http-routes import DESTINATION_SERVICE_NAME-route \
      --source=http_route.yaml \
      --location=global
      
    3. 次のコマンドを実行して、Cloud Run 宛先サービスに対する Cloud Run 起動元ロールroles/iam.invoker)を付与します。

      gcloud run services add-iam-policy-binding DESTINATION_SERVICE_NAME \
      --region REGION \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.invoker

      以下を置き換えます。

      • DESTINATION_SERVICE_NAME: 宛先の Cloud Run サービスの名前。
      • REGION: リージョンの名前。
      • PROJECT_NUMBER: プロジェクトの数。

クライアントの Cloud Run サービスを作成する

クライアントの Cloud Run サービスを作成すると、リソースが QPS と構成の合計サイズに関連する Envoy サイドカーが作成されます。ほとんどの場合、CPU 使用率は vCPU の 1% 未満で、メモリ使用量は 50 MB 未満です。

Virtual Private Cloud ネットワークへの下り(外向き)ネットワークアクセス権が必要です。

  • テスト用のクライアント サービスを作成するには、Cloud Run に fortio アプリをデプロイして、HTTP ルートにトラフィックを転送できるようにします。

    gcloud beta run deploy CLIENT_SERVICE_NAME \
    --region=REGION \
    --image=fortio/fortio \
    --network=VPC_NETWORK_NAME \
    --subnet=SUBNET_NAME \
    --mesh="projects/PROJECT_ID/locations/global/meshes/MESH_NAME"

    以下を置き換えます。

    • CLIENT_SERVICE_NAME: クライアントの Cloud Run サービスの名前。
    • REGION: リージョンの名前
    • VPC_NETWORK_NAME: VPC ネットワークの名前(例:「default」)。
    • SUBNET_NAME: サブネットの名前(例:「default」)。
    • PROJECT_ID: オブジェクトの ID。
    • MESH_NAME: メッシュ リソースの名前。

メッシュ クライアントからサービスを呼び出す

前のクライアント サービスを作成するセクションの fortio テストアプリを使用して、リクエストを宛先ルートに転送するには:

  1. 次のコマンドを実行して、作成した Cloud Run クライアント サービスの URL を取得します。

    TEST_SERVICE_URL=$(gcloud run services describe CLIENT_SERVICE_NAME \
    --region=REGION --format="value(status.url)" \
    --project=PROJECT_ID)

    以下を置き換えます。

    • CLIENT_SERVICE_NAME: クライアント Cloud Run サービスの名前。
    • REGION: リージョンの名前
    • PROJECT_ID: オブジェクトの ID。
  2. curl コマンドを使用して、前の手順の fortio エンドポイントの宛先ルートにリクエストを送信します。

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" "$TEST_SERVICE_URL/fortio/fetch/DESTINATION_SERVICE_NAME.DOMAIN_NAME"

    以下を置き換えます。

    • DESTINATION_SERVICE_NAME: 宛先の Cloud Run サービスの名前。
    • DOMAIN_NAME: DNS ドメインの名前。

Cloud Run から Compute Engine バックエンドを呼び出す

マネージド インスタンス グループをバックエンドとして使用して Compute Engine と Cloud Service Mesh のサービス ルートをデプロイするには、Cloud Service Mesh で Compute Engine ベースの HTTP サーバーを構成します。 これにより、Cloud Run クライアントは、このバックエンド サービス ルートを使用して Compute Engine インスタンスにリクエストを直接送信できます。

次のステップ