Introduction
Dans cet article, je vous propose un tour d’horizon sur Traefik. L’outil est écrit en Golang par Emile Vauge et c’est français cocorico 🐓. Traefik est un “modern reverse proxy”, un reverse proxy designé pour répondre aux besoins du cloud.
Traefik permet donc de faire de la “configuration discovery” via plusieurs fournisseurs de services et load balancer pour HTTP et TCP. Il offre également d’autres fonctionnalités comme le support de Let’s Encrypt, des middlewares et la possibilité de monitorer facilement des services.
Un reverse-proxy ?
Un reverse-proxy est une brique de notre infrastructure, qui permet d’être un intermédiaire de communication, entre un réseau public et un réseau privé, le nôtre par exemple. C’est sur ce réseau privé que l’on trouvera toutes les applications de notre SI qui ne sont pas accessibles depuis l’extérieur pour des raisons de sécurité principalement.
Le reverse-proxy doit donc connaître toutes les “routes” disponibles pour transférer chaque requête vers le bon service. Comme il est le point central du trafic, il peut également faire du load balancing, ou encore appliquer des règles de sécurité comme le HTTPS par exemple.
Les outils les plus connus dans le domaine sont : Nginx, HAproxy et Apache. Mais il en existe pleins d’autres sur le marché.
Pourquoi utiliser Traefik ?
Depuis plusieurs années, les architectures en microservices se sont démocratisées tout comme les outils d’orchestration comme kubernetes. Dans ce type d’organisation, des services sont lancés et stoppés à la volée.
Il devient donc difficile de mettre à jour manuellement la configuration du reverse-proxy pour changer les routes et transférer correctement les requêtes reçues.
C’est dans ce cas de figure que Traefik démontre son savoir-faire, même s’il est possible de l’utiliser dans des cas plus traditionnels.
Grâce au “service discovery”, Traefik détecte automatiquement un nouveau service ainsi que sa configuration associée (nom de domaine, path d’url, gestion du SSL etc). Il est donc plus facile pour chaque application d’ajuster sa façon d’être accessible via le reverse-proxy.
Il est vrai que Nginx et d’autres outils proposent des fonctionnalités similaires en ajoutant une surcouche à l’existant mais ils n’ont pas été conçu pour faire du rechargement dynamique de leurs configurations.
Comprendre son fonctionnement
Pour commencer, un utilisateur va envoyer une requête HTTP à Traefik. Cette requête contient toutes les informations nécessaires pour indiquer à Traefik sa destination. En général, on utilise le nom de domaine et le chemin de la requête pour déterminer sa destination.
Traefik analyse la requête et cherche dans sa liste de “routes” si l‘une d’elles peut correspondre.
Si c’est le cas il va transférer la requête vers son “service” associé. Dans le cas contraire il va retourner à l’utilisateur une “erreur 404”.
Configuration statiques
Pour démarrer, Traefik a besoin d’une configuration dite ”statique”. Celle-ci peut être définie via fichier, arguments de ligne de commande ou variables d’environnement. Cependant, il est à noter qu’il n’est pas possible de mixer les différentes méthodes et que la configuration sera seulement chargée à chaque démarrage.
C’est dans la configuration “statique” que l’on va indiquer à Traefik quels sont les ports à écouter (généralement les ports 80 et 443). On va également leur attribuer un nom et d’autres options au niveau des timeouts et phases d’arrêt par exemple.
https://blog.ouidou.fr/media/4b5b80ca721dd945e302cb2335d318f4(Exemple pour les ports 80 et 443)
Une fois nos “entrypoints” configurés, nous pouvons passer aux “providers”. Cette étape est cruciale, la configuration des “providers” va permettre à Traefik de savoir quels providers sont à observer et comment il doit le faire (authentification / paramètres).
Plusieurs fournisseurs sont déjà supporté par Traefik, comme :
- Docker & Docker Swarm
- Kubernetes
- Marathon
- Rancher
- Consul
- Etcd
- Fichiers
- Et pleins d’autres à retrouver ici
https://blog.ouidou.fr/media/5596ae5ef8c16afc98e4d4a9169790a9(Exemple pour Docker)
Une fois cette partie configurée, votre Traefik dispose de la configuration minimale pour fonctionner.
Mais bien d’autres paramètres sont disponibles. On va commencer par le “Dashboard”.
Le “Dashboard” vous permet de visualiser l’état de Traefik en temps réel :
- Les routes disponibles (statut / middlewares / TLS etc)
- Le services disponibles (statut / provider / URLs des serveurs)
- Les providers observés
Pour les plus barbus d’entre vous, il est possible d’accéder aux mêmes informations via une API (pour plus d’informations : https://docs.traefik.io/v2.2/operations/api/#api).
https://blog.ouidou.fr/media/71000081cee4537956ab1d05a99ace85( Exemple activation du Dashboard et de l’API)
Un autre point important pour la sécurité, c’est la gestion des certificats SSL. Traefik supporte nativement Let’s Encryt et il offre la possibilité de faire l’ACME Challenge par TLS Challenge, HTTP Challenge ou DNS Challenge. A savoir, que pour le DNS Challenge il faut que votre fournisseur de DNS fassent partie de cette liste (https://docs.traefik.io/v2.2/https/acme/#providers).
Il est possible d’utiliser plusieurs méthodes de ACME ainsi que plusieurs fournisseurs DNS en parallèle sur un Traefik car il faudra indiquer pour chaque route quel “certificatesResolvers” utiliser.
https://blog.ouidou.fr/media/7631cc9e205bc3c0df4b605f42e00b7f(Exemple d’activation du ACME HTTP Challenge)
Pour en finir avec la configuration statique, Traefik offre une intégration simplifiée aux différents outils de Monitoring / Tracing / Logging comme Prometheus et Jaeger pour ne citer qu’eux. Pour les activer, vous n’avez qu’à rajouter 2–3 lignes de configuration en fonction de vos besoins.
https://blog.ouidou.fr/media/d90f1754532080a2c18ec91cb30d2835(Exemple pour activer Prometheus)
Configuration dynamiques
Dans cette partie nous allons aborder la notion de configuration dynamique. Cette configuration sera portée au niveau de vos différents “providers”. Pour docker par exemple ce sont les labels du container qui sont utilisés.
Il y a trois termes importants à connaître :
- Le Router permet de faire le lien entre la requête entrante et un service. Mais il peut aussi faire appel à des Middlewares pour agir sur la requête
- Le Middleware est associé à un router et il permet de faire des modifications / contrôles sur la requête avant qu’elle soit envoyé au service ou au client
- Le Service est responsable d’indiquer à Traefik la destination finale de la requête (adresse IP, schéma HTTP, port, load balancing etc)
Il est à noter qu’il est possible de configurer plusieurs routers pour un ou plusieurs services. Par exemple si votre container Docker expose plusieurs ports, il est possible de définir autant de services & routers que de ports ouverts.
Exemple
Nous allons clôturer cette article par un cas d’utilisation de Traefik en locale.
Pour commencer nous allons procéder à la configuration de notre instance Traefik (v2.2)..
Cette démonstration utilise Docker et Docker-compose donc assurez-vous qu’ils sont installés sur votre machine.
Installation
Pour commencer créer un dossier “traefik”, c’est dans ce dossier que nous allons stocker le docker-compose et le fichier de configuration.
Dans ce dossier ajouter le docker-compose.yml ainsi que le fichier de configuration traefik.toml.
Ensuite vous pouvez démarrer le projet :
$ docker-compose up -d
Et normalement vous devriez pouvoir accéder au dashboard de Traefik (seulement si localhost renvoie bien sur 127.0.0.1).
Votre Traefik est prêt, je vous invite à vous rendre sur la documentation pour en savoir plus sur les possibilités de configuration.
Test avec whoiam
Pour finir, on va utiliser un container whoiam (https://hub.docker.com/r/containous/whoami) pour tester le comportement d’un container placé derrière votre reverse-proxy.
Dans un nouveau dossier ajouter le fichier docker-compose.yml suivant :
Puis lancer le container avec la commande suivante :
$ docker-compose up -d
Normalement, vous pouvez accéder à votre container en passant par Traefik grâce à cette commande “curl -H “Host: web.sample.local” ou en ajoutant dans votre /etc/hosts => “127.0.0.1 web.sample.local”.
Pour aller plus loin, j’ai créé un dépôt git avec d’autres exemples disponible ici https://github.com/ouidou/traefik-example, où je vous montre comment gérer plusieurs routers pour un container, comment activer le TLS et comment faire des redirections de HTTP vers HTTPS.
J’espère que cet article vous aura plu et qu’il vous donnera l’envie de tester Traefik.
N’hésitez pas à me faire part de vos commentaires ou questions en bas de cet article, je tâcherai d’y répondre.