8

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

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

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

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

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

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

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

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

4

3 回答 3

13

编辑: 从 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"]

文档链接:

于 2018-02-15T02:22:03.653 回答
0

据此匹配器规则的正确组合可能是

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

另见官方文档

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

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

于 2018-02-21T19:23:57.680 回答
-1

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

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

[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' 最近编辑的答案中看到)。

于 2019-01-01T12:28:09.947 回答