默认情况下,Cloud Run 服务使用动态 IP 地址池连接到互联网上的外部端点。如果 Cloud Run 服务连接到需要从静态 IP 地址建立连接的外部端点,例如使用基于 IP 地址的防火墙的数据库或 API,则不适合使用此操作。对于这些连接,您必须将 Cloud Run 服务配置为通过静态 IP 地址路由请求。
本指南介绍如何启用 Cloud Run 服务以使用静态 IP 地址发送请求。
任务概览
如需启用 Cloud Run 服务以通过静态 IP 地址路由请求,请将 Cloud Run 服务的 VPC 出站流量配置为通过具有配置了静态 IP 地址的 Cloud NAT 网关的 VPC 网络路由所有出站流量。
通过 Cloud NAT 路由流量不会导致网络堆栈中出现额外的跃点,因为 Cloud NAT 网关和 Cloud Router 仅提供一个控制平面,并且数据包不通过 NAT 网关或 Cloud Router。
请注意,连接到同一 VPC 网络的所有 Cloud Run 服务共用同一出站流量 IP 地址。如需为不同的 Cloud Run 服务使用不同的出站流量 IP 地址,请按照本指南创建单独的子网和(可选)无服务器 VPC 访问通道连接器。
创建子网
您必须创建一个专用 /28
子网来托管连接器。如果您使用的是直接 VPC 出站流量,请使用现有子网或创建另一个子网。如果您使用连接器,则专用子网可防止 VPC 中的其他计算资源(例如 Compute Engine 虚拟机或 Google Kubernetes Engine 集群)意外使用静态 IP(如果您配置了无服务器 VPC 访问通道)访问互联网。
gcloud
查找您的 VPC 网络名称:
gcloud compute networks list
您应该会看到如下所示的输出:
NAME SUBNET_MODE BGP_ROUTING_MODE default AUTO REGIONAL
确定您要连接到无服务器 VPC 访问通道连接器的网络。
在 VPC 中为无服务器 VPC 访问通道连接器创建子网。
gcloud compute networks subnets create SUBNET_NAME \ --range=RANGE --network=NETWORK_NAME --region=REGION
替换此命令中的以下值:
- 将
SUBNET_NAME
替换为您要为子网指定的名称。 - 将
RANGE
替换为您要分配给此子网的 CIDR 格式的 IP 范围(例如10.124.0.0/28
) NETWORK_NAME
:VPC 网络的名称。- 将
REGION
替换为要在其中创建无服务器 VPC 访问通道连接器的区域。
- 将
Terraform
创建要使用的 VPC 网络。
将
cr-static-ip-network
替换为子网名称。在 VPC 中为无服务器 VPC 访问通道连接器创建子网。
替换
- 将
cr-static-ip
替换为您的子网名称 - 将
10.124.0.0/28
替换为您的 CIDR 范围 - 将
us-central1
替换为您的 Google Cloud 区域
- 将
创建 Serverless VPC Access 连接器
如果您使用直接 VPC 出站流量集成,则无需创建连接器。如果您不使用直接 VPC 出站流量,则需要使用无服务器 VPC 访问通道连接器将 Cloud Run 服务的出站流量路由到 VPC 网络。
如要创建无服务器 VPC 访问通道连接器,请进行如下操作:
gcloud
使用预先创建的子网创建无服务器 VPC 访问通道连接器。
gcloud compute networks vpc-access connectors create CONNECTOR_NAME \ --region=REGION \ --subnet-project=PROJECT_ID \ --subnet=SUBNET_NAME
替换此命令中的以下值:
- 将
CONNECTOR
替换为您要为此资源指定的名称。 - 将
PROJECT_ID
替换为托管子网的名称。 - 将
SUBNET_NAME
替换为您创建的子网名称。 - 将
REGION
替换为要在其中创建 NAT 网关的区域。
- 将
Terraform
创建无服务器 VPC 访问通道连接器。
将
cr-conn
替换为您的无服务器 VPC 访问通道连接器的名称
配置网络地址转换 (NAT)
如果您使用直接 VPC 出站流量或无服务器 VPC 访问通道连接器,则来自 Cloud Run 服务的请求会到达 VPC 网络。如果要通过静态 IP 将出站请求路由到外部端点,请配置 Cloud NAT 网关。
gcloud
创建一个新的 Cloud Router 来对 NAT 网关进行编程:
gcloud compute routers create ROUTER_NAME \ --network=NETWORK_NAME \ --region=REGION
替换此命令中的以下值:
- 将
ROUTER_NAME
替换为您要创建的 Cloud Router 资源的名称。 - 将
NETWORK_NAME
替换为您之前找到的 VPC 网络的名称。 - 将
REGION
替换为要在其中创建 NAT 网关的区域。
- 将
保留静态 IP 地址当与之关联的资源被删除并重新创建时,保留的 IP 地址资源将保留基础 IP 地址:
gcloud compute addresses create ORIGIN_IP_NAME --region=REGION
替换此命令中的以下值:
- 将
ORIGIN_IP_NAME
替换为您要分配给 IP 地址资源的名称。 - 将
REGION
替换为将运行 Cloud NAT 路由器的区域。理想情况下,与 Cloud Run 服务位于同一区域,可最大程度地减少延迟和网络费用。
- 将
在此路由器上创建 Cloud NAT 网关配置,以使用您创建的静态 IP 地址路由来自 VPC 网络的流量:
gcloud compute routers nats create NAT_NAME \ --router=ROUTER_NAME \ --region=REGION \ --nat-custom-subnet-ip-ranges=SUBNET_NAME \ --nat-external-ip-pool=ORIGIN_IP_NAME
替换此命令中的以下值:
- 将
NAT_NAME
替换为您要创建的 Cloud NAT 网关资源的名称。 - 将
ROUTER_NAME
替换为您的 Cloud Router 的名称 - 将
REGION
替换为要在其中创建 NAT 网关的区域。 - 将
ORIGIN_IP_NAME
替换为您在上一步中创建的预留 IP 地址资源的名称。
- 将
Terraform
创建一个新的 Cloud Router 来对 NAT 网关进行编程:
将
cr-static-ip-router
替换为您的子网名称。保留静态 IP 地址当与之关联的资源被删除并重新创建时,保留的 IP 地址资源将保留基础 IP 地址:
将
cr-static-ip-addr
替换为您的子网名称。在此路由器上创建 Cloud NAT 网关配置,以使用您创建的静态 IP 地址路由来自 VPC 网络的流量:
将
cr-static-nat
替换为您的 Cloud NAT 网关名称。
通过 VPC 网络路由 Cloud Run 流量
配置 NAT 后,使用直接 VPC 出站流量或无服务器 VPC 访问通道连接器部署或更新 Cloud Run 服务,并将 VPC 出站流量设置为通过 VPC 网络路由所有流量:
gcloud
直接 VPC 出站流量
如需部署或更新 Cloud Run 服务以使用直接 VPC 出站流量并通过该集成路由所有出站流量,请运行以下命令:
gcloud run deploy SERVICE_NAME \ --image=IMAGE_URL \ --network=NETWORK \ --subnet=SUBNET \ --region=REGION \ --vpc-egress=all-traffic
替换此命令中的以下值:
- 将 SERVICE_NAME 替换为要部署的 Cloud Run 服务的名称。
- 将 IMAGE_URL 替换为对容器映像的引用,例如
us-docker.pkg.dev/cloudrun/container/hello:latest
。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
。 - 将 NETWORK 替换为 VPC 网络的名称。
- 将 SUBNET 替换为您的子网名称。
- 将 REGION 替换为您的服务的区域。
无服务器 VPC 访问通道连接器
如需部署或更新 Cloud Run 服务以使用无服务器 VPC 访问通道连接器并通过该集成路由所有出站流量,请运行以下命令:
gcloud run deploy SERVICE_NAME \ --image=IMAGE_URL \ --vpc-connector=CONNECTOR_NAME \ --region=REGION \ --vpc-egress=all-traffic
替换此命令中的以下值:
- 将 SERVICE_NAME 替换为要部署的 Cloud Run 服务的名称。
- 将 IMAGE_URL 替换为对容器映像的引用,例如
us-docker.pkg.dev/cloudrun/container/hello:latest
。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
。 - 将 CONNECTOR_NAME 替换为您的无服务器 VPC 访问通道连接器的名称。
- 将 REGION 替换为您的服务的区域。
Terraform
此 Cloud Run 服务使用 VPC 连接器并通过它路由所有出站流量:
将 us-docker.pkg.dev/cloudrun/container/hello
替换为对您的容器映像的引用。
验证静态外部 IP
完成以上步骤后,您便可使用预定义的静态 IP 地址在 VPC 网络上设置 Cloud NAT,并将所有 Cloud Run 服务的出站流量路由到您的 VPC 网络。来自 Cloud Run 服务的请求通过您的 VPC 网络传输,并使用静态 IP 地址访问外部端点。
如需验证此行为并确认服务使用的来源 IP 地址,您可以向显示来源 IP 地址的 API 或网站(例如 curlmyip.org)发出请求。
删除静态外部 IP
如果您不再需要某个静态外部 IP 地址,请参阅释放静态外部 IP 地址。