Traefik 2 : Concept
Description
Traefik est un reverse proxy qui fait aussi load balancer. La version 1 était très facile à mettre en place sur un docker swarm.
Le besoin
De manière générale, nous avons besoin de déployer des conteneurs et qu'ils soient accessible par un nom de domaine par exemple.
Si on décompose ce besoin, nous avons donc :
- un service qui écoute sur cette ip et sur un ou plusieurs ports
- un service qui certifie les transactions
- un service de gestion des certificats
- un service de redirection des requêtes (HTTP ou TCP) vers le bon conteneur.
Pour tout ça, on a Traefik v2
Les éléments de Traefik v2
Les configurations
Traefik gère deux type de configurations : Dynamique ou Statique.
Pour la partie statique, je fais le choix d'un fichier traefik.yaml
.
La partie dynamique est géré par des labels positionnés au niveau des conteneurs.
Les providers
Traefik a besoin de connaitre qui lui fournira sa configuration dynamique appelé providers
Dans mon cas, il s'agit d'un docker en mode swarm. J'ajoutes donc ceci au traefik.yaml
providers:
docker:
watch: true
swarmMode: true
endpoint: "/unix:///var/run/docker.sock"
Les entryPoints
Les entryPoints sont les couples ip:port sur lesquels Traefik va se mettre en écoute. C'est une configuration statique.
entryPoints:
ssh:
address: ":22"
http:
address: ":80"
https:
address: ":443"
Attention : Traefik fonctionne en convention over configuration. Si vous ne precisez pas d'entryPoints pour vos routeurs, il prendra le premier de la liste par défaut.
Pour ma part, je les ai mis par ordre de numéro de port pour le lire plus facilement.
Les routeurs
Les routeurs peuvent être statique mais sont géré en dynamique dans mon cas.
Un routeur a besoin d'un ou plusieurs entryPoints et de règle pour determiner quel routeur Traefik doit suivre.
Prenons l'exemple d'exposition du dashboard treafik pour la suite de l'article.
Nous allons écouter les requêtes sur le port 80 qui auront dans le header : host("traefik.example.tld")
Il faut donc ajouter les labels suivant à notre conteneur traefik :
- "traefik.http.routeurs.traefik-routeur0.entryPoints=http"
- "traefik.http.routeurs.traefik-routeur0.rule=Host(`traefik.example.tld`)"
Les services
Le service se configure facilement puisqu'il s'agit du conteneur qui porte les labels.
Traefik va déduire beaucoup de chose à partir de ça.
Maintenant, je vais vous montrer comment spécifier le réseau sur lequel Traefik doit chercher l'ip du conteneur et comment lui préciser le port.
Par défaut, j'ajoutes toujours les conteneurs, qui doivent être exposé via Traefik, au réseau traefik-net
. C'est une habitude aquise en V1.
Dans les labels du conteneur, je vais donc lui préciser de prendre l'ip qui concerne ce réseau
- "traefik.docker.network=traefik-net"
Ensuite je vais lui préciser le port pour le service du dashboard. Mais voilà, Traefik 2 ne permet pas de le faire sans activation au niveau du provider docker.
Dans le fichier traefik.yaml
, je modifie le bloc providers
comme suit :
providers:
docker:
watch: true
swarmMode: true
useBindPortIp: true
endpoint: "/unix:///var/run/docker.sock"
Ce qui permet d'ajouter le label suivant
- "traefik.http.services.traefik-service.loadbalancer.server.port=8080"
Bien sûr, il faut aussi demandé à Traefik d'exposer son dashboard, ce qui se fait dans le traefik.yaml
api:
dashboard: true
A partir de là, en lançant le service traefik, on pourrait déjà accéder à notre dashboard. Mais tout est public.
Heureusement, Traefik fournit un moyen d'ajouter des traitements intermédiaire via les middlewares.
Les middlewares
Il en existe de toute sorte mais dans un premier temps, je vais vous montrer comment ajouter un basic auth. Puis ajouter le middleware à un routeur.
La configuration d'un middleware peut se faire en statique ou en dynamique. J'ai longuement réfléchis sur l'endroit ou configurer ce middleware.
Puis j'ai finis par me dire que tous les éléments Traefik doivent être configurer en dynamique.
Du coup, j'ai ajouter ce label à mon conteneur Traefik
- "traefik.http.middlewares.auth.basicauth.users=titi:$$2y..."
Et pour l'ajouter à mon routeur
- "traefik.http.routeurs.traefik-routeur0.middlewares=auth"
Conclusion
Voilà pour le premier démarrage de mon Traefik v2 sur mon Swarm avec un configuration basique.
Dans l'article suivant, je détaillerais mes fichiers traefik.yaml
et stack-traefik.yml
pour la redirection https ainsi que la gestion de certificat.
En attendant, je vous pose le contenu des deux fichiers en dessous.
traefik.yaml
api:
dashboard: true
entryPoints:
ssh:
address: ":22"
http:
address: ":80"
https:
address: ":443"
providers:
docker:
watch: true
swarmMode: true
useBindPortIP: true
endpoint: "unix:///var/run/docker.sock"
stack-traefik.yml
version: "3.3"
networks:
traefik-net:
external: true
configs:
traefik.yaml:
file: ./traefik.yaml
services:
traefik:
image: traefik:v2.0
ports:
- 80:80
- 443:443
- 22:22
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
configs:
- source: traefik.yaml
target: /etc/traefik/traefik.yaml
networks:
- traefik-net
deploy:
mode: global
placement:
constraints: [node.role == manager]
labels:
- "traefik.docker.network=traefik-net"
- "traefik.http.routers.traefik-router0.entrypoints=http"
- "traefik.http.routers.traefik-router0.rule=Host(`traefik.kharats.fr`)"
- "traefik.http.routers.traefik-router0.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=titi:$$toto..."
- "traefik.http.services.traefik-service.loadbalancer.server.port=8080"
Top comments (0)