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类型的服务,按以下步骤操作即可:
- 用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
- 给Nginx Ingress绑定你已申请的静态公网IP:
kubectl annotate service ingress-nginx-controller -n ingress-nginx kubernetes.io/ingress.global-static-ip-name=services-ip
- 替换原有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
相关产品推荐
相关产品推荐

