Traefik, un service pour tous les contrôler

Traefik est un outil open-source français, permettant d’avoir un routeur et un load-balancer HTTP, TCP et UDP. En plus, il est capable de gérer les certificats SSL pour les services qu’il expose (via Let’s Encrypt ou votre autorité de certification).

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…

Objectif: Découvrir et avoir une base de connaissance à propos de Traefik.

Environnement : Debian 12, Docker 24.x, docker compose (plugin) 2.24.x, Traefik 3.2.x.

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 mercipour 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. Il y a aussi la définition des points d’entrée TCP et UDP

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 fichier traefik.toml ou traefik.yml) ;
  • avec des paramètres de ligne de commandes (“CLI flags”) ;
  • avec des variables d’environnement (de plus en plus déconseillé, c’est lourd à gérer).

Il n’est possible d’utiliser qu’une seule source de configuration statique à la fois (donc soit le fichier, soit la ligne de commandes ou avec des variables d’environnement).

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 (routeurs, services, middlewares, configuration TLS) dans la configuration statique.

Lorsque vous faites des modifications dans la configuration statique, vous devez redémarrer Traefik.

Qu’est-ce que la configuration dynamique ?#

C’est l’ensemble des options utilisées pour définir les routeurs, 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 ou traefik.yml ;
  • avec des labels (provider Docker, Rancher, etc) ;
  • avec des Ingress ou des CRD propre à Traefik (pour 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).

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 et fichiers nécessaires.

De plus, j’utilise une configuration dynamique pour configurer mes routeurs et services. Après plusieurs essais, je trouve qu’il est plus facile d’utiliser des configurations dynamiques qu’une configuration statique avec labels dans les fichiers 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éons les dossiers et les fichiers de configuration, et attribuons 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
sudo chown -R $USER:$USER /opt/docker/dc

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:munster
    container_name: traefik
    restart: unless-stopped
    ports:
      - 80:80/tcp
      - 8080:8080/tcp # dashboard
      - 443:443/tcp
      - 443:443/udp # http3 - quic
    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 (le fichier de configuration statique). Actuellement, je vous propose un fichier relativement simple, permettant trois points d’entrées (80/TCP, 8080/TCP (pour le tableau de bord) et 443/TCP), des logs, se connecter au socket de docker et accéder au tableau de bord web Traefik :

---
global:
  sendAnonymousUsage: true # facultatif, plus d'information à l'adresse suivante : https://doc.traefik.io/traefik/contributing/data-collection/#the-code-for-data-collection
  checkNewVersion: false # allez voir le dépôt GitHub, pour limiter les requêtes de ce conteneur

api:
  dashboard: true # affichage du tableau de bord

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.

Article anglais disponible ici .

#traefik
Julien HOMMET
6 minutes
1102 mots
tuto