我使用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标签定义多个规则取得了成功?
答案 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的最近编辑的答案中看到)。