首页 > 解决方案 > 在 Kubernetes 上使用 nginx 入口注释进行多次重写?

问题描述

我相信我必须创建多个Ingress资源才能达到预期的效果,但必须问,是否可以为同一主机使用 nginx(社区)控制器进行多个 rewrite annotations?

我有以下内容,但据我了解,它不起作用,因为无法将重写规则显式链接到路径。在这种情况下,我想它可以使用捕获组数量不同的事实,但情况并非总是如此。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: api-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: https://staging.example.com/keyword-lnk/badnewsbears/$1/$2
    nginx.ingress.kubernetes.io/rewrite-target: https://staging.example.com/lnk/$2
    certmanager.k8s.io/cluster-issuer: staging-letsencrypt-prod

spec:
  rules:
    - host: staging.example.com
      http:
        paths:
         - path: /
           backend:
              serviceName: api-service
              servicePort: http
    - host: badnewsbears.example.com
      http:
        paths:
          - backend:
              serviceName: api-service
              servicePort: http
            path: ^(/a/)(.*)$
          - backend:
              serviceName: api-service
              servicePort: http
            path: ^/([tbc])/(.*)
  tls:
  - hosts:
    - staging.example.com
    - badnewsbears.example.com
    secretName: letsencrypt-prod-issuer-account-key
    # ^ must be set to the key matching the annotation
    # certmanager.k8s.io/cluster-issuer above

目标是请求staging.example.com不进行重写,但请求badnewsbears.example.com/t/soup重写为https://staging.example.com/keyword-lnk/badnewsbears/t/soup,而 badnewsbears.example.com/a/soup产量https://staging.example.com/lnk/$2

有没有办法在(或其他地方)指定重写目标->路径的映射Ingress,或者我是否必须将同一主机的不同重写规则分成不同的

标签: kuberneteskubernetes-ingressnginx-ingress

解决方案


  1. 您可以使用相同的主机和不同的路径创建多个应用注释的入口。所以这将是您首先怀疑的解决方案。

  2. 您可以考虑尝试基于 Nginx Plus 的 Ingress

要配置 URI 重写,您需要将nginx.org/rewrites 注释添加到 Ingress 资源定义中。注释语法如下:

nginx.org/rewrites: "serviceName=service1 rewrite=rewrite1[;serviceName=service2 rewrite=rewrite2;...]"

这是官方的例子

请让我知道这是否有帮助。


推荐阅读