Traefik est un outil open-source pour mettre en place un edge routeur et load-balancer HTTP, TCP et UDP. La gestion des certificats SSL est aussi de la partie, que ce soit via Let's Encrypt ou votre autorité de certification personnelle.

An open-source reverse proxy and load balancer for HTTP and TCP-based  applications that is easy, dynamic, automatic, fast, full-featured, production proven, provides metrics, and integrates with every major cluster technology...

Version Date Commentaires
1 01/2020 Création de l'article
1.1 02/2020 Correction des informations
1.2 05/2022 Reformatage de l'article, corrections syntaxiques
1.3 08/2022 Ajout de la rubrique "Pourquoi Træfik"

Objectif : Découvrir Træfik

Environnement : Debian 11.4 (bullseye), Docker 20.10.x, docker-compose 2.6.x, Traefik 2.8

Pourquoi Træfik ?

Dans vos infrastructures, vous avez parfois la nécessité de permettre à vos utilisateurs d'accéder à des services divers et variés. Avec les besoins grandissant en disponibilité, vous serez amené à avoir plusieurs serveurs côte-à-côte, fonctionnant en même temps et devant être accessibles sans action de la part de l'utilisateur. Pour ce faire, un serveur de type "proxy inverse" doit être mis devant ces serveurs d'applications. Ce proxy inverse sera le seul point d'entrée pour vos utilisateurs.

Un proxy inverse permet plusieurs choses :

  • répartir la charge entre les machines selon l'action souhaitée ;
  • effectuer un filtrage en entrée ;
  • gérer une authentification en entrée, ou transférer la demande (valide) d'authentification vers un autre service ;
  • garder des pages en mémoire pour les redistribuer plus rapidement à la demande.

En plus des fonctionnalités de proxy inverse, Træfik est aussi un routeur efficace, vous facilitant la configuration grâce à son module de découverte automatique.

Quelques éléments de compréhension

/// Reprise des informations fournies par ldez, mainteneur de Træfik - un grand merci pour toutes les corrections apportées et les informations complémentaires !!

Qu'est-ce que la configuration statique ?

C'est l'ensemble des options utilisées au démarrage de Træfik, ces options concernent principalement les informations de connexions vers les providers (fournisseurs), les systèmes de tracking et outils de métriques.

Ces options peuvent être définies de 3 façons différentes :

  • avec un fichier de configuration principal au format TOML ou YAML (c'est le traefik.toml ou traefik.yml) ;
  • avec des paramètres de ligne de commandes (CLI flags) ;
  • avec des variables d'environnement (déconseillé).

Il n'est possible d'utiliser qu'une seule source à la fois (donc soit le fichier, soit la ligne de commandes).

La configuration statique, Quelle que soit sa source (TOML/YAML, CLI flags, ou variables d'environnement) n'est lu qu'une seule et unique fois lors du démarrage de Træfik. Il n'est pas possible de définir le routage (routers, services, middlewares, configuration TLS) dans la configuration statique.

Qu'est-ce que la configuration dynamique ?

C'est l'ensemble des options utilisées pour définir le routage. Cela permet de définir les routers, les services, les middlewares et la configuration TLS.

Cette configuration peut être définie de différentes façons :

  • avec un ou des fichiers (provider file) au format TOML ou YAML, sans lien avec le contenu du fichier traefik.toml / traefik.yml ;
  • avec des labels (provider Docker, Rancher, etc) ;
  • avec des Ingress ou des CRD propre à Træfik (Kubernetes) ;
  • via des données stockées dans un KV store (disponible à partir de la version v2.2).

Toutes ces sources de configuration dynamique peuvent être utilisées en même temps. La configuration dynamique peut être modifiée pendant l’exécution de Træfik sans avoir besoin de redémarrer (grâce à la ligne "watch = true").

Dans le cas de tous les providers (sauf le provider file), cette configuration est automatiquement reconstruite et mise à jour (sans rechargement) dès qu'un changement est détecté (ajout/suppression/modification d'un conteneur ou d'un fichier de configuration).

traefik architecture
Résumé de l'architecture de Traefik

Fichier docker-compose.yml pour Træfik

L'idée ici est d'avoir un conteneur ingurgitant les requêtes et les rediriger en fonction de la demande. Pour ce faire, depuis une Debian 11 avec docker 20.10.14 et docker compose v2.4.1. Je vais utiliser le dossier /opt/docker et y créer les dossiers/fichiers nécessaires.

De plus, j'utilise une configuration dynamique pour configurer mes routeurs et services - après plusieurs essais, je trouve plus facile l'utilisation des configurations dynamiques (qui permettent de ne pas avoir à redémarrer les conteneurs !)

Étapes préliminaires

Création des dossiers et des fichiers de configuration et y attribuer les droits nécessaires.

sudo mkdir -p /opt/docker/traefik/conf/traefikdynamic /opt/docker/traefik/logs

sudo touch /opt/docker/traefik/conf/acme.json /opt/docker/traefik/conf/traefik.yml /opt/docker/traefik/logs/traefik.log

sudo chmod 0600 /opt/docker/traefik/conf/acme.json

Ci-dessous une configuration pour Traefik v2, avec son fichier de configuration traefik.yml (en lecture seule) et son fichier acme.json pour y stocker les certificats Let's Encrypt (en lecture/écriture). J'ai préalablement créé un nouveau réseau docker intitulé "oueb", via la commande docker network create oueb.

---
services:
  traefik:
    image: traefik:v2.6
    restart: unless-stopped
    ports:
      - target : 80
        published : 80
        protocol: tcp
        mode : host
        ### DEBUT tableau de bord, à enlever en prod !
      - target : 8080
        published : 8080
        protocol: tcp
        mode : host
        ### FIN tableau de bord
      - target : 443
        published : 443
        protocol: tcp
        mode : host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./conf/traefikdynamic:/dynamic
      - ./conf/traefik.yml:/etc/traefik/traefik.yml:ro
      - ./conf/acme.json:/etc/traefik/acme.json
      - ./logs/traefik.log:/etc/traefik/applog.log
    environment:
      TZ: Europe/Paris
    networks:
      - oueb

networks:
# docker network create oueb
  oueb:
    driver: bridge
traefik docker-compose.yml

Le fichier traefik.yml correspond aux options de démarrage pour Traefik. Actuellement, je vous propose un fichier relativement simple, permettant 2 points d'entrées (80/TCP & 443/TCP), des logs, se connecter au socket de docker et accéder au tableau de bord web Traefik :

---
global:
  sendAnonymousUsage: false
  checkNewVersion: false

api:
  dashboard: true

pilot:
  dashboard: false

log:
  filePath: "/etc/traefik/applog.log"
  format: json
  level: "ERROR"

providers:
  docker:
    endpoint: unix:///var/run/docker.sock
    exposedByDefault: false
    watch: true
    swarmMode: false
  file:
    directory: "/dynamic"
    watch: true

api:
  dashboard: true
  debug: false

entryPoints:
  insecure:
    address: ":80"
  secure:
    address: ":443" 
traefik.yml

À partir de cet instant, un docker compose up -d permettra de récupérer la dernière image disponible si vous ne l'avez pas déjà et Traefik va démarrer...

Partager l'article