您可以启用 Cloud Run 服务或作业,以通过直接 VPC 出站流量将流量发送到共享 VPC 网络,而无需无服务器 VPC 访问通道连接器。
本页面介绍了如何配置 Cloud Run 的 IAM 权限以使用共享 VPC 网络的子网,然后将服务或作业置于共享子网上。
准备工作
使用直接 VPC 出站流量时,请确保您的子网至少具有数百个可用的 IP 地址。如果所有 Cloud Run 服务中的实例总数超过 100 个,我们建议至少有总数 4 倍 (4X) 的地址可用。
限制
以下限制同时适用于 Cloud Run 服务和作业:
- Cloud Run 支持每个实例具有高达 1 Gbps 的吞吐量。超过此数量会导致性能限制。
Cloud Run 用量配额限制了您可以配置为使用直接 VPC 出站流量的实例数上限。数量上限为每个 Cloud Run 修订版本或作业执行配置。如需提高默认限制,请参阅如何增加配额。您可以使用 Google Cloud 控制台查看您的配额。
- 在网络基础设施维护事件期间,Cloud Run 服务和作业可能会遇到连接中断。我们建议您使用可以处理偶尔的连接重置的客户端库。
- Cloud Run 作业的直接 VPC 出站流量仅在预览版中可用。
- 为了确保作业正确执行,请仅为不需要超过 8 个并发实例的作业使用直接 VPC 出站流量,并确保至少预留 1,024 个 IP 地址。
直接 VPC 出站流量不支持以下各项:
- VPC 流日志不提供 Cloud Run 服务的名称或修订版本。
- 非虚拟机资源(如 Cloud Run 或本地机器)不会报告 VPC 流日志。
- 防火墙规则日志记录
- 数据包镜像
- Network Intelligence Center
- IPv6 流量
- Private NAT
- 在应用于目标资源的入站防火墙规则中使用网络标记。
- 在应用于目标资源的入站防火墙规则中使用服务身份作为来源服务账号。
- 防火墙规则不能使用附加到 Cloud Run 工作负载的 Resource Manager 标记。
- 运行时间超过 1 小时的 Cloud Run 作业可能会遇到连接中断。在将作业从一个机器迁移到另一个机器的维护事件中,可能会发生这种情况。容器会在事件发生前 10 秒收到
SIGTSTP
信号,在事件之后收到SIGCONT
信号。容器收到SIGCONT
信号后,请重试连接。
设置 IAM 权限
您必须先确保 Cloud Run 服务代理具有使用子网的足够权限,然后才能使共享 VPC 服务项目中的 Cloud Run 能够访问共享 VPC 网络。
如需访问共享 VPC 网络,请通过添加以下角色之一向 Cloud Run 服务代理授予足够的权限:
共享 VPC 宿主项目上的 Compute Network User (
compute.networkUser
)。例如,运行以下命令:
gcloud projects add-iam-policy-binding HOST_PROJECT_ID \ --member "serviceAccount:service-SERVICE_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com" \ --role "roles/compute.networkUser"
请替换以下内容:
- HOST_PROJECT_ID:共享 VPC 宿主项目的 ID。
- SERVICE_PROJECT_NUMBER:您在其中部署 Cloud Run 服务或作业的共享 VPC 服务项目的编号。
共享 VPC 宿主项目的 Compute Network Viewer (
compute.networkViewer
) 和共享 VPC 子网的 Compute Network User (compute.networkUser
) 角色。例如,如需在子网上授予 Compute Network Viewer 角色,请运行以下命令:
gcloud compute networks subnets add-iam-policy-binding SUBNET_NAME \ --region REGION \ --member "serviceAccount:service-SERVICE_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com" \ --role "roles/compute.networkUser" \ --project HOST_PROJECT_ID
替换以下内容:
- SUBNET_NAME:您要运行 Cloud Run 服务的子网的完全限定资源名称。
- REGION:Cloud Run 服务所在的区域,该区域必须与子网的区域一致。
- SERVICE_PROJECT_NUMBER:您在其中部署 Cloud Run 服务或作业的共享 VPC 服务项目的编号。
- HOST_PROJECT_ID:共享 VPC 宿主项目的 ID。
Cloud Run 服务代理需要您的 Cloud Run 项目的 Cloud Run Service Agent 角色。您可以通过运行以下命令来验证是否未手动移除该角色:
gcloud projects get-iam-policy SERVICE_PROJECT_ID \ --flatten bindings \ --filter "bindings.role:roles/run.serviceAgent"
将 SERVICE_PROJECT_ID 替换为 Cloud Run 服务或作业的项目 ID。
如需进行更精细的控制,您可以确保 Cloud Run 服务代理具有以下权限:
- 共享 VPC 宿主项目的
compute.networks.get
权限 - 宿主项目或特定子网的
compute.subnetworks.get
权限 - 宿主项目或特定子网的
compute.subnetworks.use
权限 - 共享 VPC 服务项目的
compute.addresses.get
权限 - 共享 VPC 服务项目的
compute.addresses.list
权限 - 共享 VPC 服务项目的
compute.addresses.createInternal
权限 - 共享 VPC 服务项目的
compute.addresses.deleteInternal
权限
IP 地址分配
如需将 Cloud Run 服务或作业置于 VPC 网络中,您必须指定网络和子网。Cloud Run 会分配子网中的 IP 地址。
IP 地址是临时性的,因此请勿基于各个 IP 创建政策。如果您需要基于 IP 创建政策(例如防火墙规则),则必须使用整个子网的 IP 地址范围。
如需更改服务或作业使用的网络或子网,请部署新的服务修订版本或执行使用新的网络和子网值的新作业任务。
纵向扩容
为在发生流量激增时实现快速扩容,Cloud Run 会在需要 IP 地址之前进行分配。
在任何给定时间,已分配的 IP 地址数量都可能超过存在的实例数量。为了确保 Cloud Run 能够获取足够的 IP 地址,请确保子网至少具有数百个可用的 IP 地址。如果所有 Cloud Run 服务和作业的子网实例总数超过 100 个,我们建议至少有总数 4 倍 (4X) 的地址可用。如果 Cloud Run 无法分配更多 IP 地址,则除非更多 IP 地址变为可用,否则无法再启动更多服务实例或作业任务。如果您的 IP 地址空间有限,请参阅支持的 IP 范围以了解更多选项。为了提高 IP 分配效率和易于管理,请将多个服务或作业置于同一子网中。
纵向缩容
即使在所有服务或作业都缩减到零之后,Cloud Run 也会从子网预留一些 IP 地址,最长可达 20 分钟,以防服务或作业必须再次快速扩容。每个实例都需要一个 IP 地址,但 Cloud Run 会在开始时预留至少 /28
子网掩码。用完所有 16 个实例后,Cloud Run 会创建一个新子网。
如需删除子网,您必须先删除或重新部署 Cloud Run 服务或作业以停止使用子网,然后等待 1-2 小时。
支持的 IP 范围
Cloud Run 支持子网的以下 IPv4 范围:
- RFC 1918(推荐)
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
- RFC 6598
100.64.0.0/10
- E 类(本地设置不推荐使用)
240.0.0.0/4
部署服务
借助直接 VPC 出站流量,您的 Cloud Run 服务可以将流量发送到没有无服务器 VPC 访问通道连接器的共享 VPC 网络。与服务本身一样,网络费用缩减至零。您还可以直接在 Cloud Run 服务修订版本上添加网络标记,以实现更精细的网络安全性,例如应用 VPC 防火墙规则。
您可以使用 Google Cloud 控制台、Google Cloud CLI 或 YAML 通过服务配置直接 VPC 出站流量。
控制台
在 Google Cloud 控制台中,转到 Cloud Run 页面。
如果您要配置新服务,请点击部署容器,然后选择服务。如果您要配置和部署现有服务,请点击该服务,然后点击修改和部署新的修订版本。
如果您要配置新服务,请根据需要填写初始服务设置页面,然后点击容器、卷、网络、安全性以展开服务配置页面。
点击网络标签页。
点击连接到 VPC 以发送出站流量。
点击将流量直接发送到 VPC。
选择与我共享的网络。
在网络字段中,选择您要向其发送流量的共享 VPC 网络。
在子网字段中,选择您的服务用于接收 IP 地址的子网。
可选:输入要与服务关联的网络标记的名称。网络标记在修订版本级指定。每个服务修订版本都可以有不同的网络标记,例如
network-tag-2
。在流量路由部分,选择以下选项之一:
- 仅将请求路由到 VPC 的专用 IP,以便通过共享 VPC 网络将流量仅发送到内部地址。
- 将所有流量路由到 VPC,以通过共享 VPC 网络发送所有出站流量。
点击创建或部署。
如需验证您的服务是否在共享 VPC 网络上,请点击该服务,然后点击网络标签页。VPC 卡片中列出了网络和子网。
现在,您可以根据防火墙规则允许将来自 Cloud Run 服务的请求发送到共享 VPC 网络上的任何资源。
gcloud
如需将服务置于共享子网上,请运行以下命令为共享 VPC 网络和子网指定完全限定的资源名称:
gcloud run deploy SERVICE_NAME \ --image IMAGE_URL \ --network projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK \ --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME \ --network-tags NETWORK_TAG_NAMES \ --vpc-egress=EGRESS_SETTING \ --region REGION \ --max-instances MAX
请替换以下内容:
- SERVICE_NAME:Cloud Run 服务的名称。
- IMAGE_URL:服务的映像网址。
- HOST_PROJECT_ID:共享 VPC 项目的 ID。
- VPC_NETWORK:共享 VPC 网络的完全限定资源名称。
- REGION:Cloud Run 服务所在的区域,该区域必须与子网的区域一致。
- SUBNET_NAME:子网的完全限定资源名称。
- 可选:将 NETWORK_TAG_NAMES 替换为要与服务关联的网络标记的名称。对于服务,网络标记在修订版本级指定。每个服务修订版本都可以有不同的网络标记,例如
network-tag-2
。 - 将 EGRESS_SETTING 替换为出站流量设置值:
all-traffic
:通过共享 VPC 网络发送所有出站流量。private-ranges-only
:仅发送通过共享 VPC 网络发送到内部地址的流量。
- MAX:用于共享 VPC 网络的实例数上限。服务允许的实例数上限为 100。
如需了解详情和可选的参数,请参阅 gcloud
参考文档。
YAML
如果您要创建新的服务,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置:
gcloud run services describe SERVICE --format export > service.yaml
更新以下属性:
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE_NAME labels: cloud.googleapis.com/location: REGION spec: template: metadata: annotations: run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET","tags":"NETWORK_TAG_NAMES"}]' run.googleapis.com/vpc-access-egress: EGRESS_SETTING spec: containers: - image: IMAGE
您需要进行如下替换:
- 将 SERVICE_NAME 替换为您的 Cloud Run 服务的名称。服务名称不得超过 49 个字符,并且在每个区域和项目中必须是唯一的。
- 将 REGION 替换为 Cloud Run 服务的区域,该区域必须与子网的区域一致。
- 将 NETWORK 替换为共享 VPC 网络的完全限定资源名称。
- 将 SUBNET_NAME 替换为子网的完全限定资源名称。
- 可选:将 NETWORK_TAG_NAMES 替换为要与服务关联的网络标记的名称。对于服务,网络标记在修订版本级指定。每个服务修订版本都可以有不同的网络标记,例如
network-tag-2
。 - 将 EGRESS_SETTING 替换为出站流量设置值:
all-traffic
:通过共享 VPC 网络发送所有出站流量。private-ranges-only
:仅发送通过共享 VPC 网络发送到内部地址的流量。
- 将 IMAGE 替换为服务容器映像的网址。
使用以下命令创建或更新服务:
gcloud run services replace service.yaml
Terraform
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
请将以下内容添加到
main.tf
文件:
(可选)如果您想允许对服务进行未经身份验证的访问,请将服务设为公开。
创建作业
借助直接 VPC 出站流量,您的 Cloud Run 作业可以将流量发送到没有无服务器 VPC 访问通道连接器的共享 VPC 网络。 您还可以直接在 Cloud Run 作业上添加网络标记,以实现更精细的网络安全性,例如应用 VPC 防火墙规则。
您可以使用 Google Cloud 控制台、Google Cloud CLI 或 YAML 通过作业配置直接 VPC 出站流量。
控制台
在 Google Cloud 控制台中,转到 Cloud Run 页面。
如果您要配置新作业,请点击部署容器,然后选择作业,根据需要填写初始创建作业表单。如果要配置现有作业,请点击作业标签页,选择一个作业,然后点击修改。
点击容器、变量和 Secret、连接、安全性以展开作业属性页面。
点击连接标签页。
点击连接到 VPC 以获取出站流量。
点击将流量直接发送到 VPC。
选择与我共享的网络。
在网络字段中,选择您要向其发送流量的共享 VPC 网络。
在子网字段中,选择您的作业用于接收 IP 地址的子网。
可选:输入要与作业关联的网络标记的名称。对于作业,网络标记在执行级指定。每个作业执行都可以具有不同的网络标记,例如
network-tag-2
。在流量路由部分,选择以下选项之一:
- 仅将请求路由到 VPC 的专用 IP,以便通过共享 VPC 网络将流量仅发送到内部地址。
- 将所有流量路由到 VPC,以通过共享 VPC 网络发送所有出站流量。
点击创建或更新。
如需验证您的作业是否在共享 VPC 网络上,请点击该作业,然后点击配置标签页。VPC 卡片中列出了网络和子网。
现在,您可以根据防火墙规则允许执行 Cloud Run 作业,并将作业的请求发送到共享 VPC 网络上的任何资源。
gcloud
如需将作业置于共享子网上,请运行以下命令为共享 VPC 网络和子网指定完全限定的资源名称:
gcloud run jobs create JOB_NAME \ --image IMAGE_URL \ --network projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK \ --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME \ --network-tags NETWORK_TAG_NAMES \ --vpc-egress=EGRESS_SETTING \ --region REGION \
请替换以下内容:
- JOB_NAME:Cloud Run 作业的名称
- IMAGE_URL:作业的图片网址。
- HOST_PROJECT_ID:共享 VPC 宿主项目的 ID。
- VPC_NETWORK:共享 VPC 网络的完全限定资源名称。
- REGION:Cloud Run 作业所在的区域,该区域必须与子网的区域一致。
- SUBNET_NAME:子网名称的完全限定资源名称。
- 可选:将 NETWORK_TAG_NAMES 替换为要与作业关联的网络标记的名称。每个作业执行都可以具有不同的网络标记,例如
network-tag-2
。 - 将 EGRESS_SETTING 替换为出站流量设置值:
all-traffic
:通过共享 VPC 网络发送所有出站流量。private-ranges-only
:仅发送通过共享 VPC 网络发送到内部地址的流量。
如需了解详情和可选的参数,请参阅 gcloud
参考文档。
YAML
如果您要创建新的作业,请跳过此步骤。如果您要更新现有作业,请下载其 YAML 配置:
gcloud run jobs describe JOB_NAME --format export > job.yaml
更新以下属性:
apiVersion: run.googleapis.com/v1 kind: Job metadata: name: JOB_NAME annotations: run.googleapis.com/launch-stage: BETA labels: cloud.googleapis.com/location: REGION spec: template: metadata: annotations: run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET","tags":"NETWORK_TAG_NAMES"}]' run.googleapis.com/vpc-access-egress: EGRESS_SETTING spec: containers: - image: IMAGE
您需要进行如下替换:
- 将 JOB_NAME 替换为 Cloud Run 作业的名称。 作业名称不得超过 49 个字符,并且在每个区域和项目中必须是唯一的。
- 将 REGION 替换为 Cloud Run 作业的区域,该区域必须与子网的区域一致。
- 将 NETWORK 替换为共享 VPC 网络的完全限定资源名称。
- 将 SUBNET 替换为子网的完全限定资源名称。
- 可选:将 NETWORK_TAG_NAMES 替换为要与作业关联的网络标记的名称。对于作业,网络标记在执行级指定。每个作业执行都可以具有不同的网络标记,例如
network-tag-2
。 - 将 EGRESS_SETTING 替换为出站流量设置值:
all-traffic
:通过共享 VPC 网络发送所有出站流量。private-ranges-only
:仅发送通过共享 VPC 网络发送到内部地址的流量。
- 将 IMAGE 替换为作业容器映像的网址。
使用以下命令创建或更新作业:
gcloud run jobs replace job.yaml
断开服务连接
控制台
如需从共享 VPC 网络中移除服务,请执行以下操作:
在 Google Cloud 控制台中,转到 Cloud Run 页面。
点击要移除的服务,然后点击修改和部署新的修订版本。
点击网络标签页。
清除连接到 VPC 以获取出站流量。
点击部署。
如需验证您的服务是否不再位于共享 VPC 网络上,请点击网络标签页。VPC 卡片中不再列出网络和子网。
如需仅移除网络标记,同时保持服务与共享 VPC 网络的连接,请执行以下操作:
点击包含要移除的网络标记的服务,然后点击修改和部署新的修订版本。
点击网络标签页。
清除您不再希望与服务关联的网络标记的名称。
点击部署。
gcloud
如需从共享 VPC 网络中移除服务,请运行以下命令:
gcloud run services update SERVICE_NAME --region=REGION \ --clear-network
如需仅移除网络标记,同时保持服务与共享 VPC 网络的连接,请运行以下命令:
gcloud run services update SERVICE_NAME --region=REGION \ --clear-network-tags
请替换以下内容:
- SERVICE_NAME:Cloud Run 服务的名称。
- REGION:Cloud Run 服务的区域。
YAML
如需从共享 VPC 网络中移除服务,请执行以下操作:
下载服务的 YAML 配置:
gcloud run services describe SERVICE_NAME --format export > service.yaml
从
service.yaml
文件中移除以下内容:run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET","tags":"NETWORK_TAG_NAMES"}]'
地点
- NETWORK:共享 VPC 网络的完全限定资源名称。
- SUBNET:子网的完全限定资源名称。
- 可选:NETWORK_TAG_NAMES:网络标记的名称(如果已将其与服务关联)。
使用以下命令更新服务:
gcloud run services replace service.yaml
如需仅移除网络标记,同时保持服务与共享 VPC 网络的连接,请执行以下操作:
下载服务的 YAML 配置:
gcloud run services describe SERVICE_NAME --format export > service.yaml
从
service.yaml
文件的内容中移除tags
变量,并保持network
和subnetwork
变量不变,如以下示例所示:run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET"}]'
替换以下内容:
- NETWORK:共享 VPC 网络的完全限定资源名称。
- SUBNET:子网的完全限定资源名称。
使用以下命令更新服务:
gcloud run services replace service.yaml
断开连接作业
控制台
如需从共享 VPC 网络中移除作业,请执行以下操作:
在 Google Cloud 控制台中,转到 Cloud Run 页面。
点击要移除的作业,然后点击修改和部署新的修订版本。
点击配置标签页。
清除连接到 VPC 以获取出站流量。
点击更新。
如需验证您的作业是否不再位于共享 VPC 网络上,请点击配置标签页。VPC 卡片中不再列出网络和子网。
如需仅移除网络标记,同时保持作业与共享 VPC 网络的连接,请执行以下操作:
点击包含要移除的网络标记的作业,然后点击修改和部署新的修订版本。
点击连接标签页。
清除您不再希望与作业关联的网络标记的名称。
点击更新。
gcloud
如需从共享 VPC 网络中移除作业,请运行以下命令:
gcloud run jobs update JOB_NAME --region=REGION \ --clear-network
如需仅移除网络标记,同时保持作业与共享 VPC 网络的连接,请运行以下命令:
gcloud run jobs update JOB_NAME --region=REGION \ --clear-network-tags
请替换以下内容:
- JOB_NAME:Cloud Run 作业的名称
- REGION:Cloud Run 作业所在的区域。
YAML
如需从共享 VPC 网络中移除作业,请执行以下操作:
下载作业的 YAML 配置:
gcloud run jobs describe JOB_NAME --format export > job.yaml
从
job.yaml
文件中移除以下内容:run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET","tags":"NETWORK_TAG_NAMES"}]'
地点
- NETWORK:共享 VPC 网络的完全限定资源名称。
- SUBNET:子网的完全限定资源名称。
- 可选:如果您已将网络标记与作业相关联,则将 NETWORK_TAG_NAMES 替换为网络标记的名称。
使用以下命令更新作业:
gcloud run jobs replace job.yaml
如需仅移除网络标记,同时保持作业与共享 VPC 网络的连接,请执行以下操作:
下载作业的 YAML 配置:
gcloud run jobs describe JOB_NAME --format export > job.yaml
从
job.yaml
文件中移除以下内容:run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET","tags":"NETWORK_TAG_NAMES"}]'
地点
- NETWORK:共享 VPC 网络的完全限定资源名称。
- SUBNET:子网的完全限定资源名称。
- 可选:如果您已将网络标记与作业相关联,则将 NETWORK_TAG_NAMES 替换为网络标记的名称。
使用以下命令更新作业:
gcloud run jobs replace job.yaml
问题排查
无法删除子网
如需删除子网,您必须先删除使用该子网的所有资源。如果 Cloud Run 使用子网,您必须先断开 Cloud Run 与共享 VPC 网络的连接,或将其移至其他子网,然后才能删除该子网。
无法分离共享 VPC 网络
如需在宿主项目中分离共享 VPC 网络,请按照取消预配共享 VPC 中的步骤操作,并务必从共享 VPC 网络断开任何 Cloud Run 服务或作业的连接。
如需查看哪些 Cloud Run 资源正在使用共享 VPC 网络,请运行以下命令:
gcloud compute shared-vpc list-associated-resources HOST_PROJECT_ID
将 HOST_PROJECT_ID 替换为共享 VPC 宿主项目的 ID。
直接 VPC 子网耗尽 IP 地址
如果共享 VPC 网络的子网耗尽 IP 地址,则由 Cloud Logging 记录。发生这种情况时,Cloud Run 无法启动更多服务实例或作业任务,直到更多 IP 地址变为可用为止。
查看分配的 IP 地址
如需查看 Cloud Run 分配的 IP 地址,请转到 Google Cloud 控制台中的“IP 地址”页面,或从 Google Cloud CLI 运行以下命令:
gcloud compute addresses list