Dans mon article précédent, dont la lecture est un préalable, j’avais décrit les principes de la découverte de services par DNS comme technique de communication entre conteneurs Docker et ce, indépendamment de leur localisation physique sur un serveur hôte.
Lors de sa mise en oeuvre pratique avec un registre Consul, nous avions vu en particulier que l’enregistrement manuel des services via l’API Agent pouvait être fastidieuse.
Dans ce second volet de la série, nous mettrons l’accent sur une technique d’enregistrement à chaud de services dockerisés grâce à Registrator, développé par Jeff Lindsay et disponible sous la fome d’une image Docker.
Etude de cas
Le schéma ci-dessous décrit l’architecture d’un cluster constitué de 3 noeuds hébergeant chacun un agent Consul et un hôte Docker.
Sur chacun des hôtes Docker sont déployés :
- un conteneur Registrator
- un conteneur hébergeant un web service HTTP (respectivement
svc1
,svc2
etsvc3
)
Pour accompagner la lecture de cet article, le cluster décrit ci-dessus est provisionnable localement via une configuration Vagrant que je mets à disposition sur Github, et dont la mise en oeuvre est des plus simples :
Repartez de cette configuration si vous souhaitez reproduire les exemples de l’article.
Note : Le temps de construction et de démarrage du cluster en partant de zéro est long. Compter plusieurs (longues) minutes.
Fonctionnement
Lors de l’initialisation du cluster, chaque noeud démarre :
- un agent Consul (en mode serveur sur
node1
) : l’API HTTP Agent est alors accessible sur le port8500
de chaque agent - un conteneur Registrator :
- à l’écoute des évènements Docker
start
,die
,stop
etkill
des conteneurs co-localisés - connecté à l’agent Consul de l’hôte Docker sur lequel il est déployé
Ainsi, le démarrage du conteneur Registrator surnode1
(adresse IP172.20.20.10
) s’effectue comme suit :
- à l’écoute des évènements Docker
A ce stade, Registrator est prêt à intercepter les évènements de tout conteneur susceptible d’être créé ou détruit, à l’issue de quoi il met à jour en conséquence le registre Consul.
Note : le fonctionnement d’un cluster Consul est décrit dans la première partie de cet article.
Un cas pratique d’enregistrement de service à chaud
Le cluster étant opérationnel, commençons par déployer le service svc4
sur le serveur node3
:
On notera que :
- la variable d’environnement
SERVICE_NAME=svc4
permet d’attribuer explicitement le nom du service dans le registre. Dans notre exemple, le service dockerisé sera accessible via le FQDNsvc4.service.consul
- Registrator enregistre le service à l’interception de l’évènement
start
via l’API/v1/agent/service/register
- Registrator désenregistre le service à l’interception des évènements
stop
,kill
etdie
, via l’API/v1/agent/service/deregister
En interrogeant Consul via l’API DNS, on constate que le nouveau service est correctement enregistré et déployé sur le noeud 3 :
Enfin, appelons ce service depuis un conteneur Docker issu de l’image tutum/curl
déployé sur le serveur node2
:
Arrêtons le conteneur svc4
:
On constate que le service svc4.service.consul
a été désenregistré à chaud :
Voilà. Le registre Consul est mis à jour dynamiquement et reflète parfaitement le plan de déploiement des services dockerisés, ce qui est éminemment utile dans une architecture de microservices.