Traefik:将多个 docker 服务聚合到一个逻辑后端

Traefik: Aggregate multiple docker services into a single logical backend

我 运行 minio 使用其官方 docker-compose file 创建 4 个服务(容器):minio1、minio2、minio3、minio4。 Traefik 将它们视为 4 个独特的服务,但实际上,它们应该被视为单个后端,也就是说,我希望 Traefik 为 minio 生成 1 个前端和 1 个后端(有 4 个服务器)。 我尝试将它们放在一个组中(servicefabric.groupname),但无济于事。 我为每个 minio 服务设置了以下标签:

  labels:
    - "traefik.servicefabric.groupname=minio"
    - "traefik.basic.frontend.rule=Host:foo.bar.com"
    - "traefik.weight=10"  # 10,20,30,40 incremented per service
    - "traefik.frontend.rule=Host:traefik"
    - "traefik.port=9000"
  container_name: minio*

有什么办法可以实现吗?

所有 minio 服务必须具有相同的前端规则和相同的后端名称。

  labels:
  - "traefik.frontend.rule=Host:minio.${DOMAIN}"
  - "traefik.backend=minio"
  - "traefik.port=9000"

另外我觉得你误解了"backend"的意思。后端是 Traefik 根据前端规则将流量路由到的服务器。与 nginx 中的 "upstream"/"location" 相同。


编辑

正如评论中所述,此配置创建了多个前端,所有前端都指向同一个后端,尽管功能看起来很丑陋。一个快速的解决方案是只提供一项带有“前端”的服务,但如果该服务出现故障,前端也会消失。

更好的方法是在配置文件中设置它,traefik.toml:

[frontends]
  [frontends.frontend1]
  backend = "minio"
    [frontends.frontend1.minio]
    rule = "Host: minio.${DOMAIN}”

@里弗曼

我和你有同样的问题,我通过尝试解决了它,因为它没有在 Traefik 文档中完整记录。您需要做的是将所有服务的 traefik.backend 值指定为相同的名称,并将 traefik.frontend.backend 设置为该 traefik.backend 值。您不能为此使用服务件。下面是一个例子。

services:
  minio01:
    image: minio/minio
    hostname: minio01
    restart: always
    volumes:
      - minio01-data:/export
    networks:
      - minio
      - traefik
    command: server http://minio01/export http://minio02/export
    labels:
      - 'traefik.enable=true'
      - 'traefik.docker.network=traefik'
      - 'traefik.frontend.rule=Host:minio.local'
      - 'traefik.frontend.backend=minio'
      - 'traefik.port=9000'
      - 'traefik.protocol=http'
      - 'traefik.backend=minio'

  minio02:
    image: minio/minio
    hostname: minio02
    restart: always
    volumes:
      - minio02-data:/export
    networks:
      - minio
      - traefik
    command: server http://minio01/export http://minio02/export
    labels:
      - 'traefik.enable=true'
      - 'traefik.docker.network=traefik'
      - 'traefik.frontend.rule=Host:minio.local'
      - 'traefik.frontend.backend=minio'
      - 'traefik.port=9000'
      - 'traefik.protocol=http'
      - 'traefik.backend=minio'