首页 > 解决方案 > Q: 如何用 ingress-nginx 重写多条路径中的单条路径

问题描述

我的 Ingress 上已经有很多具有如此多路径的域,因为这是一个包含许多微服务的环境。

如何以某种方式编辑我的入口,例如当有人访问路径/servicex/serviceb

我当前的入口如下(为简单起见,我省略了其他主机的一些路径)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: main-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    nginx.ingress.kubernetes.io/proxy-body-size: "100m"
    nginx.ingress.kubernetes.io/max-worker-connections: "0"
    nginx.ingress.kubernetes.io/max-worker-open-files: "0"
    nginx.ingress.kubernetes.io/client-header-buffer-size: "4k"
spec:
  tls:
  - hosts:
    - subdomain-a.domain.com
    - subdomain-b.domain.com
    - subdomain-c.domain.com
    - subdomain-d.domain.com
    - subdomain-e.domain.com
    secretName: domain-com-secret
  rules:
  - host: subdomain-a.domain.com
    http:
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: default-service
              port:
                number: 80
        - path: /serviceb
          pathType: Prefix
          backend:
            service:
              name: b-service
              port:
                number: 80
        - path: /servicec
          pathType: Prefix
          backend:
            service:
              name: c-service
              port:
                number: 80
        - path: /serviced
          pathType: Prefix
          backend:
            service:
              name: d-service
              port:
                number: 80
        - path: /servicee
          pathType: Prefix
          backend:
            service:
              name: e-service
              port:
                number: 80
        - path: /servicee
          pathType: Prefix
          backend:
            service:
              name: e-service
              port:
                number: 80
        - path: /servicef
          pathType: Prefix
          backend:
            service:
              name: f-service
              port:
                number: 80
        - path: /serviceg
          pathType: Prefix
          backend:
            service:
              name: g-service
              port:
                number: 80

  - host: subdomain-b.domain.com
    < tons of other rules >

  - host: subdomain-c.domain.com
    < tons of other rules >

  - host: subdomain-d.domain.com
    < tons of other rules >

  - host: subdomain-e.domain.com
    < tons of other rules >

换句话说,/serviceb如果用户输入以下任何内容,我们希望获得访问权限:

我已经查看了 rewrite 选项,但在我看来,如果我添加注释nginx.ingress.kubernetes.io/rewrite-target: /servicex/$2,然后尝试执行以下操作:

- path: /serviceb(/|$)(.*)
          pathType: Prefix
          backend:
            service:
              name: serviceb
              port:
                number: 80

不起作用,因为首先,我们已经采用了该路径,其次我认为注释将适用于整个事物,这将损坏所有其他路径。

在此先感谢,任何帮助将不胜感激

标签: nginxkubernetesingress-nginx

解决方案


NGINX 入口与 NGINX 中的入口几乎相同。在大多数情况下,内置注解可以帮助您配置 NGINX 中的标准操作。

但是,如果您遇到任何类型的自定义,例如您的案例,您也可以通过这两个注释自由输入服务器或配置片段。

nginx.ingress.kubernetes.io/server-snippetnginx.ingress.kubernetes.io/configuration-snippet

在代码片段中,你可以像普通的 NGINX 一样做任何你想做的事情。

在此处从您的回复中获取配置以获取其他信息。

nginx.ingress.kubernetes.io/configuration-snippet: |-
  rewrite ^(/servicex)(.*) /serviceb$2 last; 

推荐阅读