具有多个目标重写的 kubernetes 入口

Posted

技术标签:

【中文标题】具有多个目标重写的 kubernetes 入口【英文标题】:kubernetes ingress with multiple target-rewrite 【发布时间】:2018-09-05 23:16:28 【问题描述】:

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

nginx.ingress.kubernetes.io/rewrite-target: /

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

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

我的服务将接收/ 中的数据。但是,我希望我的服务front-main 发送根/ 和服务器back-main 发送/someotherpath/。我该怎么做?

有没有类似下面这行的?

nginx.ingress.kubernetes.io/rewrite-target: "front-main: / ; back-main: /someotherpath"

我似乎在文档中找不到答案。

【问题讨论】:

【参考方案1】:

很遗憾,基于 Nginx 免费版的 Ingress 没有该功能。

但是,如果你可以使用Nginx Plus based Ingress,你可以通过注解来实现。

这是来自官方仓库的example:

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

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

/tea/ -> /
/tea/abc -> /abc

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

/coffee/ -> /beans/
/coffee/abc -> /beans/abc

【讨论】:

其实我之前用过nginxinc/kubernetes-ingress,不过希望有更好的解决方案。 自此发布以来,Nginx Ingress 0.22.0 已发布,其中包含用于重定向的新语法 (github.com/kubernetes/ingress-nginx/tree/master/docs/examples/…)。我认为现在可以通过选择正确的捕获组来解决 OP 的问题。也许 Anton 的例子也可以使用两个独立的 ingresses 和两个不同的重写规则来解决。 有人已经找到如何用这种新语法解决这个问题了吗?有什么可行的例子吗?【参考方案2】:

另一种解决方案是创建两个入口 yaml 文件

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

【讨论】:

看看这是如何使用同一主机完成的将是有益的。在野外有没有一个例子? @JuanEnciso 您能否详细了解这是如何完成的?我希望它可以使用相同的“主机”来完成,我不想将我的 API 放在单独的端点上。在这种情况下。 抱歉,又看了一遍,是的,我刚刚弄好了。负载均衡器 IP 应该保持不变,只是更好地重定向流量。我真的应该转过头来,这些只是将配置传递给另一个服务中的 nginx,真的。

以上是关于具有多个目标重写的 kubernetes 入口的主要内容,如果未能解决你的问题,请参考以下文章

具有多个入口资源对象的 Kubernetes nginx 入口控制器

k8s nginx 入口重写目标注释未按预期工作

Kubernetes入口中基于Traefik路径的路由无法按预期工作

带有入口 kubernetes 的 Spring Cloud oauth 2

Kubernetes——基本概念与理论

Kubernetes——基本概念与理论