【问题标题】:Multi path routing with traefik marathon on the same host在同一主机上使用 traefik marathon 进行多路径路由
【发布时间】:2018-03-31 23:57:12
【问题描述】:

我在马拉松上运行了两个应用程序。
我希望 web.myblog.com 路由到 App 1,web.myblog.com/app 路由到 app2。

使用以下配置,所有流量都将流向应用 1。

App 1  
traefik.frontend.rule=HostRegexp:{subdomain:[a-z]+}.myblog.com

App 2  
traefik.frontend.rule=Host:web.myblog.com;PathPrefix:/app

我尝试使用负匹配来排除应用程序 1 的 /app 路由,但据我了解,golang 不完全支持负前瞻,因此在 traefik 中也不完全支持。

我也尝试像这样为应用程序 1 指定路径前缀 traefik.frontend.rule=Host:web.myblog.com;PathPrefix:/ 但这没有效果。

当我修改应用程序 1 的规则以指向 Host:test.myblog.com 时,所有流量都正确地流向应用程序 2,由此我得出结论,应用程序 2 的路由配置是正确的,它只是被忽略了,因为应用程序 1 取代了它,因为它也满足路线。

这个问题正在讨论这个确切的用例:
https://github.com/containous/traefik/issues/419#issuecomment-223843103

但是看起来没有pathPrefix的配置优先于带有pathPrefix的配置,也许马拉松后端根本不支持这种类型的配置?

从这个文档中我不清楚:
https://github.com/fclaeys/traefik/blob/master/docs/basics.md

寻找可以帮助我了解马拉松后端是否完全支持此用例的答案,或者它的示例工作配置。

使用 Traefik v1.5.1

【问题讨论】:

  • 令我惊讶的是,“traefik.frontend.rule=Host:web.myblog.com;PathPrefix:/”对你不起作用。正如您在自己的答案中所写,Traefik 进行最长路径匹配。因此,任何带有 /app 前缀的请求都应该到达应用程序 2,而任何缺少该前缀的请求都应该到达应用程序 1。如果这不起作用,则可能存在错误(或者我记错了行为)。跨度>
  • 我刚刚编辑了您的帖子,因为它在最初的段落中使用了app 主机,但后来使用了myblog。希望我的修复是正确的,如果不告诉我。
  • 这是规则的实际句法长度。规则 1 对规则的一部分使用了正则表达式,因此总体上更长。
  • 我指的是您在段落中提到的更新规则,开头是“我还尝试为应用程序 1 指定路径前缀 [...]”。这样一来,应用 1 和应用 2 的规则之间的差异似乎可以归结为路径值。

标签: go marathon traefik


【解决方案1】:

如果多个规则匹配 traefic 将使用规则的长度来确定哪个规则最具体,而不是实际的特异性。您可以使用

覆盖此人为优先级

traefik.frontend.priority=1000

更多信息: https://github.com/containous/traefik/issues/1663

【讨论】:

    【解决方案2】:

    如果我将应用程序 1 的规则调整为

    traefik.frontend.rule=Host:web.myblog.com;PathPrefix:/
    

    根据你的一次尝试,坚持下去

    traefik.frontend.rule=Host:web.myblog.com;PathPrefix:/app
    

    在应用 2 上,路由行为似乎与预期一致:带有 web.myblog.com 主机和 /app 路径的请求以独占方式且确定性地转到应用 2(因为 Traefik 采用最长路径匹配)。如果我修改请求以使用根路径 /(或除 /app 之外的任何路径,因为它们都将包含匹配的根路径前缀),流量将转发到应用程序 1。

    我针对 Marathon 1.3.10 进行了测试。

    【讨论】:

    • 您没有在第一条路线上使用正则表达式。正则表达式导致规则更长,因此优先。您的第二条规则长 3 个字符,这就是它起作用的原因,与 PathPrefix 无关。
    • 没错。我从您的 SO 问题(我的强调)中回复了此声明:我还尝试为应用程序 1 指定路径前缀,例如 traefik.frontend.rule=Host:web.myblog。 com;PathPrefix:/ 但这没有效果。我试图证明与原始的正则表达式/无正则表达式规则组合相比,它确实对我产生了影响。
    猜你喜欢
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    相关资源
    最近更新 更多