DEV Community

David YOTEAU
David YOTEAU

Posted on

Traefik 2 : Concept (VF)

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.
Dashboard Traefik V2

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)