3

我正在解决看起来像配置问题的问题!我在 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

难道我做错了什么 ?

4

1 回答 1

6

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

ReplacePathRegex修饰规则。根据文件

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

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

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

要路由请求,您应该使用匹配器

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

用 ,(逗号)分隔多个规则值,以启用任何语义(即,如果任何规则匹配,则转发请求)。不适用于 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.pngTraefik 可能无法与同一后端关联的那个)。X-Forwarded-Prefix可以查询标头(自 Traefik 1.3 起可用)以动态构建此类 URL 。

您可以添加一个主机匹配器,而不是仅通过路径来区分您的后端。这样,除了路径之外,您的后端的命名空间也是基于主机发生的。

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

于 2018-07-04T15:27:10.477 回答