GKE服务访问外部API时出口IP与服务外部IP不一致问题咨询
GKE服务入口IP与出口IP不一致的原因&静态出口IP配置方案
嗨,这个问题其实是GKE网络架构的正常现象,我给你拆解清楚:
- 你通过
kubectl get services看到的EXTERNAL-IP(35.189.192.88)是服务级负载均衡的入口IP,负责接收外部用户访问你应用的流量,属于Service资源层面的配置。 - 而应用访问外部API时的出口IP(35.205.57.21),默认是GKE集群节点的公网IP,或是集群启用的Cloud NAT的IP——这俩本来就不是同一层面的东西:入口IP管外部流量进来的路径,出口IP管集群内Pod向外发起请求的路径,所以自然会不一样。
接下来解决你最关心的问题:如何把出口IP设置为静态?这里有两种方案,你可以根据集群规模和需求选择:
方案1:用Cloud NAT配置静态出口IP(最推荐,适配绝大多数集群)
这是GKE官方推荐的方式,管理灵活且安全性更高:
- 先创建一个静态公网IP(替换成你的集群所在区域):
gcloud compute addresses create my-static-egress-ip --region=us-central1 - 创建Cloud NAT网关并绑定这个静态IP:
# 先创建关联VPC的路由器 gcloud compute routers create my-nat-router --region=us-central1 --network=你的集群VPC名称 # 配置NAT规则,指定使用刚才创建的静态IP作为出口 gcloud compute routers nats create my-nat-config --router=my-nat-router --region=us-central1 --nat-all-subnet-ip-ranges --nat-external-ip-pool=my-static-egress-ip - 确认你的GKE集群节点所在的子网被NAT规则覆盖,配置完成后等待3-5分钟让规则生效,再去外部API的访问日志里验证,就能看到出口IP已经变成你设置的静态IP了。
方案2:为节点池配置静态节点IP(适合小型集群,不推荐大规模使用)
如果你的集群节点数量很少,也可以直接给节点分配静态公网IP:
- 创建节点池时指定静态IP范围,或是给现有节点编辑实例配置,将临时公网IP替换为静态公网IP。不过这种方式的弊端很明显:节点扩容时需要手动配置IP,且节点IP直接暴露在外,安全性远不如Cloud NAT,只适合小型集群临时使用。
最后再提一句:Pod的出口IP和Service的入口IP是完全独立的,这是Kubernetes结合GCP网络架构的正常设计,不用觉得奇怪哦~
内容的提问来源于stack exchange,提问作者Frederic Collin
相关产品推荐
相关产品推荐

