配置 Cloud Service Mesh Cloud Run
本页介绍了如何配置 Cloud Service Mesh,以便在一系列计算基础架构上运行 Cloud Run 服务。
借助 Cloud Service Mesh,您可以启用网格高级流量管理功能,例如加权流量分割和全局负载均衡,以及从一个 Cloud Run 服务到另一个 Cloud Run 服务的流量的可观察性和安全性策略。此外,这还提供了一个全托管式数据平面解决方案,可消除维护自己的服务网格 Sidecar 的运维负担。
准备工作
熟悉 Cloud Service Mesh。
设置项目:
gcloud config set core/project
PROJECT_ID
在 Google Cloud 控制台中,为您的项目启用以下 API:
无服务器 VPC 访问通道 API(如果您使用的是无服务器 VPC 访问通道连接器,而不是直接 VPC 出站流量)。
将
gcloud
组件更新到最新版本(488.0.0 或更高版本):gcloud components update
所需的角色
获取配置和部署 Cloud Run 所需的权限 服务,请让管理员授予您以下 IAM 角色:
- Cloud Run 开发者
针对 Cloud Run 服务执行的 (
roles/run.developer
) - 服务身份的 Service Account User (
roles/iam.serviceAccountUser
) 角色
Cloud Run 客户端的服务账号还必须具有 以下角色:
- Traffic Director 客户端 (
roles/trafficdirector.client
),用于访问服务路由 API - Cloud Trace Agent (
roles/cloudtrace.agent
),用于启用跟踪
如需查看与 Cloud Run 关联的 IAM 角色和权限的列表,请参阅 Cloud Run IAM 角色和 Cloud Run IAM 权限。如果您的 Cloud Run 服务与 Google Cloud API(例如 Cloud 客户端库)进行交互,请参阅服务身份配置指南。如需详细了解如何授予角色,请参阅部署权限和管理访问权限。
使用 Cloud Service Mesh 在 Cloud Run 服务之间调用
Cloud Run 使用 Cloud Service Mesh 服务路由 API。借助这些 API,Cloud Run 服务可以调用
Cloud Run 服务使用自定义网址,而不是
提供的 run.app
网址。此外,Cloud Run 会自动对目标 Cloud Run 服务进行身份验证,因此您无需配置自己的身份验证即可将请求凭据附加到其他 Cloud Run 服务。
如需使用 Cloud Service Mesh 从一个 Cloud Run 服务调用另一个 Cloud Run 服务,请按以下步骤操作:
设置 Cloud Service Mesh
如需使用默认网址创建服务路线,请将
Mesh
规范保存在名为mesh.yaml
的文件中:name:
MESH_NAME
将
MESH_NAME
替换为 网格资源 名称。运行以下命令,从规范导入
Mesh
资源 命令:gcloud network-services meshes import
MESH_NAME
\ --source=mesh.yaml \ --location=global将
MESH_NAME
替换为网格资源名称。
设置 Cloud DNS
如果您使用的是 Private Service Connect 端点,且将完整的 run.app
网址作为主机名,则可以跳过 Cloud DNS 设置并前往下一部分,因为系统只会捕获专用 IP 地址。
当网格客户端调用目标服务时,主机名 必须可通过 DNS 解析。任何有效的 RFC 1918 IP 地址均可接受,因为边车会捕获发送到这些 IP 地址范围的所有 IP 流量,并进行适当的重定向。
以下示例展示了如何在 Cloud DNS 中创建通配符 *
条目
解析为单个 IP 地址的可用区。如果您不想使用
Cloud DNS 区域,创建一个 Cloud DNS 条目
每个主机名
与您要添加到 Cloud Run 的
从网格寻址
如需在专用区域中创建 Cloud DNS 记录,请运行以下命令:
在 Cloud DNS 中为服务网格创建一个私有托管 DNS 区域。
gcloud dns managed-zones create
MESH_NAME
\ --description="Domain forDOMAIN_NAME
service mesh routes" \ --dns-name=DOMAIN_NAME
. \ --networks=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 允许您将传入的网络流量限制为 “internal”如果您的服务启用了此入站流量限制,那么当您启用 Cloud Run 的访问路径时,从网格通过 Virtual Private Cloud 网络传输的流量可以设置为“内部”。
如需使用 Cloud Service Mesh 访问内部服务,请使用以下方法之一:
- 为您的 VPC 网络配置专用 Google 访问通道。 您无需设置自定义 DNS 记录。
- 将 Private Service Connect 端点附加到 Cloud Service Mesh。
这需要为默认
*.run.app
网址设置自定义 DNS 记录,才能使用 Private Service Connect 端点地址。
创建目标 Cloud Run 服务
请注意,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_SERVICE_NAME
-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_MANAGED将
DESTINATION_SERVICE_NAME
替换为目标服务的名称,并将REGION
替换为区域的名称。将无服务器后端添加到后端服务:
gcloud compute backend-services add-backend
DESTINATION_SERVICE_NAME
-REGION
\ --global \ --network-endpoint-group=DESTINATION_SERVICE_NAME
-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>
网址,而不考虑存储分区的区域和项目 调用方。如果您已将 Cloud DNS 设置为使用专用 IP 地址,路由主机名也可以是完整的run.app
网址地址,在这种情况下,您可以跳过 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 Invoker 角色 (
roles/iam.invoker
) 调用 Cloud Run 目标服务, 运行以下命令: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 服务会创建一个 Envoy 边车,其资源与 QPS 和总配置大小相关。大部分 CPU 使用率低于 vCPU 的 1%,且内存使用量低于 50 MB。
您必须拥有网络出站流量访问权限 虚拟私有云网络
如需创建用于测试的客户端服务,请在 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 客户端服务的网址:
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 实例。