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 推荐正确的方法。