TP Mise en œuvre de Docker Swarm
Version Française | English version
Ce TP sera évalué de façon automatique. Notez vos réponses aux questions sur une feuille que vous apporterez avec vous lors de l'examen finale.
Pour ce TP vous devez créer 3 machines virtuelles par groupe, or le projet ne permet la création que d'un nombre limité de machines. Il est donc très important de travailler en binôme et de supprimer celles qui ne vous servent plus.
Enfin vous devrez tous saisir dans Tomuss l'adresse IP du nœud Manager dans
le champ IP_Manager_TP_Swarm.
Introduction
L'objectif de ce TP est de se familiariser avec la solution de clusterisation proposée par Docker et nommée Swarm. Il existe des solutions alternatives que nous n'explorerons pas dans le cadre de ce TP (ex: Kubernetes).
Nous nous appuierons sur l'infrastructure OpenStack de Lyon 1. Pour obtenir des informations sur
comment se connecter : https://documentation.univ-lyon1.fr/. Dans le projet
M2DISS nous déploierons au préalable 3 petites machines virtuelles
(m1.tiny est suffisant). L'une sera utilisée comme Manager, et les deux
autres comme Worker.
Attention : Pour ce TP nous avons préparé une image avec un Docker pré-installé et pré-configuré qui fonctionne à l'université. Vous devez créer vos instances à partir de l'image nommée Ubuntu 22.04.3 LTS - Docker Ready.
- Saisir l'adresse IP du nœud Manager sur Tomuss (étape à faire par tous).
- Ajouter la clé publique de l'enseignant avec la commande suivante sur le nœud Manager.
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4fp5+2v2t5LjEckY6V3lNPPf8qIXEsZIVZvL0bnqY+f+zyPHhdyMS/r5qH8lpeB8CHjKwQRp3ttF1zZ5v7A4cel/2uXccun/gwf96s5Kpm5j8KzKwQbkigb/5Q69GC4pNA0b6u7QQ3kXTghaSFkuVlmqueoaw9sO9udYRXSVk9FX48F8OxkkwYMlUIacAU69udhvrpcUGBDn+t2Q696OUGl/4CZtHP4me3otOCFp6v3dGbY0ccu5at1aRaOmLH0XTtxRNSny3d1vpsgguAIT/PJJAjeuGCAWApNvJIYiQi4z0f6MSsjaIPwWtBakkNWPMkxP5Gph3x6qkkzyHMsoD jp@h2g2" >> /home/ubuntu/.ssh/authorized_keys
Partie I : Déploiement de Docker Swarm
L'installation de base se fait à présent de manière très simple. Tout d'abord sur la VM qui hébergera le manager :
docker swarm init --advertise-addr 192.168.XXX.YYY
- Que fait cette commande ? Expliquez/Décrivez succinctement. Vous pouvez utiliser la
commande
docker swarm init --helppour avoir une information sur les paramètres.
Puis sur chacun des workers
docker swarm join --token letokenrenvoyeparleswarminit 192.168.XXX.YYY:2377
- Que fait cette commande ? Expliquez/Décrivez succinctement.
Remarque : Pour chacune des questions vous trouverez des éléments de réponse dans la documentation officielle de Docker Swarm.
NB: Une fois le cluster installé, la commande ci-dessous vous permettra d'avoir un visualiseur de votre infrastructure déployée (http://IPDEVOTREVM:8080)
docker service create --name=viz --publish mode=host,target=8080,published=8080 \
--mode=global --constraint=node.role==manager \
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
dockersamples/visualizer
- Quelle commande peut-on utiliser pour lister et vérifier la liste des workers à disposition ?
- Imaginons que vous souhaitiez ajouter un nouveau nœud worker et que vous avez égaré le token de votre cluster swarm. Quelle commande vous permet de le récupérer ?
- Est il possible d'avoir plusieurs machines qui tiennent le rôle de manager (au même titre que plusieurs machines sont des workers). Comment fonctionnent t-ils ?
- Sortez un worker du cluster puis remettez-le. Quelles commandes saisissez-vous ?
Partie II : Usage d'un cluster swarm
Exécutons trois instances de nginx dans notre cluster swarm.
(manager)# docker service create --name web --publish 80:80 --replicas=3 nginx:latest
- Quelle commande utilise-t-on pour lister tous les services créés ?
- Quelle commande utilise-t-on pour lister toutes les instances du service ?
- Quelle commande utilise-t-on pour obtenir des informations détaillées sur un service ? (inspect)
Comment étendre un service
Afin d'avoir à présent cinq instances de notre service
(manager)# docker service scale web=5
On peut également réduire le nombre de services (scale down)
(manager)# docker service scale web=1
Notez que pour supprimer un service (ne le faite pas ici)
(manager)# docker service rm web
Maintient automatique du service
Si nous avons défini un service avec un nombre donné de replicas, le Swarm manager est en charge de s'assurer de maintenir cet état. Pour vous en assurer :
- Instanciez trois répliquas d'un service (voir commande précédente);
- Connectez-vous sur l'une des machines de travail hébergeant l'un de ces répliquas et détruisez brutalement le docker (''docker kill ...'').
- Que se passe t-il au bout de quelques secondes ?
- À présent stoppez la machine de travail (via l'interface horizon). Que se passe-t-il ?
Partie III : Gestion des nœuds composant le cluster
- On souhaite éteindre un nœud physique (de type worker) pour effectuer une opération de maintenance sur ce dernier. Quelle procédure aller vous suivre (ou Quelles commandes allez vous saisir) pour faire cela proprement ?
- Expliquez brièvement la notion de promotion d'un nœud worker (promote/demote).
Partie IV : Réseau overlay
Supprimez tous les services utilisés précédemment (sauf le service de vizualisation), vous allez en relancer un seul avec un unique réplicas :
docker service create --name nginx -p 80:80 --replicas 1 nginx
Ensuite, retrouvez sur quel nœud de calcul se trouve le docker. Le nom du docker est un peu différent du nom du service.
docker logs -f nginx.x.yyyyyyyyyyy
Grâce à la commande précédente afficher les logs du docker nginx. Puis avec votre navigateur tentez de contacter le serveur web sur vos 3 VM (Manager et Workers).
- Que constatez-vous ?
- Quel réseau utilise le docker ? (utilisez la commande
docker inspect ...) - Afficher la liste des réseaux, quel est le driver de ce réseau ?
Créez votre réseau overlay
- Créer un réseau ''172.21.21.0/24'' avec le driver overlay ayant pour nom reseau (sans accent). Ajoutez lors de sa création l'option ''attachable''. Cette option vous permettra de créer des dockers utilisant le réseau sans être géré par swarm.
- Déployer sur le réseau nouvellement créer 3 réplicas du service nginx sur le port 80 et dont le nom est 'web'. Observez l'adressage IP.
Partie V : Création d'un registry privé
Vous avez vu lors des exercices précédant que le cluster swarm pouvait facilement lancer des dockers basés sur des images publiques. Mais pour le moment vous ne pouvez pas le faire avec des images construites via un Dockerfile. Pour éviter cette limite, il faut installer un dépôt docker privé dans lequel vous placerez et téléchargerez les images que vous avez générées. Vous trouverez la documentation ici.
Attention, les registry que vous pouvez facilement utiliser sont des
registry locaux c'est à dire que leur adresse est localhost. En effet,
pour autoriser un registry distant, il faut gérer des certificats
d'authentification SSL ce qui est hors du cadre de ce TP. Vous allez donc créer
un unique docker registry qui répondra à l'adresse localhost:5000 sur
plusieurs machines virtuelles. Cela n'est possible que grâce au cluster swarm
qui va s'occuper pour vous de la redirection des paquets.
- Dans le cluster swarm, créer un service registry dont le nom sera
registry, issue de l'imageregistry:2et qui partage le port 5000 avec toutes les machines du cluster. - Sur quel nœud ce dernier est-il instancié ?
- Le registry est un nœud de stockage, si l'ordonnanceur décide de le déplacer, toutes les images qu'il contient seront effacées. Pour éviter cela, supprimez le service registry et recréez le en imposant (constraint) qu'il soit instancié sur le nœud Manager.
- Testez sa réponse à l'adresse localhost en vous connectant sur une
machine virtuelle qui ne fait pas tourner le service registry.
- Pour ce faire vous pouvez pull une image officielle (prendre l'image hello-world) puis
- la tagger en localhost:5000/my-hello-world.
- Ensuite vous la push sur localhost et supprimez les deux images (celle récupérée via le pull et celle taggée).
- Enfin, faite un pull sur localhost de l'image taggée.
Exploration du registry
Le registry semble un peu abstrait car il ne permet pas facilement d'explorer son contenu. Mais il y a des services spécialisés dans cette exploration que vous pouvez bien sur installer sous forme de conteneurs.
- Installez un service d'exploration du registry comme celui-ci https://store.docker.com/r/konradkleine/docker-registry-frontend via la commande
docker service create -d --network reseau -e ENV_DOCKER_REGISTRY_HOST=registry \
-e ENV_DOCKER_REGISTRY_PORT=5000 -p 8443:80 --name regbrowser \
konradkleine/docker-registry-frontend:v2
Consultez la page http:IP_DE_VOTRE_VM:8443 et explorez le contenu du registry.