Cloud Run 用に Cloud Service Mesh を構成する
このページでは、Cloud Run サービスのさまざまなコンピューティング インフラストラクチャで実行されるように Cloud Service Mesh を構成する方法について説明します。
Cloud Service Mesh では、重み付けトラフィック分割やグローバル ロード バランシングなど、メッシュの高度なトラフィック管理機能を有効にできます。また、Cloud Run サービス間のトラフィックに対するオブザーバビリティとセキュリティ ポリシーも有効にできます。フルマネージドのデータプレーン ソリューションのため、独自のサービス メッシュ サイドカーを維持する運用上の負担が軽減されます。
始める前に
Cloud Service Mesh に精通します。
プロジェクトを設定します。
gcloud config set core/project
PROJECT_ID
Google Cloud コンソールで、プロジェクトに対して次の API を有効にします。
ネットワーク下り(外向き)にダイレクト VPC ではなくサーバーレス VPC アクセス コネクタを使用している場合は サーバーレス VPC アクセス API。
gcloud
コンポーネントを最新バージョン(488.0.0 以降)に更新します。gcloud components update
必要なロール
Cloud Run サービスの構成とデプロイに必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。
- Cloud Run サービスに対する Cloud Run デベロッパー(
roles/run.developer
) - サービス ID に対するサービス アカウント ユーザー(
roles/iam.serviceAccountUser
)
Cloud Run クライアントのサービス アカウントには、次のロールも付与されている必要があります。
- Traffic Director クライアント(
roles/trafficdirector.client
) サービス ルーティング API にアクセスします。 - トレーシングを有効にする Cloud Trace エージェント(
roles/cloudtrace.agent
)
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 サービス間で呼び出す手順は次のとおりです。
- Cloud Service Mesh を設定する
- Cloud DNS を設定する
- 宛先の Cloud Run サービスを作成する
- サーバーレス NEG を作成する
- クライアントの Cloud Run サービスを作成する
- メッシュ クライアントからサービスを呼び出す
Cloud Service Mesh を設定する
デフォルトの URL を使用してサービス ルートを作成するには、
Mesh
仕様をmesh.yaml
という名前のファイルに保存します。name:
MESH_NAME
MESH_NAME
は、メッシュ リソースの名前に置き換えます。次のコマンドを実行して、仕様から
Mesh
リソースをインポートします。gcloud network-services meshes import
MESH_NAME
\ --source=mesh.yaml \ --location=globalMESH_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 レコードを作成するには、次のコマンドを実行します。
Cloud DNS で、サービス メッシュ用の限定公開マネージド DNS ゾーンを作成します。
gcloud dns managed-zones create
MESH_NAME
\ --description="Domain forDOMAIN_NAME
service mesh routes" \ --dns-name=DOMAIN_NAME
. \ --network=VPC_NETWORK_NAME
\ --visibility=private新しく作成した限定公開マネージド ゾーン内に 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 で内部サービスにアクセスするには、次のいずれかの方法を使用します。
- VPC ネットワークの限定公開の Google アクセスを構成します。カスタム DNS レコードを設定する必要はありません。
- Private Service Connect エンドポイントを Cloud Service Mesh にアタッチします。これを行うには、Private Service Connect エンドポイント アドレスを使用するように、デフォルトの
*.run.app
URL のカスタム DNS レコードを設定する必要があります。
宛先の Cloud Run サービスを作成する
Cloud Run の宛先でデフォルトの URL を無効にすることはできません。
新しい 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)を作成する
次のコマンドを実行して、宛先 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 サービスの名前。
サーバーレス NEG を参照する内部セルフマネージド バックエンド サービスを作成します。
バックエンド サービスを作成します。
gcloud compute backend-services create
DESTINATION_SERVICE_NAME
-REGION
\ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGEDDESTINATION_SERVICE_NAME
は宛先サービスの名前に、REGION
はリージョンの名前に置き換えます。サーバーレス バックエンドをバックエンド サービスに追加します。
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
はリージョンの名前に置き換えます。
バックエンド サービスを参照する HTTP ルートを作成します。
Mesh
リソースとサービスが構成されます。ホスト名をバックエンド サービスに関連付けるHTTPRoute
リソースを使用して接続します。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
: リージョンの名前。
http_route.yaml
ファイルの仕様を使用して、HTTPRoute
リソースを作成します。gcloud network-services http-routes import
DESTINATION_SERVICE_NAME
-route \ --source=http_route.yaml \ --location=global次のコマンドを実行して、Cloud Run 宛先サービスに Cloud Run 起動元ロール(
roles/iam.invoker
)を付与します。gcloud run services add-iam-policy-binding
DESTINATION_SERVICE_NAME
\ --regionREGION
\ --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 テストアプリを使用して、リクエストを宛先ルートに転送するには:
次のコマンドを実行して、作成した 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。
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 インスタンスにリクエストを直接送信できます。
次のステップ
- パブリックとプライベートのネットワーキングの一般的な Cloud Run ネットワークワーキング構成を確認する
- Cloud Run のプライベート ネットワーキングを構成する
- HTTP サービスを使用して Envoy プロキシを設定する