Encore 平台实战:为 GCP Cloud Run 环境配置静态出站 IP(Cloud NAT + VPC Egress 完整指南)
【免费下载链接】encoreThe infrastructure platform for the intelligence era项目地址: https://gitcode.com/GitHub_Trending/encor/encore
本篇指南面向使用 Encore Cloud 将应用部署到 Google Cloud Run 的开发者,讲解如何为应用配置稳定的出站 IP 地址(静态 Egress IP)。默认情况下 Cloud Run 的出站流量来自 Google 动态 IP 池,第三方无法对你的应用做 IP 白名单;通过将出站流量路由到环境 VPC,并经绑定了预留静态 IP 的 Cloud NAT 网关转发,即可获得固定出口地址。读完本文你将掌握:在 GCP Console 中为 Encore 环境预留静态 IP 并创建 Cloud NAT 网关、在 Encore Cloud 控制台将 Cloud Run 的 VPC egress 切换为 All traffic、验证出口 IP 是否生效,以及了解这一配置对成本、可用性与多区域架构的影响。
问题背景:为什么 Cloud Run 需要静态出站 IP
默认情况下,GCP Cloud Run 服务发往互联网的出站流量使用一批Google 官方拥有的 IP 地址(IP 池),这些地址会随时间变化。这带来一个直接后果:
第三方无法对"你的应用"做 IP 维度的白名单放行,因为源 IP 是不确定的。
典型受影响的场景包括:
- 对接合作伙伴或第三方 API,需要对方按 IP 白名单放行你的调用;
- 连接要求基于 IP 做访问控制的外部数据库与外部服务;
- 满足合规要求——审计与合规体系往往要求"已知的、可审计的出站地址"。
要获得稳定的出站 IP,思路是:让服务的出站流量先进入你环境的 VPC,再经由绑定了预留静态 IP 的 Cloud NAT 网关转发到互联网。出站流量的源 IP 就固定为 NAT 网关上的静态地址。
从 Encore 平台侧看,这套方案与 Encore Cloud 的 GCP 基础设施模型天然契合:Encore Cloud 为每个环境预置独立的 GCP 项目与 VPC 网络(详见 GCP 基础设施文档),所有资源部署在私有网络内,外部流量只能通过指定的入口点进入;Cloud NAT 恰好填补了"私有网络出站"这一环。
整个配置只需要两步:
- 在 GCP Console中,为 Encore 环境的 VPC 创建一个绑定预留静态 IP 的 Cloud NAT 网关;
- 在 Encore Cloud 控制台中,将该环境的 Cloud Run 服务配置为将All traffic(全部流量)路由到 VPC。
前置条件
- 一个部署到GCP Cloud Run(而非 GKE)的 Encore 环境。Encore Cloud 支持在创建环境时选择 GCP + Cloud Run 作为计算平台(参见 环境创建与配置)。
- 拥有该 Encore 环境对应 GCP 项目的控制台访问权限。Encore Cloud 为每个环境提供独立专用的 GCP 项目,你需要在这个项目里操作。
- 对 Encore Cloud 控制台具备相应权限(管理员角色可修改基础设施配置)。
Step 1:创建 Cloud NAT 网关
Encore Cloud 为每个环境预置了专用 GCP 项目与VPC 网络。Cloud NAT 网关必须创建在该项目内、且与你的环境部署所在的同一区域。
1.1 预留静态外部 IP 地址
- 打开 GCP Console,选择 Encore 环境对应的 GCP 项目;
- 进入VPC network > IP addresses,点击Reserve external static IP address(预留外部静态 IP 地址);
- 为 IP 命名,例如
encore-egress-ip; - 将Type(类型)设为
Regional(区域级),并选择你环境部署所在的区域; - 点击Reserve(预留)。
注意:此处必须选择Regional类型,因为 Cloud NAT 是区域级资源,需要与 NAT 网关处于同一区域。
1.2 创建 Cloud NAT 网关
- 进入Network services > Cloud NAT,点击Get started / Create Cloud NAT gateway(创建 Cloud NAT 网关);
- 为网关命名,例如
encore-egress-nat; - 将NAT type(NAT 类型)设为
Public(公网); - 选择Network(网络)为 Encore Cloud 为该环境预置的 VPC,Region(区域)与上面预留 IP 的区域保持一致;
- 在Cloud Router部分,创建一个新的路由器(或选择同一网络、同一区域内已存在的路由器);
- 在Cloud NAT mapping(Cloud NAT 映射)下,保持默认的源选择方式,使所有子网 IP 范围都能使用该网关;
- 将NAT IP addresses(NAT IP 地址)设为
Manual(手动),并选择你在上一步预留的静态 IP; - 点击Create(创建)。
关键顺序提醒:一定要先创建好 Cloud NAT 网关,再执行下一步修改 VPC egress 设置。一旦出站流量被路由到 VPC,对互联网的访问就完全依赖 NAT 网关——如果没有它,你的服务将无法访问互联网。
Step 2:让 Cloud Run 的所有出站流量走 VPC
默认情况下,Cloud Run 只会把发往私有 IP 段的流量送进 VPC,而发往互联网的流量仍直接经 Google 的 IP 池发出。要迫使互联网流量也走 NAT 网关,需要修改 VPC egress 设置:
- 打开 Encore Cloud 控制台,进入你的环境;
- 打开Infrastructure(基础设施)标签页;
- 找到 Cloud Run 配置,将VPC egress(VPC 出站流量)设为
All traffic(所有流量); - 应用(Apply)该变更。
生效机制:控制台中发起的基础设施变更,会作为部署的一部分被应用。因此修改完成后需要触发一次新的部署(或推送一次提交)才能使设置生效。Encore Cloud 的部署遵循"基础设施预置 → 部署容器 → 清理未用资源"的三阶段流程,详见 Managing Infrastructure 中的部署阶段说明。
验证配置是否生效
部署完成后,从你的任意一个服务发起一次出站请求,访问一个会回显调用方 IP 地址的服务(例如https://api.ipify.org),确认返回的 IP 与你预留的静态 IP 一致。
一个简单的做法是在 Encore 服务中暴露一个端点,返回外部服务回显的 IP,或直接在日志中观察:
// 在某个服务中发起出站请求并记录响应 resp, err := http.Get("https://api.ipify.org") // 读取响应体即为当前出站 IP也可以从服务所在环境的日志中查看api.ipify.org这类探测请求的返回内容,逐环境确认All traffic配置已生效。
使用注意事项
所有出站流量都会受影响
将 egress 设为All traffic后,每一条出站请求——包括对公共 API 的调用——都会经过 VPC 与 NAT 网关。这意味着:
- 会产生NAT 数据处理费用(NAT data processing charges),这部分成本需要纳入预算;
- NAT 网关会成为你所有互联网访问的单点依赖,一旦网关或相关网络组件异常,服务将失去全部外网连通能力。
每个区域与网络需要一个网关
Cloud NAT 是区域级资源。如果一个环境横跨多个区域部署,需要在每个区域分别创建绑定了该区域预留静态 IP 的网关。
高并发场景需要多个静态 IP
单个 NAT IP 对"发往同一目标地址"的并发连接数存在上限。如果你的应用有大量并发出站连接(例如高吞吐的数据回传、Webhook 推送等),建议为网关分配多个预留静态 IP,并在第三方处将所有这些 IP 全部加入白名单。
手动创建的资源会被保留
Encore Cloud不会覆盖它不管理的资源。你在 GCP Console 手动创建的 Cloud NAT 网关与预留静态 IP,在后续任何部署中都不会被改动或删除。这得益于 Encore Cloud 的 drift-aware(漂移感知)更新策略:部署前它会拉取资源当前属性,若检测到在控制台手动修改造成的漂移,会将其视为"当前状态"更新内部表示,而非强制回写(详见 Infrastructure Configuration 中关于控制台手动配置的说明)。
GKE 环境特殊说明:如果你的环境运行在GKE(Google Kubernetes Engine)而非 Cloud Run上,VPC egress 设置并不适用——Kubernetes Pod 本身已经通过 VPC 网络出站。此时应检查该网络是否已存在 Cloud NAT 网关,若存在,只需给现有网关附加预留静态 IP即可,切勿重复创建第二个网关。
从源码与文档看实现依据
以上操作与 Encore Cloud 的 GCP 基础设施模型完全一致,相关依据可在本仓库文档中交叉印证:
- 环境级项目与 VPC 隔离:Encore Cloud 为每个环境预置独立 GCP 项目与私有网络,所有资源只能通过 VPC 内部通信,见 GCP 基础设施文档。Cloud NAT 正是在这个 VPC 内为私有网络提供受控的出站路径。
- 部署阶段与变更生效方式:基础设施变更随部署分三阶段应用(预置 → 部署 → 清理),这与文档中"修改 VPC egress 后需触发新部署"的要求一致,见 Managing Infrastructure 的 Deployment Phases 一节。
- 手动配置不被覆盖:Encore Cloud 采用 PATCH 式更新、避免全量同步、漂移感知更新三大策略,保证控制台手动创建的 NAT/静态 IP 在后续部署中安全保留,见 Infrastructure Configuration。
- 与 AWS 侧的对称设计:Encore 在 AWS 侧同样内置了出站网络组件——VPC 公有子网内包含 Internet Gateway 与 NAT Gateway,为私有子网中的计算实例提供出站通路,见 AWS 基础设施文档。GCP 侧之所以需要手动配置 Cloud NAT,正是因为 Cloud Run 默认直连 Google IP 池,而非像 AWS 私有子网那样天然走 NAT。
总结
| 步骤 | 操作位置 | 关键动作 |
|---|---|---|
| 1a | GCP Console(环境专用项目) | VPC network > IP addresses,预留Regional静态外部 IP |
| 1b | GCP Console(环境专用项目) | Network services > Cloud NAT,创建PublicNAT,绑定该静态 IP,选择 Encore 环境的 VPC 与区域 |
| 2 | Encore Cloud 控制台 | Infrastructure 标签页 → Cloud Run 配置 →VPC egress = All traffic→ Apply |
| 3 | 触发部署 | 推送提交或手动部署,等待三阶段部署完成 |
| 4 | 验证 | 从服务发起出站请求,用api.ipify.org等回显服务确认源 IP 为预留静态 IP |
配置完成后,你的 Encore 应用(GCP Cloud Run)便拥有可被第三方白名单、可审计的固定出站 IP;同时请谨记"All traffic 影响全部出站流量、NAT 为区域级资源、高并发需多 IP、手动资源永不被覆盖"这四条核心注意事项,以便在生产环境中合理规划成本与高可用性。
【免费下载链接】encoreThe infrastructure platform for the intelligence era项目地址: https://gitcode.com/GitHub_Trending/encor/encore
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考