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_NAME
  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 のサービス ルーティング 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. \
      --networks=default \
      --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: メッシュ リソース名。

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_NAME/locations/global/meshes/MESH_NAME"
      rules:
      - action:
         destinations:
         - serviceName: "projects/PROJECT_NAME/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_NAME: プロジェクトの名前。
      • MESH_NAME: メッシュの名前。
      • REGION: リージョンの名前。
    2. http_route.yaml ファイルの仕様を使用して、HTTPRoute リソースを作成します。

      gcloud network-services http-routes import DESTINATION_SERVICE_NAME-route \
      --source=http_route.yaml \
      --location=global
      

クライアント 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=NETWORK_NAME \
    --subnet=SUBNET_NAME \
    --mesh="projects/PROJECT_NAME/locations/global/meshes/MESH_NAME"

    次のように置き換えます。

    • CLIENT_SERVICE_NAME: クライアント Cloud Run サービスの名前。
    • REGION: リージョンの名前
    • NETWORK_NAME: ネットワークの名前(例: default)。
    • SUBNET_NAME: ネットワークの名前(例: default)。
    • PROJECT_NAME: プロジェクトの名前。
    • 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_NAME)

    次のように置き換えます。

    • CLIENT_SERVICE_NAME: クライアントの Cloud Run サービスの名前。
    • REGION: リージョンの名前
    • PROJECT_NAME: プロジェクトの名前。
  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 インスタンスにリクエストを直接送信できます。

次のステップ