具有多个目标重写的kubernetes ingress

sil*_*gon 6 kubernetes kubernetes-ingress

通常,入口重写目标的工作方式如下:

nginx.ingress.kubernetes.io/rewrite-target: /
Run Code Online (Sandbox Code Playgroud)

这将重写您的服务名称的目标,因为它们位于根目录中.所以,如果我有这个:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  tls:
  rules:
    http:
      paths:
      - path: /
        backend:
          serviceName: front-main
          servicePort: 80
      - path: /api
        backend:
          serviceName: back-main
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)

我的服务将接收数据/.但是,我希望我的服务front-main发送root /和服务器back-main发送/someotherpath/.我怎样才能做到这一点?

有类似下面的行吗?

nginx.ingress.kubernetes.io/rewrite-target: "front-main: / ; back-main: /someotherpath"
Run Code Online (Sandbox Code Playgroud)

我似乎没有在文档中找到答案.

小智 13

另一个解决方案是创建两个 ingress yaml 文件

每一个都使用不同的注释。有用!

  • 了解如何使用同一主机完成此操作将很有帮助。在野外有这样的例子吗?@JuanEnciso 你能详细了解如何实现这一点吗?我希望它可以使用相同的“主机”来完成,我不想让我的 API 位于单独的端点上。在这种情况下。 (2认同)

Ant*_*nko 9

不幸的是,基于免费版Nginx的Ingress没有这个功能.

但是,如果你可以使用基于Nginx Plus的Ingress,你可以通过注释来实现.

以下是官方回购的示例:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    nginx.org/rewrites: "serviceName=tea-svc rewrite=/;serviceName=coffee-svc rewrite=/beans/"
spec:
  rules:
  - host: cafe.example.com
    http:
      paths:
      - path: /tea/
        backend:
          serviceName: tea-svc
          servicePort: 80
      - path: /coffee/
        backend:
          serviceName: coffee-svc
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)

下面是如何tea-svc重写对请求的URI的示例(注意/ tea请求被重定向到/ tea /).

/tea/ -> /
/tea/abc -> /abc
Run Code Online (Sandbox Code Playgroud)

下面是如何coffee-svc重写对请求的URI的示例(注意/ coffee请求被重定向到/ coffee /).

/coffee/ -> /beans/
/coffee/abc -> /beans/abc
Run Code Online (Sandbox Code Playgroud)

  • 自发布以来,Nginx Ingress 0.22.0已发布,带有用于重定向的新语法(https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/rewrite)。我认为现在可以通过选择正确的捕获组来解决OP的问题。也许Anton的示例也可以使用具有两个不同重写规则的两个单独的入口来解决。 (2认同)

ben*_*ris 7

重写注释的新语法允许您使用捕获组来定义rewrite-target,这可以在某些情况下用于实现您正在寻找的内容。

例如,如果您希望其中一项服务在其重写中保留匹配的 url ,而不是其他服务,则可以使用匹配组,如下所示:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1$2  # Here we concatenate the two matched groups
spec:
  rules:
    - http:
        paths:
        - path: /front()(.*)  # Here the first matching group is always empty
          pathType: Prefix
          backend:
            service:
              name: front-main
              port:
                number: 80
        - path: /(back)(.*)  # Here the first matching group matches 'back'
          pathType: Prefix
          backend:
            service:
              name: back-main
              port:
                number: 80
Run Code Online (Sandbox Code Playgroud)

因此/back/foo会重定向到back-serviceon /back/foo,但/front/foo会重定向到front-servicesimple to /foo

据我所知,这不能用于您要求的更一般的情况,例如重写/back/foo/some-completely-different-path.