【问题标题】:Traefik: Aggregate multiple docker services into a single logical backendTraefik:将多个 docker 服务聚合到一个逻辑后端
【发布时间】:2018-12-14 11:30:38
【问题描述】:

我正在使用其官方 docker-compose file 运行 minio,它创建 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*

有什么方法可以实现吗?

【问题讨论】:

    标签: docker docker-compose traefik minio


    【解决方案1】:

    @Riverman

    我遇到了和你一样的问题,我通过玩弄解决了它,因为它在 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'
    

    【讨论】:

      【解决方案2】:

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

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

      另外,我认为您误解了“后端”的含义。后端是 Traefik 根据前端规则将流量路由到的服务器。与 nginx 中的“上游”/“位置”相同。


      编辑

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

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

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

      【讨论】:

      • 谢谢,这正好解决了我 50% 的问题,从一开始就迈出了一大步!现在我有 1 个后端和 4 个服务器,但仍然有 4 个前端指向同一个后端,这仍然很好,但 IMO 毫无意义。如何将所有 minio 前端打包成一个?我知道前端和后端是什么,但根据 Traefik 的术语,后端由一个或多个服务器组成,而我有 4 个后端和一个服务器。我想要 1 个带有 4 个服务器的后端 --> 1 个带有 4 个服务器的 nginx 上游。同样的事情。
      • 感谢您的更新。我按照你的建议做了,但没有改变。我已经尝试了所有可能的(根据我自己的限制)变化,但没有运气。感觉就像我的 [frontends] 块在我的 traefik.toml 文件中被完全忽略了。我已将 Traefik 的记录器设置为调试并将其转储到文件中。这是我在重新创建 Traefik 容器时得到的:pastebin.com/ZhUKMSbx 这是我在 minio 的 docker-compose 文件(标签)中的内容:-“traefik.backend=minio”-“traefik.port=9000”-“traefik .weight=10" - "traefik.enable=true" 有什么想法吗?
      • @Riverman 我个人从未使用过文件配置,但有人说您必须将 [file] 放入才能使其工作。
      • 感谢 Siyu,当我在我的配置中添加一个 [file] 时,Web GUI 开始对我自定义的前端规则表现出兴趣,所以这将是正确的方法。它还不完美,需要更多的修补,但我想我已经接近最终的解决方案了。非常感谢您的帮助!
      猜你喜欢
      • 2019-02-13
      • 1970-01-01
      • 2011-06-21
      • 2020-04-23
      • 1970-01-01
      • 2020-11-09
      • 2010-12-03
      • 2015-07-28
      相关资源
      最近更新 更多