Raspberry Cluster – S01E04 – La PiTeam et Swarm

Raspberry Cluster - S01E04 - Docker Swarm

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.

Parlons orchestrateur

C’est quoi un orchestrateur ?

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.

Pourquoi utiliser un orchestrateur ?

L’orchestrateur va nous permettre de gérer correctement notre infrastructure et les services qui vont tourner dessus, la rendre plus stable et disponible.

  • Gérer son infrastructure de machines, manager ses ressources facilement (avec Swarm on les appelle les nœuds).
  • Rendre son infrastructure et ses services stables et hautement disponibles.
  • Avoir la capacité de monter en charge, on parlera de scalabilité (augmenter le nombre d’instances de nos services).
  • Pouvoir répartir/distribuer la charge entre les différents nœuds, appelée aussi « load balancer« .
  • Faire du déploiement continu.
  • Faciliter la maintenance.
  • Etre plus agile et efficace en facilitant le rollback (retour à une version antérieure) par exemple.

Il fait quoi Swarm dans tout ça ?

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 !

Logo Docker 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 :

  • Il ordonnance « Schedule » et place les instances des applications sur les nœuds.
  • Il déploie l’application une fois ses instances placées (en fonction de l’état souhaité).
  • Il gère les règles de placement et les contraintes désirées (je peux souhaiter déployer un service sur un nœud spécifique par exemple pour une base de données).
  • Il répartie la charge entre les différents nœuds automatiquement « Load Balancing« .
  • Il fait des mises à jour sans interruption de service « Rolling Update« .
  • Il se repart automatiquement »Self-Healing« , si un nœud s’arrête brutalement, il est capable sans interruption de service de relancer une instance de l’application sur un autre nœud.
  • Il gère le trafic dans le réseau sans avoir besoin de connaître pour l’utilisateur sur quel nœud et à quelle adresse IP les instances de l’application se trouvent.
  • Il sécurise et crypte les flux de données dans le réseau.
  • Il gère des secrets des conteneurs (on peut mettre par exemple des mots de passes dans des fichiers non persistants, intégrés dans les conteneurs et cryptés par Swarm).
  • Il s’occupe de maintenir l’état cible désirée de notre application (si l’on décrit vouloir 3 instances d’une application, qu’une devient KO, alors il va en recréer une autre sur un nœud).
  • Il effectue un retour arrière « Rollback » sur un service avec une simple commande.

La PiTeam et 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.

2 Masters font leur apparition

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 :

  • PiErra-07 >> IP : 192.168.0.107
  • PiErre-08 >> IP : 192.168.0.108

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).

  • PiErrik-01 >> IP : 192.168.0.101
  • PiLar-02 >> IP : 192.168.0.102
  • PiEtro-03 >> IP : 192.168.0.103
  • PiMprenelle-04 >> IP : 192.168.0.104
  • PiEl-05 >> IP : 192.168.0.105
  • PiNa-06 >> IP : 192.168.0.106

Raspberry Cluster - S01E04 - 2 Masters - 6 Workers

Schéma du Raspberry Cluster Swarm

Raspberry Cluster - S01E04 - Schéma Cluster Swarm

Initialisons le 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é).

  • Se connecter en SSH à un Manager, ici PiErre-08 >> IP : 192.168.0.108.
  • Exécuter la commande d’initialisation de Swarm.
docker swarm init

Vous obtenez la commande incluant le token pour rejoindre le Cluster Swarm.

Attention, vous devez prendre votre commande, le token n’est jamais le même !
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.
  • Se connecter en SSH à tous les autres Raspberry Pi de la PiTeam et exécutez la commande pour rejoindre le Cluster Swarm.
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.

Vérifions l’état de notre Cluster Swarm

Pour avoir accès au Cluster Swarm, nous devons simplement nous connecter en SSH au Manager, ici PiErre-08 >> IP : 192.168.0.108.

  • Exécutez la commande qui permet de lister tous les nodes du Cluster Swarm.
docker node ls

Vous obtenez la liste de tous les nodes de votre Cluster Swarm !

Raspberry Cluster - S01E04 - Liste des Nodes

Ce résultat est assez simple à lire :

  • ID : l’id du nœud généré par Swarm (le *, veut dire que ce nœud est le manager).
  • HOSTNAME : Le nom de votre Raspberry Pi, on voit bien que nos 8 Raspberry Pi sont présents.
  • STATUS : Le statut du nœud, actuellement ils sont tous « Ready« .
  • AVAILABILITY :  le nœud peut être « Actif« , en « Pause » ou « Drain« . « Drain » signifie que le nœud ne reçoit plus de nouvelles tâches de la part de Swarm, arrête ses tâches et qu’il est en cours de réplication (mode maintenance planifiée).
  • MANAGER STATUS : On peut voir que c’est bien PiErre-08 qui est le Manager « Leader » (car il est actuellement le seul).

Gérer les Managers et Workers

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.

  • Se connecter en SSH à PiErre-08 >> IP : 192.168.0.108.
  • Exécuter la commande permettant de promouvoir un Worker en 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 !

Raspberry Cluster - S01E04 - 2 Managers


Installons Docker Swarm Visualizer pour voir ce qu’il se passe !

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« .

Ce projet a été créé par Francisco Miranda pour la keynote DockerCon EU 2015. Il a été adapté pour être utilisé pour la keynote DockerCon US 2016 présentant le mode Swarm de Docker. Depuis lors, la communauté a généreusement contribué à de nombreuses mises à jour.

L’installation se fait à partir de l’un de nos Managers.

  • Se connecter en SSH à PiErre-08 >> IP : 192.168.0.108.
  • Exécuter la commande créant un nouveau service.
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 :

  • sudo docker service create : commande de docker pour créer un nouveau service.
  • –name viz : on veut que ce service s’appelle « viz« .
  • –publish 8080:8080/tcp : on veut exposer ce service depuis internet et sur le réseau interne sur port 8080.
  • –constraint node.role==manager : on veut contraindre (notion de règle ou contrainte) le service à n’être créé que sur des Managers (on ferra un test par la suite de scalabilité).
  • –mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock : pour que les datas soient persistantes, on créait un volume en local.
  • alexellis2/visualizer-arm:latest : on récupère la dernière image du Docker Hub de alexellis2/visualizer-arm (version arm pour les Raspberry Pi).

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.

Raspberry Cluster - S01E04 - Vizualiser Docker Swarm

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.

  • Se connecter en SSH à PiErre-08 >> IP : 192.168.0.108.
  • Exécuter la commande pour « scaler » le service « viz« .
docker service scale viz=5

Raspberry Cluster - S01E04 - Scale service

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) ?

Raspberry Cluster - S01E04 - Scale service 5 running

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 🙂

  • Se connecter en SSH à PiErre-08 >> IP : 192.168.0.108.
  • Exécuter la commande pour « scaler » le service « viz« .
docker service scale viz=2

Et HOP instantanément, Swarm a équilibré le placement des instances (2 managers = 1 instance chacun) !

Raspberry Cluster - S01E04 - Scale service 2 running


Une application hautement disponible !

Pour  comprendre comment fonctionne Swarm, on va simplement créer un service Nginx sans configuration.

  • Se connecter en SSH à PiErre-08 >> IP : 192.168.0.108.
  • Exécuter la commande de création d’un service en récupérant l’image Nginx.
docker service create \
  --name nginx \
  nginx:latest

YESSSSS !!! Tout a bien fonctionné !!!

Raspberry Cluster - S01E04 - Ngnix 1

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.

Raspberry Cluster - S01E04 - pas de port ngnix

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.

  • Exécutez la commande « service update« ,  le « tag » –publish-add avec le port publié et le port cible dans le réseau, sans oublier le nom du service.
docker service update --publish-add published=80,target=80 nginx

Et Hop !!! Maintenant ça marche (sur n’importe quelle IP du Raspberry Cluster)

Raspberry Cluster - S01E04 - ngnix html

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.

  • Exécuter la commande pour « scaler » le service « nginx« .
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.

Raspberry Cluster - S01E04 - Ngnix 15

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.

Michaël LIXON
Michaël LIXON
Ingénieur Études et Développement - Coach et formateur DevOps | Une prestation ? Prenez contact au +33 (0)4 83 28 80 40 - CELAD - Sophia-Antipolis.

27 Comments

  1. willi dit :

    J’adore cette série ! C’est clair, c’est propre ! Continue !

  2. yolateng0 dit :

    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

  3. An'h Onÿm dit :

    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! 🙂

  4. Pillow dit :

    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 🙂

  5. Thomas dit :

    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 ?

  6. M@X dit :

    Hello, c’est top les différents épisodes 😉 c’est pour quand le 5ème?

  7. Khaosan dit :

    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 !!!

  8. Jc dit :

    J’ai dévoré les articles.
    Je suis impatient de voir la suite. Avec une mise en application

  9. Vincent dit :

    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.

  10. Frederic dit :

    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

  11. Didier dit :

    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.

  12. Fred dit :

    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 😉

  13. D@vid dit :

    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

  14. Mounik dit :

    Excellent, ça donne envie de tester de noter coté. dommage qu’il n’y ai pas de suite.

Répondre à willi Annuler la réponse

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