如何将GKE节点绑定至Gateway,实现统一出口IP访问客户端防火墙?
嘿,我刚好处理过类似的需求,给你整理两个靠谱的方案,能让GKE所有节点的出站流量都走同一个静态IP,这样你只需要在客户端防火墙放通这一个IP就搞定了:
方案1:用Cloud NAT绑定静态IP(最省心的通用方案)
这是最常用的路子,靠Cloud NAT来统一节点的出口IP——本质是让VPC里所有GKE节点的出站流量都走指定的静态IP转发,完全不需要改集群的核心配置。
步骤走一遍:
- 先搞个静态外部IP(要是你已经有了就跳过这步):
gcloud compute addresses create nat-static-ip --region=你的集群所在区域 --ip-version=IPV4 - 创建Cloud NAT网关,把这个静态IP绑上去,同时指定GKE节点所在的子网:
(前提是你VPC里已经有路由器了,没有的话先跑gcloud compute routers create 路由器名称 --region=你的区域 --network=你的VPC名称)gcloud compute routers nats create gke-nat \ --router=你的路由器名称 \ --region=你的集群所在区域 \ --nat-all-subnet-ip-ranges \ --nat-external-ip-pool=nat-static-ip - 验证效果:直接登录GKE节点,跑
curl ifconfig.me,返回的应该就是你刚才创建的静态IP。
方案2:用GKE Gateway API + 出口网关(适合需要流量管控的场景)
如果你想通过GKE原生的Gateway来做更精细的流量管控(比如后续加路由规则、过滤特定域名),可以试试出口网关模式,把节点的出站流量都导向绑定了静态IP的Gateway。
步骤如下:
- 先确保你的GKE集群启用了Gateway API(集群版本得1.21以上,还要开
gateway-api插件):gcloud container clusters update 你的集群名称 --region=你的区域 --enable-gateway-api - 创建一个
Gateway资源,绑定你的静态IP:apiVersion: gateway.networking.k8s.io/v1beta1 kind: Gateway metadata: name: egress-gateway annotations: networking.gke.io/static-ip: "nat-static-ip" # 填你之前创建的静态IP名称 spec: gatewayClassName: gke-l7-global-external-managed listeners: - name: egress port: 443 protocol: HTTPS allowedRoutes: namespaces: from: All - 再创建
EgressPolicy,把所有节点的出站流量都导向这个Gateway:
注意:这个方案需要GKE的Gateway API支持出口网关功能,部分区域可能要先启用预览特性,你可以先查下你的集群区域是否支持。apiVersion: networking.gke.io/v1 kind: EgressPolicy metadata: name: node-egress spec: action: ALLOW destination: cidrBlocks: ["0.0.0.0/0"] # 匹配所有外部流量 redirect: gatewayRef: name: egress-gateway namespace: default # 对应Gateway所在的命名空间 target: podSelector: {} # 这里如果要限制特定节点的Pod,加标签筛选就行,空的话覆盖所有Pod(包括节点系统Pod)
几个要踩的坑提醒
- 静态IP要对应集群的位置:单区域集群用区域IP,跨区域集群用全局IP,别搞混了。
- 用Cloud NAT的话,要确保
nat-all-subnet-ip-ranges参数包含了GKE节点所在的子网,默认是包含所有的,但如果之前有配置过子网排除,得检查下。 - 测试的时候一定要在GKE节点内部发起请求(比如登录节点跑
curl),别用集群内的Pod——Pod如果用了Service或者Sidecar,可能走的是其他出口路径,测不准。
内容的提问来源于stack exchange,提问作者Idan
相关产品推荐
相关产品推荐

