借助环境网络上的 Express Link,您可以将源 Cloud Run 服务连接到同一项目和区域中的目标 Cloud Run 服务,而无需在应用中编写身份验证代码或配置服务网格。
当 Cloud Run 服务调用另一个受 Identity and Access Management (IAM) 保护的 Cloud Run 服务时,请求必须包含 OpenID Connect (OIDC) ID 令牌,以便目标服务可以验证调用方的身份和权限。如果没有 express link,您必须在应用中编写服务到服务身份验证代码,以从元数据服务器提取和附加令牌,或者配置 Cloud Service Mesh 资源,例如虚拟私有云 (VPC) 网络、后端服务和路由规则。express link 会将此身份验证和路由工作分流到全代管式环境边车容器,从而使您的应用代码保持可移植性并专注于业务逻辑。
使用场景
您可以在以下场景中使用 express link:
- 从应用代码中卸载服务到服务身份验证:通过纯 HTTP 将调用的 Cloud Run 服务连接到受 IAM 保护的目标 Cloud Run 服务。环境边车会自动提取并注入源服务的 OIDC ID 令牌,并通过 HTTPS 对请求进行加密。
- 使用自定义主机名抽象化目标网址:使用
--matches-hostname标志在 express link 上配置自定义主机名,以便源应用向逻辑地址(例如http://my-backend)发送请求,而不是对目标的确定性网址进行硬编码。如果目标服务发生变化,您可以重新创建 express link 以指向新目标,而无需修改或重新部署源应用代码。 - 简化点对点服务调用,无需服务网格:在 Cloud Run 服务之间自动注入凭据,无需预配 VPC 网络、网络端点组、后端服务或 Cloud Service Mesh 所需的 Cloud DNS 记录。
下表比较了在不使用和使用 express link 的情况下,设置经过身份验证的服务到服务通信的步骤:
| 步骤 | 不使用 express link | 使用 express link |
|---|---|---|
| 1. 部署目标服务 | 部署需要 IAM 身份验证 (--no-allow-unauthenticated) 的目标 Cloud Run 服务。 |
相同。 |
| 2. 授予调用方权限 | 向来源服务的服务账号授予目标服务的 Cloud Run Invoker (roles/run.invoker) 角色。 |
相同。 |
| 3. 配置出站请求 | 在源应用中编写代码,以提取目标网址的 OIDC ID 令牌,并通过 HTTPS 将其附加到 Authorization: Bearer 标头。 |
在源应用中,向目标网址或自定义主机名发送不含身份验证码的普通 http:// 请求。 |
| 4. 部署源服务 | 部署源 Cloud Run 服务。 | 部署启用了 Ambient Networking 的源 Cloud Run 服务,然后在已部署的源服务和目标服务之间创建 Express Link。 |
架构
在源 Cloud Run 服务上启用 Ambient Networking 并创建 Express Link 后,Cloud Run 会配置全代管式 Envoy 边车容器,该容器在每个容器实例中与应用容器一起运行。
当您的应用向目标服务的确定性网址或您在 express link 上配置的自定义主机名发送纯文本 HTTP 请求时,环境边车容器会自动执行以下操作:
- 拦截发往目标服务的出站 HTTP 请求。
- 提取来源服务的服务账号的 OIDC ID 令牌,并将其注入
Authorization标头。 - 通过 HTTPS(单向 TLS)加密请求并将其转发到目标 Cloud Run 服务,该服务会验证调用方的 IAM 权限。
网络连接和数据平面
express link 会在 ambient sidecar 中配置出站请求拦截和凭证注入,但不会替换服务之间的底层网络路径。您仍必须确保源服务可以访问目标服务的入站流量路径:
- 目标入站流量设置为全部:源服务上不需要 VPC 网络或出站流量配置。
- 目标入站流量设置为内部或内部和 Cloud 负载均衡器: 您必须使用 直接 VPC 出站流量或 无服务器 VPC 访问通道连接器 (启用了专用 Google 访问通道 ) 通过授权的 VPC 网络路由来自源服务的出站流量。如需了解详情,请参阅接收来自其他 Cloud Run 服务的请求。
准备工作
- 登录您的 Google Cloud 账号。如果您是 Google Cloud新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
启用 Cloud Run、Network Services 和 Traffic Director API(如果尚未启用)。
启用 API 所需的角色
如需启用 API,您需要拥有
serviceusage.services.enable权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 拥有此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色。- 确保您在同一项目和区域中有一个现有的源 Cloud Run 服务和一个现有的目标 Cloud Run 服务。
- 确保在源 Cloud Run 服务上启用了 Ambient Networking,并设置了
global范围。例如,运行gcloud beta run services update SOURCE_SERVICE --ambient-networking --ambient-scope=global --region=REGION,请记得先提高服务的 CPU 和内存限制。 -
请参阅 Cloud Run 价格页面,了解 Ambient Networking 边车使用情况。在预览版期间,系统不会对环境功能强制执行结算。
所需的角色
如需获得配置 express link 所需的权限,请让您的管理员为您授予以下 IAM 角色:
-
配置 express link:项目的 Cloud Run Developer (
roles/run.developer) 和 Service Account User (roles/iam.serviceAccountUser) -
管理 express link 资源:项目的 Network Services Admin (
roles/networkservices.admin)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
来源 Cloud Run 服务的服务身份还必须在项目中具有以下角色:
- Traffic Director Client (
roles/trafficdirector.client) - Cloud Trace Agent (
roles/cloudtrace.agent)
如需向服务身份授予这些角色,请使用 gcloud:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:RUN_CLIENT_SA@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/trafficdirector.client" gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:RUN_CLIENT_SA@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/cloudtrace.agent"
替换以下内容:
- PROJECT_ID:您的 Google Cloud 项目 ID。
- RUN_CLIENT_SA:附加到源 Cloud Run 服务的服务账号的名称。
如果 Cloud Run 服务身份缺少这些角色,Cloud Run 服务仍会部署,但依赖于 Ambient Networking 的功能将无法正常运行。此行为与 Cloud Service Mesh 不同,后者在缺少所需角色时无法部署 Cloud Run 服务。
限制
express link 存在以下限制:
- 仅支持将 Cloud Run 服务作为来源和目标资源。不支持 Cloud Run 作业、工作器池和实例。
- 不支持跨项目和跨区域配置。源 Cloud Run 服务和目标 Cloud Run 服务必须位于同一项目和区域中。
- Express link 需要在源 Service 上使用
global范围的Ambient Networking。如果源服务使用regional范围,则创建 express link 会成功,但流量不会路由。 - 您必须先创建来源和目标 Cloud Run 服务,然后才能创建 Express Link。不支持无序创建。如果您删除目标服务,express link 可能会继续显示并使用过时的配置,直到您删除或重新创建 express link。
- 您无法就地更新现有 express link 的来源服务、目标服务或自定义主机名。
gcloud beta network-services express-links update命令仅会更新 express link 说明。如需更改路由配置,请删除并重新创建 express link。 - 目标 Cloud Run 服务必须启用默认
run.app网址,即使您使用自定义网址、自定义网域或使用--matches-hostname标志配置自定义主机名也是如此。 - 发送到目标非确定性网址的请求不会被拦截,并且会失败并显示
403 Forbidden错误。如果目标服务没有确定性网址,因为服务名称和项目编号的组合超过 63 个字符,则您必须指定--matches-hostname,否则 express link 创建会失败并显示Cloud Run Service name is too long错误。 - 当您查看 express link 的完整状态时,系统只会返回目标服务信息。有关来源 Cloud Run 修订版本和协商身份验证的详细信息可能缺失或显示过时数据。这不会影响 express link 路由或对流量进行身份验证的方式。
- 不支持配置了代理身份和 mTLS 绑定令牌的源 Cloud Run 服务。
- 不支持配置为通过 Cloud Run 上的 Agent Gateway 和 Secure Web Proxy 路由出站流量的来源 Cloud Run 服务。Express Link 需要全局 Ambient Networking 范围,而 Agent Gateway 需要区域级范围。
- 如果来自源服务的出站请求已包含
Authorization标头,则 express link 会在不更改该标头的情况下转发请求,并且不会注入令牌。不支持将令牌自动注入X-Serverless-Authorization标头。 - 不支持从 Cloud Run 沙盒容器生成的流量。
- 您无法使用 express link 将流量转发到受 Identity-Aware Proxy 保护的目标 Cloud Run 服务。
- 每个 express link 支持一个目标 Cloud Run 服务,每个项目最多可以创建 5,000 个 express link。
配置 express link
如需连接 Cloud Run 服务,请创建一个 express link,指定源服务和目标服务,然后为目标服务授予 Cloud Run Invoker 角色。
连接到其他 Cloud Run 服务
如需将来源 Cloud Run 服务连接到目标 Cloud Run 服务,请使用 gcloud 或 YAML 创建 express link。
gcloud
使用 gcloud beta network-services express-links create 命令创建 express link:
gcloud beta network-services express-links create EXPRESS_LINK_NAME \ --location=global \ --source-services=//run.googleapis.com/projects/PROJECT_ID/locations/REGION/services/SOURCE_SERVICE \ --destination-services=//run.googleapis.com/projects/PROJECT_ID/locations/REGION/services/DESTINATION_SERVICE
替换以下内容:
- EXPRESS_LINK_NAME:express link 的名称。
- PROJECT_ID:您的 Google Cloud 项目 ID。
- REGION:Cloud Run 服务部署到的区域。
- SOURCE_SERVICE:来源 Cloud Run 服务的名称。
- DESTINATION_SERVICE:目标 Cloud Run 服务的名称。
命令完成后,路由配置最多可能需要 2 分钟才能传播到正在运行的源服务实例。
默认情况下,express link 仅拦截发送到目标服务的确定性网址的请求,而不拦截发送到其非确定性网址的请求。如需使用自定义主机名,请在 --matches-hostname="HOSTNAME" 标志中传递不带架构的主机名(例如 --matches-hostname="DESTINATION_SERVICE"),然后将请求从源应用发送到 http://HOSTNAME。指定 --matches-hostname 会替换确定性网址,而不是向其添加内容。
YAML
创建配置文件,例如
express-link.yaml:name: "projects/PROJECT_ID/locations/global/expressLinks/EXPRESS_LINK_NAME" source: services: - "//run.googleapis.com/projects/PROJECT_ID/locations/REGION/services/SOURCE_SERVICE" destination: services: - "//run.googleapis.com/projects/PROJECT_ID/locations/REGION/services/DESTINATION_SERVICE"
替换以下内容:
- PROJECT_ID:您的 Google Cloud 项目 ID。
- REGION:服务部署到的区域。
- EXPRESS_LINK_NAME:express link 的名称。
- SOURCE_SERVICE:来源 Cloud Run 服务的名称。
- DESTINATION_SERVICE:目标 Cloud Run 服务的名称。
使用
gcloud beta network-services express-links import命令导入 YAML 文件:gcloud beta network-services express-links import EXPRESS_LINK_NAME \ --location=global \ --source=YAML_FILENAME.yaml
替换以下内容:
- EXPRESS_LINK_NAME:express link 的名称。
- YAML_FILENAME:YAML 文件的名称。
向目标服务授予调用者权限
如需让源服务调用受 IAM 保护的目标服务,请向目标 Cloud Run 服务上的源服务服务账号授予 Cloud Run Invoker (roles/run.invoker) 角色。这是在数据平面中进行身份验证所必需的。
gcloud run services add-iam-policy-binding DESTINATION_SERVICE \ --member="serviceAccount:SOURCE_SA@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/run.invoker" \ --region=REGION
替换以下内容:
- DESTINATION_SERVICE:目标 Cloud Run 服务的名称。
- SOURCE_SA:附加到源 Cloud Run 服务的服务账号的名称。
- PROJECT_ID:您的 Google Cloud 项目 ID。
- REGION:目标服务部署到的区域。
验证 express link 状态
如需查看 express link 的基本配置,请使用 gcloud beta network-services express-links describe 命令:
gcloud beta network-services express-links describe EXPRESS_LINK_NAME \ --location=global
如需查看 express link 的完整状态,包括 connectionStatus(有效路由类型、匹配的主机名和来源修订版本 URI)和 cloudRunSourceInfo(配置的身份验证方法和 VPC 网络),请在资源名称中添加 ?view=EXPRESS_LINK_VIEW_FULL#:
gcloud beta network-services express-links describe 'EXPRESS_LINK_NAME?view=EXPRESS_LINK_VIEW_FULL#' \ --location=global
将 EXPRESS_LINK_NAME 替换为 express link 的名称。查询完整视图时,请保留单引号和尾随的 # 字符。
删除或重新创建 express link
如需移除 express link 并停止从来源服务自动注入凭据和拦截流量,请使用 gcloud beta network-services express-links delete 命令:
gcloud beta network-services express-links delete EXPRESS_LINK_NAME \ --location=global
将 EXPRESS_LINK_NAME 替换为 express link 的名称。
如需将现有 express link 指向其他目标服务或更改 --matches-hostname 设置,请使用上述命令删除该 express link,然后使用更新后的配置创建新的 express link。
后续步骤
- 了解如何为 Cloud Run 服务配置 Ambient Networking。
- 了解 Cloud Run 上的 Agent Gateway。
- 了解 Cloud Run 中的服务到服务身份验证。
- 了解如何为 Cloud Run 服务限制网络端点入站流量。