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

GKE集群GCE类Ingress无法按路径路由流量到微服务问题咨询

问题根因

你当前使用的GCE原生Ingress(GKE默认Ingress控制器)默认不会截断请求路径前缀,请求会完整转发到后端服务:你访问{公网IP}/canvas/health时,转发到canvas-service的请求路径是/canvas/health,但你的服务仅配置了/health路由,无带/canvas前缀的路由规则,因此返回404。

你认为GCE原生Ingress更容易落地的认知仅适用于无路径重写需求的场景:如果服务本身支持前缀路由,GCE原生Ingress全托管无需额外维护,确实更简单;如果需要路径重写、限流、跨域等高级路由能力,Nginx Ingress灵活度更高,配置通用性更强。


修复方案

方案1:继续使用GCE原生Ingress(无需更换控制器)

无需修改Ingress配置,仅调整服务侧路由规则即可:

  • 如果使用Spring Boot等框架,直接配置全局上下文前缀即可,无需修改业务代码:例如canvas服务配置server.servlet.context-path=/canvas,调整后服务的健康检查路径自动变为/canvas/health
  • 若无法修改服务配置,需自定义GCE URL Map实现路径重写,配置复杂度较高,不推荐

方案2:切换为Nginx Ingress(推荐,无需修改现有服务)

你之前部署Nginx Ingress无法暴露公网IP,大概率是未选择官方部署方式或未配置LoadBalancer类型的服务,按以下步骤操作即可:

  1. 用Helm安装官方Nginx Ingress(GKE环境自动适配):
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace
  1. 给Nginx Ingress绑定你已申请的静态公网IP:
kubectl annotate service ingress-nginx-controller -n ingress-nginx kubernetes.io/ingress.global-static-ip-name=services-ip
  1. 替换原有Ingress配置,新增路径重写规则:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: services-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /canvas(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: canvas-service
            port:
              number: 80
      - path: /video(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: video-service
            port:
              number: 80

该配置会自动将/canvas/health重写为/health后转发到后端服务,完全兼容你现有服务的路由规则。


内容的提问来源于stack exchange,提问作者Ryan Oillataguerre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:54:03