【问题标题】:Path based routing issues Traefik as Ingress Controller基于路径的路由问题 Traefik 作为 Ingress Controller
【发布时间】:2018-07-03 13:54:16
【问题描述】:

我遇到了一个配置问题!我在 kubernetes 中使用 traefik 作为入口控制器,并且我有一个入口来路由一些 URL,以将一些前端路由到各种后端。假设我有这样的事情:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.frontend.rule.type: ReplacePathRegex
spec:
  rules:
  - host: foo.io
    http:
      paths:
      - path: /api/authservice/(.*) /$1
        backend:
          serviceName: auth
          servicePort: 8901
      - path: /api/svcXXX/v1/files/cover/(.*) /v1/files/cover/$1
        backend:
          serviceName: files
          servicePort: 8183
      - path: /api/svcXXX/v1/files/image/(.*) /v1/files/image/$1
        backend:
          serviceName: files
          servicePort: 8183

使用 Postman(或任何其他客户端),如果我在 http://foo.io/api/authservice/auth/oauth/token 上发布请求,同时查看访问日志,它似乎被路由到 http://foo.io/api/svcXXX/v1/files/image/(.*) /v1/files/image/$1。我在访问日志中看到了这一点:

[03/Jul/2018:12:57:17 +0000] "POST /api/authservice/auth/oauth/token HTTP/1.1" 401 102 "-" "PostmanRuntime/7.1.5" 15 "foo.io/api/svcXXX/v1/files/image/(.*) /v1/files/image/$1" 37ms

我是不是做错了什么?

【问题讨论】:

    标签: kubernetes traefik kubernetes-ingress traefik-ingress


    【解决方案1】:

    注意:由于文档有所更改,我更新了链接,但文档页面上的内容会有所不同。

    ReplacePathRegex 是一个修饰符 规则。根据documentation

    修改器规则只修改请求。它们对正在制定的路由决策没有任何影响。

    以下是现有修饰符规则的列表:

    • AddPrefix/products:在将请求转发到后端之前,将路径前缀添加到现有请求路径。
    • ReplacePath/serverless-path:替换路径并将旧路径添加到 X-Replaced-Path 标头。用于映射到 AWS Lambda 或 Google Cloud Functions。
    • ReplacePathRegex^/api/v2/(.*) /api/$1:用正则表达式替换路径,并将旧路径添加到 X-Replaced-Path 标头。用空格分隔正则表达式和替换。

    要路由请求,您应该使用matchers:

    匹配器规则确定是否应将特定请求转发到后端。

    用 ,(逗号)分隔多个规则值,以启用任何语义(即,如果任何规则匹配,则转发请求)。不适用于 Headers 和 HeadersRegexp。

    用 ; 分隔多个规则值(分号)以启用所有语义(即,如果所有规则都匹配,则转发请求)。

    ###Path 匹配器使用指南 本节说明何时使用各种路径匹配器。

    如果您的后端仅侦听确切的路径,请使用 Path。例如, Path: /products 将匹配 /products 但不匹配 /products/shoes

    如果您的后端侦听特定的基础,请使用 *Prefix* 匹配器 路径,但也为子路径上的请求提供服务。例如,PathPrefix: /products 将匹配 /products 但也匹配 /products/shoes/products/shirts。由于路径按原样转发,因此您的后端是 预计会在 /products 上收听。

    如果您的后端在根路径 (/) 上侦听,但使用 *Strip 匹配器 应该可以在特定前缀上路由。例如, PathPrefixStrip: /products 将匹配 /products 但也 /products/shoes/products/shirts。由于路径被事先剥离 要转发,您的后端预计会在 / 上收听。如果你的 后端正在服务资产(例如,图像或 Javascript 文件),机会 它是否必须返回正确构造的相对 URL。继续 例如,后端应该返回/products/shoes/image.png(和 不是/images.png,Traefik 可能无法关联 使用相同的后端)。 X-Forwarded-Prefix 标头(自 Traefik 1.3) 可以查询以动态构建此类 URL。

    您可以添加一个 主机匹配器混合。这样,后端的命名空间 除了路径之外,还基于主机发生。

    可以找到匹配器的完整列表及其描述here

    【讨论】:

    • 需要注意的是2.6不支持这些注解。请注意,您的最后一个链接指向中间件,并非所有人都想要或关心。 plain ingress 不支持 traefik 中的此类功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 2019-06-22
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多