Traefik Consul集成中的多个前端规则

时间:2017-07-07 06:29:18

标签: consul traefik

我使用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标签定义多个规则取得了成功?

2 个答案:

答案 0 :(得分:12)

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

tags=[
"traefik.frontend.foo.rule=Host:api.service.consul",
"traefik.frontend.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"]

文档链接:

答案 1 :(得分:-1)

其他答案回答的问题略有不同,即如何将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://github.com/NativeScript/nativescript-angular/issues/617(我现在在ldez的最近编辑的答案中看到)。