You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:30:49