Nous avons installé Docker sur tous les Raspberry Pi, maintenant nous allons pouvoir utiliser son orchestrateur natif « Swarm » pour pouvoir gérer le Raspberry Cluster.
La PiTeam forme notre Raspberry Cluster, ce cluster est une « grappe » de ressources, ici des Raspberry Pi qui sont actuellement indépendants. Nous avons la possibilité de faire tourner individuellement sur chaque Raspberry Pi des applications au travers de conteneurs Docker, mais nous ne pouvons pas garantir une haute disponibilité de ces applications en cas de panne machine par exemple. Nous ne pouvons pas non plus maîtriser une montée en charge avec une seule machine, car elle peut vite réduire ses performances, voir devenir indisponible.
Afin de pouvoir gérer ce cluster de serveurs Docker, l’orchestrateur Swarm est né, il permet de gérer la PiTeam de notre Raspberry Cluster comme une seule et unique machine Docker.
Définition Wikipédia de l’Orchestration informatique :
L’orchestration décrit le processus automatique d’organisation, de coordination, et de gestion de systèmes informatiques complexes, de middleware et de services.
L’orchestrateur va nous permettre de gérer correctement notre infrastructure et les services qui vont tourner dessus, la rendre plus stable et disponible.
Swarm a évolué depuis ses débuts, il était au départ un logiciel compliqué à installer qui s’appelait Docker Swarm, depuis la version 1.12 de Docker il se fait appeler le mode Swarm !
Pour nous faciliter la lecture et désigner la dernière version utilisée « Swarm mode for Docker » (le nom officiel dans la documentation Docker), nous utiliserons « Swarm« , « Mode Swarm » ou « Docker Swarm« .
Voici une liste non-exhaustive (en fonction de ses mises à jour régulières) des fonctionnalités de Swarm :
Nous avons suffisamment de compréhension pour commencer la mise en place de Swarm afin de gérer la PiTeam.
Swarm pour créer une architecture scallable et résiliente, mettons en place 2 types de nœuds : les Masters et les Workers.
A la construction du Raspberry Cluster, vous avez pu remarquer que j’ai installé au dernier étage 2 Raspberry Pi Zéro W, ils vont tout simplement me servir de Masters.
Les 2 Raspberry Pi Zéro W vont devenir des masters :
Les 6 autres Raspberry Pi 3 seront des Workers (ceux qui travaillent, même si les Masters sont aussi potentiellement des Workers, nous allons les contraindre à ne faire qu’une fonction de Master).
Schéma du Raspberry Cluster Swarm
PiErra et PiErre les faux jumeaux ont pris la grosse tête et veulent devenir les Masters du Cluster Swarm, pour se faire nous allons initialiser le projet (n’oubliez pas que tous les Raspberry Pi doivent avoir Docker d’installé).
docker swarm init
Vous obtenez la commande incluant le token pour rejoindre le Cluster Swarm.
Swarm initialized: current node (yo03wy5e4lux9qabre3n7fegv) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-41y64xnw2fqa9h6dxj4ueklpc14w5jsklqidkteouamc9a1joo-3vbfif4w6c38443od3406n0o1 192.168.0.108:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
docker swarm join --token SWMTKN-1-41y64xnw2fqa9h6dxj4ueklpc14w5jsklqidkteouamc9a1joo-3vbfif4w6c38443od3406n0o1 192.168.0.108:2377
Vous devez obtenir un résultat positif.
This node joined a swarm as a worker.
Pour avoir accès au Cluster Swarm, nous devons simplement nous connecter en SSH au Manager, ici PiErre-08 >> IP : 192.168.0.108.
docker node ls
Vous obtenez la liste de tous les nodes de votre Cluster Swarm !
Ce résultat est assez simple à lire :
Nous avons donc 1 Manager et 7 Workers, mais ce n’est pas l’architecture que nous voulions, car PiErra-07 doit aussi devenir manager.
docker node promote sm5mzvn8brs5blzcvk4s5ldhl
Maintenant PiErra-07 obtient le Statut de Manager « Reachable« (Accessible en français). Nous avons maintenant 2 Managers et 6 Workers !
Les lignes de commandes c’est bien, mais voir ce qu’il se passe en temps réel sur notre Raspberry Cluster, c’est encore mieux. Et pour cela nous allons installer notre premier service « Docker Swarm Visualizer« .
L’installation se fait à partir de l’un de nos Managers.
sudo docker service create \ --name viz \ --publish 8080:8080/tcp \ --constraint node.role==manager \ --mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \ alexellis2/visualizer-arm:latest
Petite explication de la commande ligne par ligne :
On peut ouvrir une fenêtre sur notre navigateur préféré sur l’une des adresses de notre Cluster (Swarm créant un Cluster unique, toutes les IP sont gérée par Swarm) sur le port 8080.
Alors là, c’est vraiment cool ! Mais dans le but d’avoir cette application hautement disponible, il faudrait que « viz » soit aussi sur PiErra-07 le 2ème Manager (dans le cas ou PiErre-08 aurait un problème).
Pour se faire, nous allons demander à Swarm de « scaler » l’application « viz« , c’est à dire de créer n instance du service ! Et pour voir si la contrainte qu’on a configurée lors de la création du service est bien opérationnelle, nous allons créer 5 instances.
docker service scale viz=5
Lors de l’exécution de la commande, on s’aperçoit comme à la création qu’il y a téléchargement de l’image sur l’une des machines, mais pourquoi et laquelle (on voit aussi qu’une est déjà en « running », c’est celle de départ sur PiErre-08) ?
Et oui, sans surprise, 5 instances du service « viz » ont été créés seulement sur les 2 Managers.
Nous n’avons réellement pas besoin d’autant d’instance (c’est un service admin, donc pas de gros trafic dessus), nous allons redescendre à 2 instances 🙂
docker service scale viz=2
Et HOP instantanément, Swarm a équilibré le placement des instances (2 managers = 1 instance chacun) !
Pour comprendre comment fonctionne Swarm, on va simplement créer un service Nginx sans configuration.
docker service create \ --name nginx \ nginx:latest
YESSSSS !!! Tout a bien fonctionné !!!
Bah Non ! C’est pas bon, si on y regarde de plus prêt notre application n’a aucun port exposé, donc pas de possibilité de voir le résultat dans un navigateur ! Mais j’ai la solution.
Au passage vous voyez une nouvelle commande qui permet de lister tous les services.
On va simplement utiliser la commande qui permet de mettre à jour les configurations d’un service.
docker service update --publish-add published=80,target=80 nginx
Et Hop !!! Maintenant ça marche (sur n’importe quelle IP du Raspberry Cluster)
Allez pour finir on va se faire un petit Kif, on va créer 15 instances de l’application et on va voir comment Swarm les gère.
docker service scale nginx=15
C’est un petit long car l’image de nginx se télécharge sur tous les Raspeberry Pi, mais le résultat est bluffant.
Cet épisode est maintenant terminé, vous avez touché du doigt la puissance de l’orchestrateur Swarm et de toutes ses possibilités. Dans un prochain épisode, on fera des tests de chaos pour voir comment le Raspberry Cluster se comporte fasse aux pannes.
27 Comments
J’adore cette série ! C’est clair, c’est propre ! Continue !
Bonjour Willi,
Merci de ton soutien, c’est le but, je vais continuer, le prochain sera sur Kubernetes 🙂
salut Mickael,
vraiment clair, ludique et didactique ces épisodes… j adore.
bravo
nb: je vais faire prochainement un article sur le site et page facebook de RaspberryPi France
Merci yolateng0,
Cool, merci pour l’article alors 🙂
Hey, j’espère que tout se passe bien avec ton cluster irrationnel et que auras l’occasion de continuer cette série d’articles intéressants! 🙂
Salut,
On a plus de nouvel article depuis plusieurs mois, c’est dommage car j’aime bien ta façon d’expliquer.
C’est à la poubelle ou tu vas continuer ?
Bonne journée,
Bonjour @Pillow,
Tu as raison, depuis plusieurs mois j’ai changé de travail, fait des auto-formations pour devenir développeur Java et Angular, moins de temps à me consacrer à ma passion, mais bientôt je reviens avec un super projet qui me permettra de continuer la série 🙂
Bonjour Michaël ,
Superbe série d’articles 🙂 !!
Y en a-t-il d’autre de prévus, avec des sujets un peu plus avancés ?
Salut @Thomas,
Oui ça arrive, je suis sur l’orchestrateur Kubernetes pour Raspberry Pi (pas simple avec ARM, mais c’est possible), j’ai pas encore fini le tuto que je veux vous présenter.
Hello, c’est top les différents épisodes 😉 c’est pour quand le 5ème?
Salut @M@X,
Bientôt !
Super séries de tutos! Ça fait un moment que l’envie de faire un cluster de Raspberry me trotte dans la tête.
J’ai une ou deux questions sur le principe de fonctionnement…
Une fois que tout est en place:
– si je veux installer un programme, je dois passer forcément par un des deux master ?
– le programme que je veux installer doit forcément être un container docker ou un apt-get install fera l’affaire aussi ?
Vu que tu on 6 Raspberry en fonction est-ce que ça représente grossièrement à une puissance de calcul du genre « Raspberry x 6 » ?
Encore merci pour ces tutos, ils me décident de plus en plus à réaliser un projet pareil ! 😉
Ah oui encore une chose^^ si on veut faire un raid 5 avec 6 disque dur est-ce peut le faire ?
Est-ce qu’on oeur brancher 1 disque dur / Raspberry ?
Ça fait beaucoup de question désolé.
Si tu as le temps des réponses à une c’est super sympa ^^
Salut Khaosan,
Merci pour ton soutien.
Oui tu lances tes services par la master « leader » en général, oui le principe de swarm est d’orchestrer des containers (mais tu peux faire un apt-get dans ton container, ce qui sera perdu au redémarrage de ton container si tu le perds).
La puissance de calcul n’est jamais 6 x les RPi’s mis en réseau, mais après avec Swarm, le principe c’est de travailler en parallèle la puissance de chaque RPi en fonction des besoins.
Swarm n’est pas fait pour faire du raid, par contre tu peux utiliser GlusterFS (on le verra dans un prochain épisode), il permet de gérer tes volumes de datas persistants (oui tu peux accrocher un DD par RPi, mais c’est pas le but de ton cluster).
Je sais c’est une réponse tardive, elle permettra peut être aux nouveaux d’y voir plus clair.
Bye !!!
J’ai dévoré les articles.
Je suis impatient de voir la suite. Avec une mise en application
Salut JC, merci, dès que je peux et surtout un peu de temps, je reviendrais avec d’autres épisodes.
Hello,
Je reviens à la charge, les séries sont super ! Tellement ludique !
Questions :
– Je n’ai pas compris la différence worker et manager ?
J’attend impatiemment la suite !!!!!
Merci à toi
Salut Vincent, un manager est un worker qui gère les autres. C’est lui qui orchestre ton cluster, tu as en général un leader et 2 voir plusieurs autres managers qui peuvent devenir leader à leur tour en cas de panne.
Hello !
Très bonne série ! A quand le prochain épisode, je suis en plein dans la création d’un cluster, impatient de voir la suite.
A bientôt j’espère
Salut Frederic, bah un jour ! Le temps me manque pour réussir à avancer dans tous mes projets. Patience.
Bonjour,
J’adore la série. J’ai envie de me monter un cluster rpi pour apprendre aussi et mettre toute ma domotique. Et quelques autres idées que j’ai (notamment monter un cluster Jenkins pour build des images docker sur arm ou faire un serveur de téléchargement).
Sur cet épisode je me pose la question des data. Nginx est sur 15 instances et sur plusieurs rpi. Mais ou sont les datas et comment sont-elles partagées?
Si j’ai un site, on va dire static pour que ce soit plus simple. Comment swarm gère? OK on monte un volume sur chacun pour que les données soient persistées et c’est dans ce répertoire que sera le site sera. Du coup répertoire partagée en NFS? on peut demander à swarm de partagé un volume sur tous les noeuds? ou il y a un autre moyen? C’est la partie que je n’arrive pas à comprendre sur du swarm. Est encore plus compliqué si les données sont dynamique. Comment se fait la synchro?
J’espère que le prochain numéro sortira rapidement. Pourquoi pas du rancher avec kubernetes. J’ai vu qu’il avait fait une image pour du arm.
Salut Didier, pour persister les données je fais appel à GlusterFS (on peut en utiliser d’autres), je vous expliquerais tout ça dans un prochain épisode. Kubernetes est aussi dans les tiroirs !
Hey merci pour cette super série sur docker Swarm.
J’ai beaucoup appris avec cette série, néanmoins je pense qu’il manque des éléments pour pouvoir approfondir un peu les choses. Par exemple: comment fait-on pour gérer les services ? Quand c’est un container on fait « docker exec -it [container_id] /bin/bash » mais là que c’est un service comment fait-on ?
Si tu as la réponse je suis preneur 🙂
Salutations
Salut Fred, merci, le but est de partager. Quand tu est en mono instance, tu peux éventuellement rentrer dans le container pour faire des tests, mais ne pas oublier que ton instance est stateless et qu’au redémarrage tu perds toutes tes modifications. Par contre avec un volume tu peux persister tes données 🙂 Suite dans un prochain épisode ! patience 😉
Salut,
Tout d’abord merci pour ce tuto instructif.
Ton tuto et d’autres également, m’ont donnés envie de fabriquer mon propre cluster, chose que je suis en train de réaliser, mais aimant travailler le métal et l’électronique forcément j’ai un peu dévié sur un cluster enfermé dans une jolie boîte en alu (je fabrique tout et je customise tous les composants internes pour que cela me plaise le budget s’en fait donc ressentir par rapport à ton installation). Donc, je monte un cluster de 7 pi 3b+, avec 2 managers et 5 workers, petite précision supplémentaire ce cluster inclut également 3 HDD 2.5, car il me servira de nas et de cloud, j’envisage aussi d’en faire un petit serveur minecraft pour mes gosses, et de l’utiliser également pour la domotique. Par contre compte tenu du nombre de containers dispos sur le hub de docker, même en ne prenant que ceux pour arm, je me perds dans les possibilités qu’offrent ce cluster, peux-tu nous donner des exemples d’utilisation que tu aurais mené à bien en dehors de nginx. Et sinon on attend tous impatiemment l’opus 5 ! ;P
Salit D@vid, c’est vrai que les possibilités sont grandes ! Je sais que vous attendez la suite, mais ma vie est assez dense depuis quelques mois ! Patience, je vais revenir.
Excellent, ça donne envie de tester de noter coté. dommage qu’il n’y ai pas de suite.
Salut Mounik, je suis sur un épisode avec Kubernetes, mais sur RPI3 c’est pas simple (hâte d’avoir du temps pour le finir).