GKE 出站流量的静态 IP 地址:Cloud NAT 实用指南
Source: Dev.to

问题
在 Google Kubernetes Engine (GKE) 上运行的应用需要连接到需要 IP 白名单的外部数据库。Kubernetes 中的 Pod 使用的是瞬时 IP,会不断变化。解决方案是什么?使用手动静态 IP 分配的 Cloud NAT。
为什么需要这样做?
在现代微服务架构中,Kubernetes 应用经常需要访问:
- 其他 GCP 项目中的托管数据库
- 防火墙策略严格的第三方 API
- 只允许已知 IP 访问的遗留服务
GKE 节点(尤其是私有集群)没有固定的公共 IP,导致无法维护稳定的白名单。
解决方案:手动分配的 Cloud NAT
Cloud NAT 充当网关,将集群内部私有地址转换为固定、可预测的公共 IP 地址。
步骤实现
预留静态 IP 地址
gcloud compute addresses create nat-static-ip \
--region=us-central1
重要提示: IP 必须与 GKE 集群位于同一地区。
创建 Cloud Router
gcloud compute routers create nat-router \
--network=my-vpc \
--region=us-central1
使用手动分配配置 Cloud NAT
gcloud compute routers nats create nat-config \
--router=nat-router \
--region=us-central1 \
--nat-external-ip-pool=nat-static-ip \
--nat-all-subnet-ip-ranges
--nat-external-ip-pool 参数指定了第一步预留的静态 IP。
将 IP 添加到目标的白名单
配置好 Cloud NAT 后,集群的所有出站流量都会使用该静态 IP。将此 IP 加入数据库或外部服务的防火墙白名单即可。
关键优势
- 持久性: 即使集群重启或节点重新创建,IP 也不会变化。
- 安全性: 节点可以保持在私有子网中,无需公共 IP,降低攻击面。
- 可扩展性: Cloud NAT 是托管服务,会自动扩展且不会影响性能。
- 无需修改应用: 只在基础设施层面配置,部署保持不变。
重要注意事项
- 容量管理: 在手动分配模式下,需要自行计算所需的 IP/端口数量。容量不足会导致
OUT_OF_RESOURCES错误。 - 监控: 为 NAT 端口使用率设置告警,以在影响生产之前发现问题。
- 替代方案: 对于高度自定义的 NAT 逻辑或复杂的防火墙需求,手动 NAT 实例可能更合适,但会增加运维开销。
何时使用该方案
适用场景
- ✅ 需要与要求 IP 白名单的服务通信
- ✅ 运行私有 GKE 集群
- ✅ 想要可扩展、托管的解决方案
- ✅ 需要合规性并对出站流量进行集中审计
不适用场景
- ❌ 需要极度自定义的 NAT 逻辑
- ❌ 需要超出托管服务提供的细粒度控制
结论
手动 IP 分配的 Cloud NAT 是 GCP 针对此类常见需求的标准方案。它可靠、可扩展且配置相对简单,使您能够在私有网络中保持资源安全,同时实现对外部世界的受控连接。
