2

客观的

我有一台运行 Rancher (Docker) 的服务器。在该服务器中,我有几个不相关的堆栈。

我想让 Traefik 成为该堆栈的主要交互点。并根据路径对不同容器的请求进行负载平衡/代理。

我想让它把流量发送/api到后端server服务。并将流量发送/frontend服务。

当前状态

docker-compose.yml这是我只显示相关服务的精简版:

version: '2'
services:
  server:
    image: server
    labels:
      - "traefik.frontend.rule=PathPrefix:/api"
      - "traefik.enable=true"
      - "traefik.port=80"
  frontend:
    image: frontend
    labels:
      - "traefik.frontend.rule=PathPrefix:/"
      - "traefik.enable=true"
      - "traefik.port=80"
  proxy:
    image: traefik:v1.4
    command: --web --accessLog --rancher --rancher.exposedbydefault=false --rancher.metadata=true
    volumes:
      - /dev/null:/traefik.toml

然后使用监听公共端口的 Rancher 负载均衡器,我将请求重定向app1.example.com到我的proxy服务。然后它接受请求并根据路径将流量重定向到两个容器中的每一个。

我还将流量重定向traefik.app1.example.com到同一个服务,重定向到访问 Web UIproxy的端口。8080

如果我只有一个堆栈,它可以工作。

问题

如果我添加另一个堆栈(或者如果我复制该堆栈)并且有更多带有 Traefik 标签的服务,则proxyfromapp1将从中的服务app2和任何其他声明 Traefik 标签的堆栈中读取标签。

然后,在 in 的 Web UIproxyapp1,我可以看到来自所有不同堆栈的所有后端。但是前端规则会被覆盖。

问题

到目前为止,我看到的示例大多是关于如何将 Traefik 用作独特的全局负载均衡器/代理。我刚刚意识到我假设我也可以为每个堆栈创建隔离的 Traefik 实例,或者 Traefik 负载均衡器的层次结构。

在我看来,我缺少一些配置或误解了一些东西。

但是,我仍然要问,是否有可能每个堆栈有不同的隔离 Traefik 实例,并让它们只监听和使用自己堆栈中的服务?

Rancher可以吗?是否可以使用任何其他 Docker 堆栈编排器(例如 Swarm)?

如果这是可能的,我错过了什么?

4

2 回答 2

4

我想我找到了解决方法。

看来我不能让 Traefik 直接在他自己的堆栈中使用服务。但似乎我可以使用Traefik 约束和标签来实现几乎相同的效果。

这是我docker-compose.yml使用约束和标签的更新:

version: '2'
services:
  server:
    image: server
    labels:
      - "traefik.frontend.rule=PathPrefix:/api"
      - "traefik.enable=true"
      - "traefik.port=80"
      - "traefik.tags=app1.example.com"
  frontend:
    image: frontend
    labels:
      - "traefik.frontend.rule=PathPrefix:/"
      - "traefik.enable=true"
      - "traefik.port=80"
      - "traefik.tags=app1.example.com"
  proxy:
    image: traefik:v1.4
    command: --web --accessLog --constraints=tag==app1.example.com --rancher --rancher.exposedbydefault=false --rancher.metadata=true
    volumes:
      - /dev/null:/traefik.toml

它只会匹配具有 Traefik 标签的服务app1.example.com。这些标签可以是任何字符串,但由于我想按特定域进行过滤,所以我只是将要过滤的域用作要使用的标签。

另外,请注意标签是在服务中设置的 label traefik.tag

于 2017-10-05T01:39:55.457 回答
1

如果您对此 Traefik v2 解决方案感兴趣,您可以使用--providers.docker.constraintsoption 来实现相同的结果。因此,基本示例可能是:

services:
  traefik:
    image: traefik:v2.3
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.constraints=Label(`custom.label`,`custom-value`)"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  custom_service:
    image: ...
    labels:
      - "traefik.enable=true"
      - "custom.label=custom-value"

文档

于 2021-01-25T12:56:21.193 回答