在Kubernetes上使用Nginx Ingress注释进行多次重写?

时间:2019-09-10 18:38:51

标签: kubernetes kubernetes-ingress nginx-ingress

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

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

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(或其他位置)中指定重写目标->路径的映射,或者我必须将同一主机的不同重写规则分离为不同的

2 个答案:

答案 0 :(得分:2)

  1. 您可以使用注释在同一主机和不同路径下创建多个入口。因此,这将是您最初怀疑的解决方案。

  2. 您可以考虑尝试Nginx Plus based Ingress

  

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

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

这是官方的example

请告诉我是否有帮助。

答案 1 :(得分:1)

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

希望这会有所帮助。