Traefik 2 : Concept (VF)
Tags: docker, traefik, tutorial
Published: 2019-09-10 19:58:40

---
title: Traefik 2 : Concept (VF)
published: true
description: Première description des éléments Traefik V2
tags: docker, traefik, tutorial
---

# 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`

```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.

```yaml
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 :

```yaml
- "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 
```yaml
- "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 :
```yaml
providers:
  docker:
    watch: true
    swarmMode: true
    useBindPortIp: true
    endpoint: "/unix:///var/run/docker.sock"
```

Ce qui permet d'ajouter le label suivant 
```yaml
- "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`
```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 
```yaml
- "traefik.http.middlewares.auth.basicauth.users=titi:$$2y..."
```

Et pour l'ajouter à mon routeur
```yaml
- "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](https://thepracticaldev.s3.amazonaws.com/i/z2f1brpoxxazgayh8rem.png)

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
```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
 ```yaml
 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"
```