【问题标题】:Stripprefix Middleware in NGINX Ingress controllerNGINX Ingress 控制器中的 Stripprefix 中间件
【发布时间】:2020-05-21 14:00:15
【问题描述】:

我们已经在我们的 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 kubernetes traefik nginx-ingress traefik-ingress


    【解决方案1】:

    您可以使用rewrite-target annotation 实现 nginx 入口中的 StripPrefix 功能。 当使用rewrite-target 时,正则表达式路径匹配被启用,它允许您将路径的任何部分匹配到组中并基于此重写路径。

    在您的情况下,它如下所示:

    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/(.*)
    

    如果您觉得我的回答需要更详细的解释,请随时提问。

    【讨论】:

    • 请检查答案以进行进一步分析。
    【解决方案2】:

    @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-xyz/cname-sample/ 无法正常工作,这是我要解决的首要问题。请让我知道你的想法。

    【讨论】:

    • application-xyz/cname-sample/ 不起作用是什么意思?您能否提供无效的示例 URL?
    • 当我访问 application-xyz.com/cname-sample 时,这并没有像原始 Traefik 配置一样被重定向。
    • 这很奇怪,因为在我的测试设置中它正在工作(我可以访问应用程序)当我这样做时:curl 192.168.39.96/cname-sample/ -H "Host: application-xyz.com"
    • 现在才明白这个问题,它没有读取 /cname-sample/(.*) 规则本身并直接将我扔到我的错误页面。
    • 我们决定使用 Kong 而不是 Ingress Controller,我们可以使用 Kong 中的多个插件来解决这个问题。感谢您检查此问题HelloWorld
    【解决方案3】:

    此问题现已修复。我们还没有部署一些使我们走错方向的应用程序依赖项。 pod 显示为运行状态,应用程序正在等待加载依赖项并且没有收到任何服务请求。感谢 HelloWorld 提出正确的方法。

    【讨论】:

      猜你喜欢
      • 2018-08-31
      • 2021-09-22
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      相关资源
      最近更新 更多