ingress-nginx多路径场景下如何单独重写指定访问路径
解决方案
你可以通过创建独立的专属Ingress资源实现需求,完全不需要修改现有main-ingress的任何配置,也不会影响其他已有路由规则。
核心逻辑
Ingress资源的注解仅作用于当前资源本身,你可以单独创建一个只处理/servicex路径的Ingress,在该Ingress内配置重写规则,和原有Ingress完全隔离。
配置示例
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: servicex-route-ingress annotations: # 仅作用于当前Ingress的重写规则:将/servicex/后续路径拼接到/serviceb/之后 nginx.ingress.kubernetes.io/rewrite-target: /serviceb/$2 # 保持和原有Ingress一致的基础配置即可 nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/force-ssl-redirect: "false" nginx.ingress.kubernetes.io/proxy-body-size: "100m" spec: tls: - hosts: - subdomain-a.domain.com secretName: domain-com-secret # 如果集群指定了ingressClassName,请和原有main-ingress保持一致 # ingressClassName: nginx rules: - host: subdomain-a.domain.com http: paths: - path: /servicex(/|$)(.*) pathType: Prefix backend: service: name: b-service port: number: 80
生效后效果
- 访问
https://subdomain-a.domain.com/serviceb/*完全沿用原有逻辑,无任何变更 - 访问
https://subdomain-a.domain.com/servicex/foo会在服务端内部重写为/serviceb/foo由b-service响应,用户侧URL不会发生跳转
可选方案:无需新增Ingress的配置方式
如果你不想新增独立Ingress,也可以在现有main-ingress中调整,操作如下:
- 在原有
main-ingress的annotations中新增:nginx.ingress.kubernetes.io/rewrite-target: /$2 - 在
subdomain-a.domain.com的路径规则中新增如下配置:
- path: /servicex(/|$)(.*) pathType: Prefix backend: service: name: b-service port: number: 80
注意:该方案要求现有Ingress的所有其他路径都不需要重写逻辑,否则会影响已有路由,因此更推荐使用第一种独立Ingress的方案。
内容的提问来源于stack exchange,提问作者William Añez
相关产品推荐
相关产品推荐

