首页 文章

基于路径的路由将Traefik问题作为Ingress Controller

提问于
浏览
1

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

难道我做错了什么 ?

1 回答

  • 4

    ReplacePathRegexmodifier 规则 . 根据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:/ products将匹配/产品,但不匹配/ products / shoes . 如果您的后端侦听特定的基本路径但是也在子路径上提供请求,请使用前缀匹配器 . 例如,PathPrefix:/ products会匹配/产品,还会匹配/ products / shoes和/ products / shirts . 由于路径按原样转发,因此您的后端应该监听/产品 . 如果后端侦听根路径(/),则应使用* Strip匹配器,但应在特定前缀上路由 . 例如,PathPrefixStrip:/ products会匹配/产品,还会匹配/ products / shoes和/ products / shirts . 由于路径在转发之前被剥离,因此您的后端应该在/上侦听 . 如果您的后端正在提供资产(例如,图像或Javascript文件),则可能必须返回正确构造的相对URL . 继续这个例子,后端应该返回/products/shoes/image.png(而不是/images.png,Traefik可能无法与同一个后端关联) . 可以查询X-Forwarded-Prefix标头(自Traefik 1.3以来可用)以动态构建此类URL . 您可以添加主机匹配器,而不是仅通过路径区分后端 . 这样,除了路径之外,后端的命名空间基于主机发生 .

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

相关问题