Cet ajout n'était pas listé dans le tiercé gagnant des ajouts de cette version et pourtant il a attiré mon attention.
J'ai découvert cet ajout pendant ma lecture du changelog
que vous pouvez d'ailleurs trouver ici :
- https://github.com/containous/traefik/blob/master/CHANGELOG.md
Et donc vers la fin de ce fichier on trouve ceci :
- [provider] Add HTTP Provider

Alors pourquoi cette nouveauté est pour moi intéressante ?
Un provider HTTP(s), c'est quoi ?
Tout d'abord regardons de quoi on parle ! Je me rends donc sur la documentation officielle de la 2.3 afin de regarder un peu tout ça :

Ah oui, en passant, l'équipe derrière le projet réalise tout de même un boulot formidable que je tiens à souligner. ( non non, je ne reçois rien du tout pour écrire ça 😂 ) La version est en RC et la documentation sont déjà là ...
Alors, voici les éléments disponibles sur le provider HTTP dans la documentation :
Provide your dynamic configuration via an HTTP(s) endpoint and let Traefik do the rest!
Ok mais encore :
The HTTP provider uses the same configuration as the File Provider in YAML or JSON format.
Donc si on résume, Traefik est maintenant capable de lire sa configuration dynamique depuis un fichier JSON ou YAML disponible en ligne.
Ce fichier devra suivre les mêmes règles que le fichier plat traditionnel.
Ok essayons un peu ça afin d'en savoir un peu plus !
Action
Pour cet essai je vais lancer une instance de Traefik et une instance whoami
avec le fichier docker-compose.yaml
suivant :
version: "3.8"
services:
traefik:
image: traefik:2.3
command:
--entrypoints.web.address=:80
--providers.file.filename=/etc/traefik/dynamic_conf.yaml
ports:
- "80:80"
volumes:
- ./dynamic_conf.yaml:/etc/traefik/dynamic_conf.yaml
whoami:
image: containous/whoami
Cette instance va donc :
image: traefik:2.3
: Utiliser l'image de la dernière version en RC,--entrypoints.web.address=:80
: écouter sur le port 80--providers.file.filename=/etc/traefik/dynamic_conf.yaml
: Utiliser un fichier "plat" de configuration../dynamic_conf.yaml:/etc/traefik/dynamic_conf.yaml
: Je vais mount mon fichier de configuration dans le container.
Pour l'instance whoami
, pas grand chose à dire. Elle va se lancer et écouter sur le port 80 du container.
Enfin voici mon fichier de configuration dynamique :
http:
routers:
whoami:
entryPoints:
- web
service: whoami
rule: 'Host(`whoami.mydomain.local`)'
services:
whoami:
loadBalancer:
servers:
- url: http://whoami
On lance cette installantion :
$ docker-compose up -d
Creating network "traefik_default" with the default driver
Creating traefik_whoami_1 ... done
Creating traefik_traefik_1 ... done
Et enfin je valide le bon fonctionnement du reverse-proxy :
$ curl -H 'Host: whoami.mydomain.local' http://127.0.0.1
Hostname: 25f120624303
IP: 127.0.0.1
IP: 192.168.96.3
RemoteAddr: 192.168.96.2:59942
GET / HTTP/1.1
Host: whoami.mydomain.local
User-Agent: curl/7.68.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 192.168.96.1
X-Forwarded-Host: whoami.mydomain.local
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 8854a8374e0c
X-Real-Ip: 192.168.96.1
Tout est correct! Nous avons une configuration avec un fichier plat fonctionnelle.
Modifions maintenant notre configuration de Traefik afin d'utiliser le provider HTTP !
HTTP Provider
Je vais donc utiliser la nouvelle directive :
version: "3.8"
services:
traefik:
image: traefik:2.3
command:
--entrypoints.web.address=:80
--providers.http.endpoint=http://httpd/dynamic_conf.yaml
ports:
- "80:80"
whoami:
image: containous/whoami
providers.http.endpoint=http://httpd/config.yaml
: La directive me permet de récupérer ma configurationYAML
sur un serveurHTTP
se nommanthttpd
( J'ai de l'imagination ... )
Ajoutons ce serveur à notre fichier :
httpd:
image: httpd:2.4
volumes:
- ./dynamic_conf:/usr/local/apache2/htdocs/dynamic_conf
Une nouvelle fois on relance nos containers :
$ docker-compose up -d
Creating network "traefik_default" with the default driver
Creating traefik_whoami_1 ...
Creating traefik_traefik_1 ...
Creating traefik_httpd_1 ...
Creating traefik_whoami_1 ... done
Creating traefik_traefik_1 ... done
Creating traefik_httpd_1 ... done
et on valide :
$ curl -H 'Host: whoami.mydomain.local' http://127.0.0.1
Hostname: ec9c799c85e0
IP: 127.0.0.1
IP: 192.168.112.2
RemoteAddr: 192.168.112.4:48454
GET / HTTP/1.1
Host: whoami.mydomain.local
User-Agent: curl/7.68.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 192.168.112.1
X-Forwarded-Host: whoami.mydomain.local
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 6c6f21bb9e2f
X-Real-Ip: 192.168.112.1
Nous pouvons maintenant valider le même fonctionnement mais au format JSON
. Il suffit de modifier ma configuration dynamique afin de l'écrire sous ce format, je vais nommer mon fichier dynamic_conf.json
:
"http": {
"routers": {
"whoami": {
"entryPoints": [
"web"
],
"service": "whoami",
"rule": "Host(`whoami.mydomain.local`)"
}
},
"services": {
"whoami": {
"loadbalancer": {
"servers": [
{
"url": "http://whoami"
}
]
}
}
}
}
Enfin je vais modifier mes services :
version: "3.8"
services:
traefik:
image: traefik:2.3
command:
--entrypoints.web.address=:80
--providers.http.endpoint=http://httpd/dynamic_conf.json
ports:
- "80:80"
whoami:
image: containous/whoami
httpd:
image: httpd:2.4
volumes:
- ./dynamic_conf.json:/usr/local/apache2/htdocs/dynamic_conf.json
Vous pouvez valider le bon fonctionnement une dernière fois !
Bon tout ça, c'est bien mais en quoi est-ce intéressant ?
Et bien du HTTP
qui renvoie du JSON
ça ne vous fait pas penser à une API ?
Plutôt que de générer notre fichier manuellement, ne serait-il pas possible de l'alimenter de façon dynamique au travers d'une API ?
En implémentant une méthode GET
afin que Traefik puisse récupérer l'intégralité de sa configuration et enfin une ( surtout des ) méthode(s) POST
afin d'alimenter votre configuration de façon dynamique.
Par exemple en Python :

J'ai d'ailleurs commencé à travailler sur cette implémentation en Python. J'espère avoir le temps de travailler dessus et de vous fournir un petit POC sur github prochainement même si je pense qu'une écriture en GO serait plus judicieuse ( le code de Traefik étant en GO, les structures de données seraient ré-utilisables ).
Mais pour faire quoi exactement ? Est-ce que ça pourrait vraiment servir ?
Alors oui soyons honnête, cette nouveauté ne sera pas intéressante pour tous !
Par contre, si comme moi, vous êtes féru de solution DIY alors cet ajout peut vous intéresser ! Elle peut vous permettre de créer une API afin d'utiliser de façon dynamique Traefik avec des serveurs webs ( sans conteneurisation par exemple ) ou bien encore ne pas utiliser de socket pour communiquer avec Docker.
Ou alors de créer un programme tiers pour communiquer les events de Podman à Traefik : En utilisant la nouvelle API Rest de Podman et cette nouvelle possibilité.
Et pour les plus aventuriers lancer des containers avec runC et du réseau :

Et enfin utiliser Traefik comme reverse-proxy avec la possibilité d'automatiser le tout !
Sans révolutionner l'utilisation de Traefik, cette nouveauté apporte son lot de possibilités ( de "fun hack" ) que j'apprécie fortement 😀
N'hésitez pas à permettre au blog de continuer à exister et à fournir un contenu de qualité - enfin je l'espère - au travers de vos dons sur : buymeacoff.ee/lfache
Et n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter, ou ici 👇