具有多个目标重写的 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 入口控制器
Kubernetes入口中基于Traefik路径的路由无法按预期工作