GKE环境下多个Ingress共享全局静态IP的实现方法咨询
在GKE上让多个Ingress共享同一静态IP的方法
嘿,这个问题我之前维护GKE集群时也碰到过——默认情况下GKE确实会给每个Ingress单独创建负载均衡器,导致同一IP只能绑定第一个部署的Ingress。不过别担心,有两种靠谱的方法能解决这个问题,让你拆分Ingress配置文件的同时共享同一个静态IP:
方法一:利用GKE的Ingress合并功能(最直接)
GKE从1.18版本开始默认支持Ingress合并功能,只要多个Ingress满足以下条件,控制器就会把它们合并到同一个Google Cloud Load Balancer(GCLB)里,共享指定的静态IP:
- 所有Ingress使用相同的IngressClass(默认是
gce,显式指定更稳妥) - 所有Ingress添加完全一致的
kubernetes.io/ingress.global-static-ip-name注解 - 每个Ingress的
host规则互不冲突(比如你的msa1.example.com和msa2.example.com,刚好满足) - TLS配置如果存在,要么使用覆盖所有host的统一证书,要么每个Ingress的TLS host不重叠
配置示例
第一个Ingress文件(msa1-ingress.yaml)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: msa1-ingress annotations: kubernetes.io/ingress.global-static-ip-name: lalala-ip-1 spec: ingressClassName: gce # 显式指定默认IngressClass rules: - host: msa1.example.com http: paths: - path: / pathType: Prefix backend: service: name: msa1-service port: number: 80
第二个Ingress文件(msa2-ingress.yaml)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: msa2-ingress annotations: kubernetes.io/ingress.global-static-ip-name: lalala-ip-1 spec: ingressClassName: gce rules: - host: msa2.example.com http: paths: - path: / pathType: Prefix backend: service: name: msa2-service port: number: 80
部署这两个文件后,GKE会自动把它们合并到同一个GCLB,lalala-ip-1会同时处理两个子域名的流量,各自转发到对应的服务。
注意事项
- 确保所有Ingress的
host和path规则没有重叠,否则合并会失败 - 如果用TLS,要么在一个Ingress里配置包含所有host的证书,要么每个Ingress的TLS块只对应自己的host和证书
- 旧版本GKE(低于1.18)需要手动开启特性门控
--feature-gates=IngressMerge=true,不过现在大部分集群都是新版本了,不用操心这个
方法二:使用Gateway API(更现代的方案)
如果你愿意尝试Kubernetes的新一代 ingress 方案,GKE的Gateway API会更适合微服务架构的拆分需求。它通过Gateway资源绑定静态IP,然后用多个HTTPRoute资源分别配置不同服务的路由规则,所有Route共享同一个Gateway的IP。
配置示例
首先创建Gateway(绑定静态IP)
apiVersion: gateway.networking.k8s.io/v1beta1 kind: Gateway metadata: name: msa-shared-gateway annotations: networking.gke.io/static-ip: lalala-ip-1 # 绑定你的静态IP spec: gatewayClassName: gke-l7-gateway-v2 # 使用GKE的L7 Gateway类 listeners: - name: http-listener port: 80 protocol: HTTP allowedRoutes: namespaces: from: Same # 允许同命名空间的Route关联
为msa1创建HTTPRoute
apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: msa1-route spec: parentRefs: - name: msa-shared-gateway # 关联到上面的Gateway hostnames: - "msa1.example.com" rules: - matches: - path: type: PathPrefix value: / backendRefs: - name: msa1-service port: 80
为msa2创建HTTPRoute
apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: msa2-route spec: parentRefs: - name: msa-shared-gateway hostnames: - "msa2.example.com" rules: - matches: - path: type: PathPrefix value: / backendRefs: - name: msa2-service port: 80
这种方式的优势是路由规则和网关配置完全分离,每个服务的路由可以独立维护,扩展性更好,适合复杂的微服务场景。
内容的提问来源于stack exchange,提问作者Mateusz
相关产品推荐
相关产品推荐

