blog.bressure.net

Carnet professionnel d'un informaticien

Application, Paramétrage

2 Traefik sur un même hôte docker

admin

Pour économiser une VM en utilisant directement ma machine hôte pour accueillir les conteneurs de préprod, j’avais décidé de mettre les briques de répartition (haproxy) et de routage (Traefik) sur le même hôte docker. Les conteneurs de services seraient alors en double sur cet hôte dans le cas des services d’infrastructures.

Réseau dédié…

Les services n’exposent pas de port puisque c’est Traefik via le nom de domaine qui fait automatiquement le routage. Les 2 environnements de prod et de préprod sont accessibles par le même nom de domaine (en amont le port est différent) et la configuration des services ne diffère que sur le réseau Traefik auquel ils s’attachent. Chaque Traefik ne peut accéder qu’accéder aux services qui sont dans son réseau aval.

… mais pas suffisant

Les 2 instances de Traefik sont sur le même hôte docker. Par conséquence dès qu’un service est démarré les 2 Traefik sont alertés et l’ajoutent dans leur table de routage respective. Si bien que les services de prod et préprod sont ajoutés dans chacun des Traefik et comme leur configuration utilise les mêmes identifiants de règle et de route: ils s’écrasent mutuellement. Sur le schéma ci-dessous si on démarre le service de staging en 2nd alors le Traefik de prod à gauche se configurera pour envoyer les requête pour domain.com vers le service de staging. C’est une erreur. De plus comme il n’y a pas de route réseau vers ce conteneur cela ne marche pas !

Nom de router et point d’entrée

Comme je veux garder le même nom de domaine entre la prod et staging, lorsque je donne un nom de route différent à chaque environnement comme par exemple:

- "traefik.http.routers.prometheus.rule=Host(`prometheus.bressure.net`)"
- "traefik.docker.network=traefik_backend"

et

- "traefik.http.routers.staging_prometheus.rule=Host(`prometheus.bressure.net`)"
- "traefik.docker.network=staging_traefik_backend"

Le second va écraser le premier car Traefik va attacher le conteneur à tous les EntryPoint ici le seul qui est configuré sur le port 80 de Traefik. La production va essayer de router vers staging ce qui est heureusement impossible à cause de la configuration réseau.

Comme les 2 instances de Traefik sont à l’écoute de tous les services de l’hôte docker commun, il faut en plus que chaque service ait un EntryPoint distinct afin différencier une règle de prod d’une règle de préprod. Ainsi chaque instance de Traefik aura 2 EntryPoint : la prod et la préprod. On pourrait différencier les 2 instances de Traeffik en ne définissant que l’EntryPoint utile selon son environnement mais je me demande si un jour je ne vais pas avoir besoin de mettre tout un seul Traefik. Voici le schéma des flux:

Tags:

Comments

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Back to top