在Google Kubernetes Engine中用自定义Ingress控制器能否跨区域负载均衡?如何实现?
在GKE中用ingress-nginx实现跨区域负载均衡
当然可以!完全不用局限于GCE原生的ingress-gce,用ingress-nginx照样能搞定GKE的跨区域负载均衡——只是实现逻辑和原生Ingress不太一样,核心是靠GCP的全球负载均衡器(GLB)做前端入口,把流量转发到分布在不同区域的GKE集群里的ingress-nginx控制器上。下面是具体的实操步骤:
1. 先搭好跨区域的GKE集群
- 先在至少两个不同的GCP区域(比如
us-central1和europe-west1)创建GKE集群,记得开启必要的API(比如compute.googleapis.com、container.googleapis.com),而且集群节点得有公网访问权限(或者配置云NAT让节点能拉取镜像、和GLB通信)。 - 每个集群都要装上ingress-nginx控制器,这里推荐用NodePort类型的服务来暴露控制器,方便后续GLB统一配置端口:
固定端口是为了后续GLB配置时不用每次找随机的NodePort,省事儿。# 先添加ingress-nginx的Helm仓库 helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update # 安装ingress-nginx,指定固定NodePort端口 helm install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --create-namespace \ --set controller.service.type=NodePort \ --set controller.service.nodePorts.http=30080 \ --set controller.service.nodePorts.https=30443
2. 配置GCP全球负载均衡器(GLB)
这一步是跨区域负载的核心,GLB会作为公网入口,把流量分发到各个区域的集群:
2.1 创建后端服务
- 给每个区域的GKE集群创建一个后端服务,关联该集群的节点组,端口填我们刚才设置的
30080(HTTP)和30443(HTTPS)。 - 开启后端服务的跨区域负载均衡选项,按需配置会话亲和性(比如需要用户会话绑定到某个集群的话,选基于Cookie的亲和性),还要配置健康检查——检查路径设为
/healthz,端口30080,这样GLB能自动剔除不健康的集群节点。
2.2 配置URL映射与目标代理
- 创建URL映射,把请求路径对应到后端服务(如果所有流量都要分发到所有集群,直接把默认路由指向包含所有后端的服务组就行)。
- 要是用HTTPS的话,先在GCP上申请托管SSL证书,然后创建HTTP(S)目标代理,关联URL映射和SSL证书;HTTP的话直接创建HTTP目标代理就行。
2.3 创建全球转发规则
- 申请一个静态公网IP(或者用已有的),创建全球转发规则,把这个IP绑定到目标代理,监听80和443端口——这时候这个静态IP就是你的跨区域服务入口了。
3. 配置每个集群的Ingress规则
- 在每个GKE集群里创建Ingress资源,指向你的业务服务(比如你的应用Deployment对应的Service),确保Ingress的规则和GLB的URL映射匹配。举个例子:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cross-region-app-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - host: your-domain.com # 换成你的域名,要解析到GLB的静态IP http: paths: - path: / pathType: Prefix backend: service: name: your-app-service # 你的业务服务名称 port: number: 80
4. 验证跨区域流量
- 用不同地区的客户端访问你的域名,比如用海外的服务器或者代理工具,然后查看各个集群的ingress-nginx日志,或者去GCP负载均衡的监控面板,就能确认流量是不是被分发到了不同区域的集群里。
几个额外的注意事项
- SSL终止位置:推荐让GLB来处理HTTPS终止,这样流量在公网是加密的,到集群内部可以用HTTP;如果一定要让ingress-nginx处理SSL,那就要在每个集群的Ingress里配置证书。
- 健康检查:一定要确保GLB的健康检查能正常探测到ingress-nginx的
/healthz路径,不然某个区域的集群出问题了,GLB还会往那发流量。 - 成本:全球负载均衡器会有额外的计费项,比如跨区域流量费用,记得提前了解GCP的计费规则。
内容的提问来源于stack exchange,提问作者me.at.coding
相关产品推荐
相关产品推荐

