RousselTMLEARNING

Proxy & réseau

Traefik : vue d'ensemble, architecture et premier déploiement

Découvrir Traefik : reverse proxy et load balancer cloud-native, entrypoints, routers, services, middlewares, providers, configuration statique et dynamique, Docker Compose et dashboard.

1. Qu'est-ce que Traefik ? #

Un edge router dynamique.

Principe #

Traefik est un reverse proxy et load balancer HTTP/TCP conçu pour les environnements dynamiques (Docker, Kubernetes, Swarm, Consul). Sa particularité : il découvre automatiquement les services via des providers et se reconfigure à chaud, sans rechargement, à partir des labels des conteneurs ou des CRD Kubernetes. Il gère aussi les certificats Let's Encrypt automatiquement.

Chemin d'une requête dans Traefik
Chaque concept correspond à un bloc de configuration.
ConceptRôle
EntrypointPort d'écoute (web :80, websecure :443)
RouterAssocie une requête à un service selon des règles (Host, Path, Headers)
MiddlewareModifie la requête (auth, redirection, compression, rate limit)
ServiceDéfinit comment répartir vers les serveurs (load balancing)
ProviderSource de configuration dynamique (Docker, Kubernetes, fichiers)

2. Configuration statique et dynamique #

Deux niveaux.

Les fichiers #

# traefik.yml : configuration STATIQUE (démarrage)
api: { dashboard: true }
entryPoints:
  web:       { address: ":80", http: { redirections: { entryPoint: { to: websecure, scheme: https } } } }
  websecure: { address: ":443" }
providers:
  docker: { exposedByDefault: false }
  file:   { directory: /etc/traefik/dynamic, watch: true }
certificatesResolvers:
  letsencrypt:
    acme:
      email: admin@exemple.fr
      storage: /letsencrypt/acme.json
      httpChallenge: { entryPoint: web }
log: { level: INFO }
accessLog: {}
# dynamic/middlewares.yml : configuration DYNAMIQUE (rechargée à chaud)
http:
  middlewares:
    securite:
      headers: { stsSeconds: 31536000, contentTypeNosniff: true, frameDeny: true }
    limite:
      rateLimit: { average: 100, burst: 50 }

3. Premier déploiement avec Docker Compose #

Traefik et une application.

compose.yaml #

services:
  traefik:
    image: traefik:v3.1
    command: ["--configFile=/etc/traefik/traefik.yml"]
    ports: ["80:80", "443:443"]
    volumes:
      - ./traefik.yml:/etc/traefik/traefik.yml:ro
      - ./dynamic:/etc/traefik/dynamic:ro
      - ./letsencrypt:/letsencrypt
      - /var/run/docker.sock:/var/run/docker.sock:ro
    labels:
      - traefik.enable=true
      - traefik.http.routers.dash.rule=Host(`traefik.exemple.fr`)
      - traefik.http.routers.dash.service=api@internal
      - traefik.http.routers.dash.entrypoints=websecure
      - traefik.http.routers.dash.tls.certresolver=letsencrypt
      - traefik.http.routers.dash.middlewares=auth

  whoami:
    image: traefik/whoami
    labels:
      - traefik.enable=true
      - traefik.http.routers.whoami.rule=Host(`app.exemple.fr`)
      - traefik.http.routers.whoami.entrypoints=websecure
      - traefik.http.routers.whoami.tls.certresolver=letsencrypt
      - traefik.http.routers.whoami.middlewares=securite@file,limite@file
      - traefik.http.services.whoami.loadbalancer.server.port=80
Erreur Courante : Monter docker.sock donne à Traefik un accès quasi-root à l'hôte. Utilisez un proxy de socket en lecture seule (tecnativa/docker-socket-proxy) et protégez le dashboard par authentification.

Tester #

docker compose up -d
curl -H 'Host: app.exemple.fr' http://localhost/ -L -k           # redirection puis réponse de whoami
docker compose logs traefik | grep -i -E "error|certificate"
curl -s http://localhost:8080/api/http/routers | jq '.[].name'   # API (si l'entrypoint traefik est exposé)
traefik version
Bonne Pratique : Activez les métriques Prometheus (metrics.prometheus) et l'access log JSON dès le départ : ce sont vos meilleurs outils de diagnostic.

Pour aller plus loin