【问题标题】:Multiple Rewrites with nginx ingress annotations on Kubernetes?在 Kubernetes 上使用 nginx 入口注释进行多次重写?
【发布时间】:2019-09-10 18:38:51
【问题描述】:

我相信我必须创建多个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(或其他地方)中指定重写目标->路径的映射,或者我必须将同一主机的不同重写规则分成不同的

【问题讨论】:

    标签: kubernetes kubernetes-ingress nginx-ingress


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

    2. 你可以考虑试试Nginx Plus based Ingress

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

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

    这里是官方example

    如果有帮助,请告诉我。

    【讨论】:

    • 该注释适用于 nginxinc/kubernetes-ingress,但此问题针对 kubernetes/ingress-nginx,如问题中的 ingress sn-p 所示。下面对这两种类型的nginx入口控制器的区别进行说明:github.com/nginxinc/kubernetes-ingress/blob/master/docs/…
    • 您确定可以在同一主机上创建多个入口并分别对每个入口应用重写规则吗?我一直在尝试这样做,并检查 nginx 配置,看起来它们都合并在一起了。
    【解决方案2】:

    TL;DR;您并不是真的要能够为 kubernetes/ingress-nginx 控制器类型配置多次重写。尽管可以使用基于正则表达式的重写和捕获组以有限的方式将其破解,正如我发布到 How to proxy_pass with nginx-ingress? 的答案中所解释的那样。

    希望这会有所帮助。

    【讨论】:

    • 对同一主机使用多个 Ingress 是否可行?或者那是不可能的。我预计每个主机不会有大量的重写规则(大约 2 个),但我确实希望能够轻松添加新主机。如果这意味着每个重写/主机添加 1 个 Ingress,它可能是可管理的。
    猜你喜欢
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2020-11-26
    • 2018-05-27
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多