Avec l'apparition de la version 2, la modification des requêtes n'est plus gérée dans la déclaration du frontend mais dans un nouvel élément apparu avec cette version : les middlewares.

L'un des énormes avantages de cette nouvelle conception est la possibilité de ré-utiliser facilement ces déclarations et des les combiner à volonté.

Un peu de théorie ( Non mais vraiment un peu ... ) :

Il est important de comprendre le chemin emprunté par une requête dans Traefik. Et ça tombe bien, la documentation officielle propose un schéma très bien réalisé :

overview traefik requests path

Le chemin est donc le suivant :

-> Requête entrante :
	-> Point d'entrée de mon serveur ( exemple HTTPS sur le port 443 )
	-> Le module routeur qui va diriger votre requête vers le bon service mais au préalable va éventuellement :
		- > Appeler des "middlewares"
	-> La requête est finalement envoyée au service en fonction de conditions ( nom de domaine par exemple ).

Exemple d'utilisation d'une règle simple : le filtrage par IP

Nous allons repartir du dernier article sur Traefik et de son fichier docker-compose.yml :

version: '3'
services:
  reverse-proxy:
    # The official v2.0 Traefik docker image
    image: traefik:latest
    # Enables the web UI and tells Traefik to listen to docker
    command: 
      --api.insecure=true 
      --providers.docker
      --entrypoints.web.address=:80
    ports:
      # The HTTP port
      - "80:80"
      # The Web UI (enabled by --api.insecure=true)
      - "8080:8080"
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock

 whoami:
    # A container that exposes an API to show its IP address
    image: containous/whoami
    labels:
      - "traefik.http.routers.whoami.rule=Host(`whoami1.docker.localhost`)"

Il existe plusieurs solutions pour mettre en place un middleware avec un filtrage par IP.

Labels on service

Dans un premier temps, la solution la plus simple : l'intégration via les labels que nous allons mettre sur notre service whoami.

  whoami:
    # A container that exposes an API to show its IP address
    image: containous/whoami
    labels:
      - "traefik.http.routers.whoami.rule=Host(`whoami1.docker.localhost`)"
      - "traefik.http.middlewares.myAdmin.ipWhiteList.sourceRange=172.17.0.1"
      - "traefik.http.routers.whoami.middlewares=myAdmin@docker"

Vous pouvez constater que j'ai nommé ce middleware "myAdmin" car je vais m'en resservir plus tard.

En vous rendant sur http://whoami1.docker.localhost ( Pensez à ajouter le DNS dans votre fichier hosts ), si vous avez un joli : Forbidden, pensez à indiquer dans sourceRange l'adresse IP de votre connexion.

C'est simple et efficace mais je trouve que cette solution est peu ré-utilisable sur le long terme. Et en cas de nombreux labels, assez peu lisibles.

Labels on Traefik

On peut également associer certains middlewares génériques directement à la déclaration de service de Traefik.

Reprenons l'exemple du dessus et changeons quelques petites choses :

version: '3'
services:
  reverse-proxy:
    # The official v2.0 Traefik docker image
    image: traefik:latest
    # Enables the web UI and tells Traefik to listen to docker
    command: 
      --api.insecure=true 
      --providers.docker
      --entrypoints.web.address=:80
    ports:
      # The HTTP port
      - "80:80"
      # The Web UI (enabled by --api.insecure=true)
      - "8080:8080"
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock
    labels:
      - "traefik.http.middlewares.myAdmin.ipWhiteList.sourceRange=172.17.0.1"

 whoami1:
    # A container that exposes an API to show its IP address
    image: containous/whoami
    labels:
      - "traefik.http.routers.whoami1.rule=Host(`whoami1.docker.localhost`)"
      - "traefik.http.routers.whoami1.middlewares=myAdmin@docker"
      
  whoami2:
    # A container that exposes an API to show its IP address
    image: containous/whoami
    labels:
      - "traefik.http.routers.whoami2.rule=Host(`whoami2.docker.localhost`)"
      - "traefik.http.routers.whoami2.middlewares=myAdmin@docker"

Je n'ai finalement pas changé grand chose au précédent fichier. J'ai uniquement ajouté la déclaration labels sur le service Traefik afin de pouvoir lire et remployer plus facilement mon middleware.

On peut constater qu'avec cette déclaration, je peux facilement relire ma configuration et utiliser le middleware sur 2 services whoami différents.


Il existe une troisième solution que je préconise mais je ne souhaite pas rallonger cet article d'avantage. Dans le prochain article j'expliquerai un peu plus en détail les deux types de configuration de Traefik :

  • La configuration statique ( pas si statique que ça, vous verrez )
  • La configuration dynamique.

Nous pourrons alors revoir notre middleware et lui ajouter quelques règles ( par exemple accès sur whitelist uniquement sur certaines requêtes ) tout en gardant une configuration simple, lisible et ré-utilisable.

Vous pouvez également retrouver plus d'articles sur Traefik.