NGINX 入口控制器中的 Stripprefix 中间件
Stripprefix Middleware in NGINX Ingress controller
我们已经在我们的 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
问题一:
我们现在正计划从 Traefik 迁移到 Nginx Ingress Controller。有什么方法可以在 Nginx 上复制类似于 Traefik 配置的相同内容。我不确定我是否以正确的方式进行比较。如能得到指点,将不胜感激。
问题二:
我们希望在 Nginx 中实现 stripprefix 功能,但没有找到任何有用的文档。非常感谢这方面的任何线索。
您可以使用 rewrite-target
annotation 实现 nginx ingress 中的 StripPrefix 功能。
当使用 rewrite-target
时,启用正则表达式路径匹配,它允许您将路径的任何部分匹配到组中并基于此重写路径。
在您的情况下,它看起来如下所示:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
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: /
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-xyz/cname-sample/ 不工作,这是我要解决的首要问题。请告诉我你的想法。
此问题现已解决。我们还没有部署一些使我们误入歧途的应用程序依赖项。 pods 显示 运行 状态,应用程序正在等待加载依赖项,但未收到任何服务请求。感谢 HelloWorld 推荐正确的方法。
我们已经在我们的 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
问题一: 我们现在正计划从 Traefik 迁移到 Nginx Ingress Controller。有什么方法可以在 Nginx 上复制类似于 Traefik 配置的相同内容。我不确定我是否以正确的方式进行比较。如能得到指点,将不胜感激。
问题二: 我们希望在 Nginx 中实现 stripprefix 功能,但没有找到任何有用的文档。非常感谢这方面的任何线索。
您可以使用 rewrite-target
annotation 实现 nginx ingress 中的 StripPrefix 功能。
当使用 rewrite-target
时,启用正则表达式路径匹配,它允许您将路径的任何部分匹配到组中并基于此重写路径。
在您的情况下,它看起来如下所示:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
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: /
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-xyz/cname-sample/ 不工作,这是我要解决的首要问题。请告诉我你的想法。
此问题现已解决。我们还没有部署一些使我们误入歧途的应用程序依赖项。 pods 显示 运行 状态,应用程序正在等待加载依赖项,但未收到任何服务请求。感谢 HelloWorld 推荐正确的方法。