Traefik est un outil open-source, français, permettant d'avoir un edge routeur et un 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 Traefik"
1.4 05/2023 Mise à jour des versions, de la syntaxe et ajout du contexte d'exécution
1.5 07/2023 Suppression du port 8080, suppression des doublons, suppression du réseau docker

Objectif : Découvrir l'outil Traefik

Environnement : Debian 12, Docker 24.x, docker compose (plugin) 2.20.x, Traefik 2.10.

Contexte d'exécution :

jho@vmi866042:/opt/docker/dc$ tree
.
├── conf
│   ├── acme.json
│   ├── traefik.yml
│   ├── traefikdynamic
│   │   ├── dynamic.yml
├── docker-compose.yml
└── logs
    ├── traefikAccess.log
    ├── traefik.log
Résultat de la commande "tree" dans le dossier /opt/docker/dc
  • dossier où se trouvent tous les fichiers et dossiers pour cet exemple : /opt/docker/dc
  • emplacement du fichier de configuration principal de Traefik : /opt/docker/dc/conf/traefik.yml
  • dossier où se trouvent les configurations de Traefik (fichiers dynamiques) : /opt/docker/dc/conf/traefikdynamic
  • emplacement du fichier comportant tous les certificats générés par let's encrypt (ou autre) : /opt/docker/dc/conf/acme.json
  • dossier où se trouvent les journaux d'événements (logs) : /opt/docker/dc/logs/

Pourquoi utiliser Traefik ?

Dans vos infrastructures, vous avez parfois la nécessité de permettre à vos utilisateurs d'accéder à divers services. Avec les besoins grandissant en disponibilité, vous serez amené à avoir plusieurs serveurs 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, Traefik 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 Traefik. 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 Traefik. 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 fois lors du démarrage de Traefik. 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 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 à Traefik (Kubernetes) ;
  • via des données stockées dans un KV store

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 Traefik 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 Traefik

L'idée est d'avoir un conteneur capable de rediriger les requêtes en fonction de la demande. Pour ce faire, je vais utiliser le dossier /opt/docker/dc 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 qu'une configuration statique avec labels dans le docker-compose.yml. Avec de genre de configuration, plus besoin de redémarrer Traefik et les autres conteneurs pour prendre en compte les modifications.

Étapes préliminaires

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

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

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

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

Ci-dessous un exemple de fichier docker-compose.yml pour Traefik, avec son fichier de configuration traefik.yml (en lecture seule) et le fichier acme.json pour y stocker les certificats Let's Encrypt (en lecture/écriture).

---
services:
  traefik:
    image: traefik:saintmarcelin
    container_name: traefik
    restart: unless-stopped
    ports:
      - target : 80
        published : 80
        protocol: tcp
        mode : host
      ### BEGIN dashboad
      - target : 8080
        published : 8080
        protocol: tcp
        mode : host
      ### END dashboard
      - 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
docker-compose.yml

Le fichier traefik.yml correspond aux options de démarrage pour Traefik (fichier de configuration statique). 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

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

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
  websecure:
    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. Avec la configuration présente dans cette documentation, en saisissant l'URL de votre hôte docker et le port « 8080 » dans un navigateur web, vous accéderez à l'interface web de Traefik.

Maintenant, vous allez devoir configurer la définition des services et des middlewares, pour exploiter pleinement Traefik.

English article here.

Partager l'article