【问题标题】:Multiple frontend rules in Traefik Consul integrationTraefik Consul 集成中的多个前端规则
【发布时间】:2017-07-07 06:29:18
【问题描述】:

我正在使用 Traefik 在 Consul 中注册的不同服务之间进行负载平衡。

我正在使用consul-catalog 配置并通过在 consul 中定义服务时添加标签来覆盖其中一项服务的前端路由规则:

tags=[“traefik.frontend.rule=PathPrefixStrip:/api,Host:api.service.consul”]

我希望 /apiapi.service.consul 都能解析我的服务,但只有 /api 成功,但 api.service.consul 返回 404 错误。

换句话说,只考虑第一条规则。如果我切换标签:

tags=[“traefik.frontend.rule=Host:api.service.consul,PathPrefixStrip:/api”]

然后api.servie.consul 解析,/api 返回 404 错误。

我相信文档建议支持此配置。有没有其他人成功地通过 consul 标签定义了多个规则?

【问题讨论】:

  • 您正在这里寻找ANDOR 操作?

标签: consul traefik


【解决方案1】:

编辑: 从 v1.7 开始,对于 consul-catalog,您可以使用:multiple-frontends-for-a-single-service

tags=[
"traefik.frontends.foo.rule=Host:api.service.consul",
"traefik.frontends.bar.rule=PathPrefixStrip:/api",
]

答案可见https://github.com/containous/traefik/issues/2417

  • , 是 OR 运算符(仅适用于匹配器,例如:Host:foo.com,bar.com
  • ; 是 AND 运算符(仅适用于匹配器之间,例如:Host:foo.com;Path:/bar

因此,对于您的示例,请使用:

tags=["traefik.frontend.rule=Host:api.service.consul;PathPrefixStrip:/api"]

文档链接:

【讨论】:

  • @Idez 您的第一句话可以解释为暗示这在 Traefik 的 v1.3 中有所不同。从the documentation 可以看出这是不正确的。鉴于此,即使自该版本以来确实发生了很多变化,该句子与问题和答案都无关,应该删除。 PS。发表评论时不要忘记使用@reply,以便通知目标用户。详情请参阅How do comment @replies work?
  • 这将匹配具有 both Host:api.service.consulPathPrefixStrip:/api 的事物。如果 either 为真,则问题是匹配的(所以 http://api.service.consul/test/hellohttp://some.other.host/api/test/hello 匹配)。
  • @Chris 如果您有兴趣,我发布的答案应该与 /apiapi.service.consul 中的任何一个匹配(而不是同时要求两者)。
  • @Idez 是 traefik.frontend.foo 还是 traefik.frontends.foo ?文档似乎表示复数。
【解决方案2】:

根据this匹配规则的正确组合可能是

tags=[“traefik.frontend.rule=Host:api.service.consul;PathPrefixStrip:/api”]

另见官方文档

https://docs.traefik.io/basics/

https://docs.traefik.io/configuration/backends/consulcatalog/

【讨论】:

    【解决方案3】:

    其他答案回答了一个稍微不同的问题[[编辑:他们做到了,直到这个答案中的想法在这里被复制到另一个答案中,请参阅下面的评论]],即如何将 api.server.consol/api 映射到后端——因为他们要求主机名和 URL 路径同时匹配。然而,问题是如何让它们中的任何一个映射到后端(两者不必同时匹配)。

    我认为您可以通过声明两个前端来实现这一点,一个用于 Host 规则,一个用于 Path 规则,它们都使用相同的后端:(我还没有测试过)

    [frontends.frontend_1.routes.rule_1]
      backend = "the_backend"
      rule = "PathPrefix:/api"
    
    [frontends.frontend_2.routes.rule_1]
      backend = "the_backend"
      rule = "Host:api.service.consul"
    

    这与文件提供程序有关。不知道如何用 Consul 做到这一点——也许你可以添加很多标签?像这样?:

    tags=[
       “traefik.frontends.frontend_1.rule=Host:api.service.consul",
       "traefik.frontends.frontend_2.rule=PathPrefixStrip:/api”]
    

    编辑:上面的语法之前有轻微的损坏,现在我已经更正了。此处的文档:https://docs.traefik.io/v1.7/configuration/backends/consulcatalog/#multiple-frontends-for-a-single-service(我现在在 ldez' 最近编辑的答案中看到)。

    【讨论】:

    • 我投了反对票,因为我认为答案有点离题,并且建议的标签语法是错误的。我更新了我的答案以集中有效信息。
    猜你喜欢
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多