Riverman
Riverman

Reputation: 523

Traefik: Aggregate multiple docker services into a single logical backend

I'm running minio using its official docker-compose file which creates 4 services (containers): minio1,minio2,minio3,minio4. Traefik treats them as 4 unique services, but in reality, they should be treated as a single backend, that is, I want Traefik to generate 1 frontend an 1 backend (with 4 servers) for minio. I tried putting them into a single group(servicefabric.groupname) but to no avail. I have the following labels set for each minio service:

  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*

Is there any way to achieve this?

Upvotes: 1

Views: 2185

Answers (2)

tranchung
tranchung

Reputation: 31

@Riverman

I had the same issue as you and I solved it by playing around as it's not fully documented in Traefik documentation. What you need to do is specify the traefik.backend value for all the services to be the same name and set traefik.frontend.backend to that traefik.backend value. You can't use the service piece for this. Below is an example.

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'

Upvotes: 3

Siyu
Siyu

Reputation: 12089

All minio services have to have the same frontend rule and the same backend name.

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

Also I think you misunderstood the meaning of "backend". A backend is a server to which Traefik route traffic based on the frontend rules. Same as "upstream"/"location" in nginx.


Edit

As stated in the comment, this configuration creates multiple frontends all pointing to the same backend, although functional this looks ugly. A quick solution is to just have one service with ‘frontend’ but if that service goes down, the frontend will be gone too.

A better way to do this is to set it in the config file, traefik.toml:

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

Upvotes: 2

Related Questions