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

如何配置K8s Ingress实现路径路由且不转发前缀至后端服务?

问题描述

我有两个LoadBalancer类型的K8s服务:

order             LoadBalancer   10.43.246.181   172.20.0.2    50001:31493/TCP                  11h
payment           LoadBalancer   10.43.150.222   172.20.0.2    50002:30885/TCP                  11h

它们分别路由至无上下文路径、暴露8080端口的Pod(如a.b.c.d:8080、v.x.y.z:8080)。

我的Ingress配置如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-ing
  annotations:
    ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
          - path: /order
            pathType: Prefix
            backend:
              service:
                name: order
                port:
                  number: 50001
          - path: /payment
            pathType: Prefix
            backend:
              service:
                name: payment
                port:
                  number: 50002

当我执行curl命令访问/order路径时:

curl --location 'http://localhost:8080/order/orders'

order Pod返回错误:

No mapping for POST /order/orders

若将Ingress路径改为根路径:

- path: /
            pathType: Prefix
            backend:
              service:
                name: order
                port:
                  number: 50001

执行curl命令:

curl --location 'http://localhost:8080/orders'

则可正常访问。

我的问题:能否不将路径"/order"转发至Pod?如何配置Ingress实现像第一个清单那样的不同路径路由至对应服务?


解决方案

问题出在Ingress的重写规则配置上。当前的rewrite-target: /仅会把请求路径替换为根,但对于/order/orders这类带后续路径的请求,Nginx Ingress并未正确移除前缀/order。

针对Kubernetes v1版本的Ingress(networking.k8s.io/v1),需要使用正则捕获组来匹配并重写路径,具体配置如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-ing
  annotations:
    ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
    - http:
        paths:
          - path: /order(/|$)(.*)
            pathType: ImplementationSpecific
            backend:
              service:
                name: order
                port:
                  number: 50001
          - path: /payment(/|$)(.*)
            pathType: ImplementationSpecific
            backend:
              service:
                name: payment
                port:
                  number: 50002

配置说明:

  • path: /order(/|$)(.*):用正则表达式匹配路径,/order后的(/|$)匹配斜杠或路径结束符,(.*)捕获后续所有路径内容。
  • rewrite-target: /$2:将请求重写为/$2,即只保留第二个捕获组的内容,完全剔除/order前缀。
  • pathType: ImplementationSpecific:由于使用了正则路径,需指定该类型,让Nginx Ingress控制器处理路径匹配逻辑。

配置完成后,访问http://localhost:8080/order/orders时,Ingress会将请求转发至order服务的/orders路径,Pod可正常处理;同理/payment/xxx会转发至payment服务的/xxx路径。

若使用较新版本的Nginx Ingress控制器,也可添加nginx.ingress.kubernetes.io/use-regex: "true"注解配合正则路径,效果一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:04:58