使用共享 VPC 网络的直接 VPC 出站流量

您可以启用 Cloud Run 服务或作业,以通过直接 VPC 出站流量将流量发送到共享 VPC 网络,而无需无服务器 VPC 访问通道连接器。

本页面介绍了如何配置 Cloud Run 的 IAM 权限以使用共享 VPC 网络的子网,然后将服务或作业置于共享子网上。

须知事项

使用直接 VPC 出站流量(预览版)时,请确保您的子网至少具有数百个可用的 IP 地址。如果所有 Cloud Run 服务和作业的实例总数超过 100,我们建议至少有总数 4 倍 (4X) 的实例可用。

限制

以下限制适用于 Cloud Run 服务和作业:

  • Cloud Run 用量配额限制了您可以配置为使用直接 VPC 出站流量的实例数上限。数量上限为每个 Cloud Run 修订版本或作业执行配置。如需提高默认限制,请参阅如何增加配额。您可以使用 Google Cloud 控制台查看您的配额

  • 在网络基础设施维护事件期间,Cloud Run 服务和作业可能会遇到连接中断。我们建议您使用可以处理偶尔的连接重置的客户端库。
  • 第二代执行环境上启用直接 VPC 出站流量可能会增加容器冷启动时间
以下限制仅适用于 Cloud Run 作业,而不适用于服务:
  • 为了确保作业正确执行,请仅为不需要超过 8 个并发实例的作业使用直接 VPC 出站流量,并确保至少预留 1,024 个 IP 地址。

直接 VPC 出站流量不支持以下各项:

  • VPC 流日志和防火墙规则日志记录不提供 Cloud Run 服务或修订版本的名称。
  • 数据包镜像
  • Network Intelligence Center
  • IPv6 流量
  • 在应用于目标资源的入站防火墙规则中使用网络标记
  • 在应用于目标资源的入站防火墙规则中使用服务身份作为来源服务账号。
  • 防火墙规则不能使用附加到 Cloud Run 工作负载的 Resource Manager 标记。
  • 运行时间超过 1 小时的 Cloud Run 作业可能会遇到连接中断。在将作业从一个机器迁移到另一个机器的维护事件中,可能会发生这种情况。容器会在事件发生前 10 秒收到 SIGTSTP 信号,在事件之后收到 SIGCONT 信号。容器收到 SIGCONT 信号后,请重试连接。

区域

如需查看直接 VPC 出站流量支持的区域列表,请参阅直接 VPC 出站流量区域

直接 VPC 出站流量不支持以下区域:

  • asia-northeast3
  • asia-southeast1

设置 IAM 权限

您必须先确保 Cloud Run 服务代理具有使用子网的足够权限,然后才能使共享 VPC 服务项目中的 Cloud Run 能够访问共享 VPC 网络。

  1. 如需访问共享 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。
  2. 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.use 权限
  • 宿主项目或特定子网的 compute.subnetworks.use 权限
  • 共享 VPC 服务项目的 compute.addresses.get 权限
  • 服务项目的 compute.addresses.list 权限
  • 服务项目的 compute.addresses.createInternal 权限
  • 服务项目的 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 地址,以防服务或作业必须再次快速扩容。

如需删除子网,您必须先删除或重新部署 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 服务修订版本上使用网络标记,以实现更精细的网络安全性。

您可以使用 Google Cloud 控制台、Google Cloud CLI 或 YAML 通过服务配置直接 VPC 出站流量。

控制台

  1. 转到 Cloud Run

  2. 如果您是要配置一个新服务来作为部署目标,请点击创建服务。如果您要配置和部署现有服务,请点击该服务,然后点击修改和部署新的修订版本

  3. 如果您要配置新服务,请根据需要填写初始服务设置页面,然后点击容器、网络、安全性以展开服务配置页面。

  4. 点击网络标签页。

  5. 点击连接到 VPC 以获取出站流量

  6. 点击将流量直接发送到 VPC

  7. 选择与我共享的网络

  8. 网络字段中,选择要向其发送流量的共享 VPC 网络。

  9. 子网字段中,选择您的服务用于接收 IP 地址的子网。

  10. 可选:输入要与服务关联的网络标记的名称。网络标记在修订版本级指定。每个服务修订版本都可以有不同的网络标记,例如 network-tag-2

  11. 流量路由部分,选择以下选项之一:

    • 仅将请求路由到 VPC 的专用 IP,以便通过共享 VPC 网络将流量仅发送到内部地址。
    • 将所有流量路由到 VPC,以便通过共享 VPC 网络发送所有出站流量。
  12. 点击创建部署

  13. 如需验证您的服务是否在共享 VPC 网络上,请点击该服务,然后点击网络标签页。VPC 卡片中列出了网络和子网。

现在,您可以根据防火墙规则允许将来自 Cloud Run 服务的请求发送到共享 VPC 网络上的任何资源。

gcloud

如需将服务置于共享子网上,请运行以下命令为共享 VPC 网络和子网指定完全限定的资源名称:

gcloud beta 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 CLI 进行部署。

  1. 创建包含以下内容的新 service.yaml 文件:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE_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

    您需要将其中的:

    • SERVICE_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 替换为服务容器映像的网址。
  2. 通过运行以下命令部署新服务:

    gcloud run services replace service.yaml
  3. (可选)如果您想允许对服务进行未经身份验证的访问,请将服务设为公开

如果您需要下载或查看现有服务的配置,请使用以下命令将结果保存到 YAML 文件:

gcloud run services describe SERVICE --format export > service.yaml

在服务配置 YAML 文件中,根据需要修改任何 spec.template 子属性以更新修订版本设置,然后部署新修订版本:

gcloud run services replace service.yaml

创建作业

借助直接 VPC 出站流量,您的 Cloud Run 作业可以将流量发送到没有无服务器 VPC 访问通道连接器的共享 VPC 网络。

您可以使用 Google Cloud 控制台、Google Cloud CLI 或 YAML 通过作业配置直接 VPC 出站流量。

控制台

  1. 转到 Cloud Run

  2. 如果要配置新作业,请点击作业标签页,然后根据需要填写初始作业设置页面。如果要配置现有作业,请点击作业,然后点击修改

  3. 点击容器、变量和 Secret、连接、安全性以展开作业属性页面。

  4. 点击连接标签页。

  5. 点击连接到 VPC 以获取出站流量

  6. 点击将流量直接发送到 VPC

  7. 选择与我共享的网络

  8. 网络字段中,选择要向其发送流量的共享 VPC 网络。

  9. 子网字段中,选择您的作业用于接收 IP 地址的子网。

  10. 可选:输入要与作业关联的网络标记的名称。对于作业,网络标记在执行级指定。每个作业执行都可以具有不同的网络标记,例如 network-tag-2

  11. 流量路由部分,选择以下选项之一:

    • 仅将请求路由到 VPC 的专用 IP,以便通过共享 VPC 网络将流量仅发送到内部地址。
    • 将所有流量路由到 VPC,以便通过共享 VPC 网络发送所有出站流量。
  12. 点击创建更新

  13. 如需验证您的作业是否在共享 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 CLI 进行部署。

  1. 创建包含以下内容的新 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 替换为作业容器映像的网址。
  2. 通过运行以下命令部署新作业:

    gcloud run jobs replace job.yaml

如果您需要下载或查看现有作业的配置,请使用以下命令将结果保存到 YAML 文件:

gcloud run jobs describe JOB --format export > job.yaml

在作业配置 YAML 文件中,根据需要修改任何 spec.template 子属性以更新修订版本设置,然后重新部署:

gcloud run jobs replace job.yaml

断开服务连接

控制台

  • 如需从共享 VPC 网络中移除服务,请执行以下操作:

    1. 转到 Cloud Run

    2. 点击要移除的服务,然后点击修改和部署新的修订版本

    3. 点击网络标签页。

    4. 取消选中连接到 VPC 以接收出站流量

    5. 点击部署

    6. 如需验证您的服务是否不再位于共享 VPC 网络上,请点击网络标签页。VPC 卡片中不再列出网络和子网。

  • 如需仅移除网络标记,同时保持服务与共享 VPC 网络的连接,请执行以下操作:

    1. 点击包含要移除的网络标记的服务,然后点击修改和部署新的修订版本

    2. 点击网络标签页。

    3. 清除您不再希望与服务关联的网络标记的名称。

    4. 点击部署

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 网络中移除服务,请执行以下操作:

    1. service.yaml 文件中移除以下内容:

      run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET","tags":"NETWORK_TAG_NAMES"}]'

      Where

      • NETWORK:您的共享 VPC 网络的名称。
      • SUBNET:您的子网的名称。
      • 可选:NETWORK_TAG_NAMES:网络标记的名称(如果已将其与服务关联)。
    2. 通过运行以下命令来部署服务修订版本:

      gcloud run services replace service.yaml
  • 如需仅移除网络标记,同时保持服务与共享 VPC 网络的连接,请执行以下操作:

    1. service.yaml 文件的内容中移除 tags 变量,并保持 networksubnetwork 变量不变,如以下示例所示:

      run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET"}]'

      请替换以下内容:

      • NETWORK:您的共享 VPC 网络的名称。
      • SUBNET:您的子网的名称。
    2. 通过运行以下命令来部署服务修订版本:

      gcloud run services replace service.yaml

断开连接作业

控制台

  • 如需从共享 VPC 网络中移除作业,请执行以下操作:

    1. 转到 Cloud Run

    2. 点击要移除的作业,然后点击修改和部署新的修订版本

    3. 点击配置标签页。

    4. 取消选中连接到 VPC 以接收出站流量

    5. 点击更新

    6. 如需验证您的作业是否不再位于共享 VPC 网络上,请点击配置标签页。VPC 卡片中不再列出网络和子网。

  • 如需仅移除网络标记,同时保持作业与共享 VPC 网络的连接,请执行以下操作:

    1. 点击包含要移除的网络标记的作业,然后点击修改和部署新的修订版本

    2. 点击连接标签页。

    3. 清除您不再希望与作业关联的网络标记的名称。

    4. 点击更新

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 网络中移除作业,请执行以下操作:

    1. job.yaml 文件中移除以下内容:

      run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET","tags":"NETWORK_TAG_NAMES"}]'

      Where

      • NETWORK:您的共享 VPC 网络的名称。
      • SUBNET:您的子网的名称。
      • 可选:如果您已将网络标记与作业相关联,则将 NETWORK_TAG_NAMES 替换为网络标记的名称。
    2. 通过运行以下命令重新部署作业:

      gcloud run jobs replace job.yaml
  • 如需仅移除网络标记,同时保持作业与共享 VPC 网络的连接,请执行以下操作:

    1. job.yaml 文件的内容中移除 tags 变量,并保持 networksubnetwork 变量不变,如以下示例所示:

      run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET"}]'

      请替换以下内容:

      • NETWORK:您的共享 VPC 网络的名称。
      • SUBNET:您的子网的名称。
    2. 通过运行以下命令重新部署作业:

      gcloud run jobs replace job.yaml

问题排查

无法删除子网

如需删除子网,您必须先删除使用该子网的所有资源。如果 Cloud Run 使用子网,您必须先断开 Cloud Run 与共享 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