nginx - NGINX入口控制器中的Stripprefix中间件。
我们已经在Kubernetes集群上部署了Traefik 2.2,并创建了以下的入口路径来访问我们的应用程序。这个配置对我们来说很好,目前对我们的生产系统也是如此。
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: application-xyz
spec:
tls: {}
entryPoints:
- web
- websecure
routes:
- match: "HostRegexp(`application-xyz.com`) && PathPrefix(`/`)"
kind: Rule
priority: 1
services:
- name: application-xyz-service
port: 80
- match: "PathPrefix(`/application-xyz/`)"
kind: Rule
services:
- name: application-xyz-service
port: 80
middlewares:
- name: application-xyz-stripprefix
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: application-xyz-stripprefix
namespace: frontend
spec:
stripPrefix:
prefixes:
- /application-xyz/
forceSlash: false
问题1:我们现在计划从Traefik迁移到Nginx Ingress Controller。有没有什么方法可以让我们在Nginx上复制类似Traefik配置的配置。我不知道我比较的方式是否正确。如果我们能得到任何提示,将不胜感激。
问题2:我们希望在Nginx上实现stripprefix功能,但没有找到任何有用的文档。任何这方面的线索都是非常感激的。
【回答】:
在nginx ingress中的StripPrefix功能,你可以使用实现 rewrite-target
注释.当 rewrite-target
启用了 regexp 路径匹配,它允许你将路径的任何部分匹配成组,并基于此重写路径。
在你的情况下,它看起来像下面。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
name: rewrite
namespace: default
spec:
rules:
- host: application-xyz.com
http:
paths:
- backend:
serviceName: application-xyz-service
servicePort: 80
path: /(.*)
- http:
paths:
- backend:
serviceName: application-xyz-service
servicePort: 80
path: /application-xyz/(.*)
如果你觉得我的回答需要更详细的解释,请随时提问。
【回答】:@HelloWorld,谢谢你的回复。我已经尝试过这个配置,但没有达到预期的效果。请看下面我试过的代码。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: application-xyz-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: cname.application-xyz.com
http:
paths:
- backend:
serviceName: application-xyz-service
servicePort: 80
path: /(.*)
- host: application-xyz.com
http:
paths:
- path: /cname-sample/(.*)
backend:
serviceName: application-xyz-service
servicePort: 80
在这个配置下,cname.application-xyz.com工作正常,但application-xyzcn-sample不工作,这是我想解决的首要问题。请把你的想法告诉我。
【回答】:这个问题现在已经解决了。我们还没有部署一些应用程序的依赖关系,这让我们陷入了错误的方向。pods显示Running状态为,应用程序正在等待依赖关系加载,没有收到任何请求服务。感谢HelloWorld提出的正确方法。