Cloud Run 用の Cloud Service Mesh を構成する
このページでは、Cloud Run サービスのさまざまなコンピューティング インフラストラクチャで実行するように Cloud Service Mesh を構成する方法について説明します。
Cloud Service Mesh を使用すると、重み付けされたトラフィック分割やグローバル ロード バランシングなどのメッシュの高度なトラフィック管理機能を有効にできます。また、Cloud Run サービス間のトラフィックのオブザーバビリティとセキュリティ ポリシーも有効にできます。また、独自のサービス メッシュ サイドカーを維持する運用の負担を軽減する、フルマネージドのデータプレーン ソリューションも提供します。
始める前に
Cloud Service Mesh に関する知識。
プロジェクトを設定します。
gcloud config set core/project
PROJECT_NAME
Google Cloud コンソールで、プロジェクトに対して次の API を有効にします。
サーバーレス VPC アクセス API: ネットワーク下り(外向き)にダイレクト VPC ではなく、サーバーレス VPC アクセス コネクタを使用している場合。
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 のサービス ルーティング 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
. \ --networks=default \ --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
: メッシュ リソース名。
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_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
: リージョンの名前。
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 テストアプリを使用して、リクエストを宛先ルートに転送します。
次のコマンドを実行して、作成した 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
: プロジェクトの名前。
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 プロキシを設定する