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

Dav*_*enn 8 consul traefik

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

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

tags=[“traefik.frontend.rule=PathPrefixStrip:/api,Host:api.service.consul”]
Run Code Online (Sandbox Code Playgroud)

我期待两者/apiapi.service.consul解决我的服务,但只是/api成功,但api.service.consul返回404错误.

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

tags=[“traefik.frontend.rule=Host:api.service.consul,PathPrefixStrip:/api”]
Run Code Online (Sandbox Code Playgroud)

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

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

lde*_*dez 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",
]
Run Code Online (Sandbox Code Playgroud)

答案可以在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"]

文档链接:

  • 这将匹配具有*'Host:api.service.consul`和`PathPrefixStrip:/ api`的内容.问题是匹配如果***为真(所以`http:// api.service.consul/test/hello`和`http:// some.other.host/api/test/hello`匹配). (2认同)