Cluster de Raspberry Pi – Part3

Ajout de nœuds au cluster Docker Swarm

Après la configuration initiale du Docker Manager sur le Raspberry Pi 3 (voir Partie 2), j’ai ajouté deux Raspberry Pi Zero W2 comme nœuds Docker au cluster. Voici les étapes effectuées.


Installation des Raspberry Pi Zero W2 sous DietPi

Pour assurer une légèreté et une efficacité similaires au manager, les Raspberry Pi Zero W2 ont été configurés sous DietPi. Voici les étapes principales :

  1. Création de l’image DietPi : J’ai téléchargé l’image de DietPi depuis le site officiel et l’ai écrite sur une carte SD avec un outil comme Etcher.
  2. Configuration avant le premier démarrage :
    • Modification des fichiers dietpi.txt et dietpi-wifi.txt pour préconfigurer le réseau et les paramètres initiaux.
  3. Installation de Docker : Une fois DietPi installé, Docker a été configuré.
  4. Joindre les nœuds au cluster Docker Swarm : Après l’installation de Docker, chaque Raspberry Pi Zero W2 a été ajouté au cluster avec la commande fournie par le manager :docker swarm join --token <token_provided_by_manager> 192.168.1.69:2377
  5. Vérification : Sur le manager, les nouveaux nœuds apparaissent dans la liste :
    docker node ls

Montage du partage NFS sur les nœuds

Pour permettre un stockage centralisé et accessible par tous les nœuds, le manager partage un répertoire via NFS. Ce partage a été monté sur les deux Raspberry Pi Zero W2.

  1. Installation des outils NFS sur les clients (nœuds) :
    apt-get update && apt-get install -y nfs-common
  2. Montage du partage : Le répertoire partagé était disponible sur le manager à l’adresse /home/share.
    Sur chaque nœud, j’ai monté ce partage dans le même chemin.
    mkdir -p /mnt/share mount -t nfs 192.168.1.69:/home/share /mnt/share
  3. Ajout au fichier /etc/fstab pour que le montage soit persistant au redémarrage :
    192.168.1.69:/home/share /mnt/share nfs defaults 0 0
  4. Vérification du montage :
    df -h
    Les nœuds affichent bien le partage NFS monté.

Ajout des nœuds au cluster

Sur chaque Raspberry Pi Zero W2, j’ai utilisé la commande fournie par le docker swarm init du manager pour les joindre au cluster.

  1. Commande exécutée sur les nœuds :
    docker swarm join --token <token_provided_by_manager> 192.168.1.69:2377
  2. Vérification sur le manager : Depuis le manager, j’ai vérifié l’état des nœuds :
    docker node ls
    Le cluster affiche bien les deux Raspberry Pi Zero W2 comme nœuds actifs.

Mise en mode « drain » du manager

Pour conserver les ressources du manager et lui permettre de gérer le cluster efficacement, j’ai configuré son état en « drain ». Cela empêche tout déploiement de conteneurs sur cette machine.

  1. Changement du mode du manager :
    docker node update --availability drain manager
  2. Vérification :
    docker node ls
    L’état du manager est maintenant affiché comme « Drain ».

Redéploiement du service Nginx

Une fois les nœuds ajoutés, j’ai redéployé le service Nginx en modifiant sa configuration pour éviter de déployer des conteneurs sur le manager. Voici le nouveau fichier docker-compose.yml :

version: "3.9"

services:
  nginx:
    image: nginx:latest
    ports:
      - 80:80  # Mappe le port 80 du conteneur sur le port 80 de l'hôte
    deploy:
      replicas: 1  # Déploie 3 répliques du service pour plus de tolérance aux pannes
      restart_policy:
        condition: none

      placement:
        constraints:
          - node.role == worker  # Déploie uniquement sur les nœuds workers (pas sur le manager)
    volumes:
      - /mnt/share/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro  # Monte le fichier de conf Nginx
      - /mnt/share/nginx/data:/usr/share/nginx/html:ro             # Monte le répertoire des pages HTML
    networks:
      - nginx_network

networks:
  nginx_network:
    driver: overlay  # Utilise un réseau overlay pour permettre la communication inter-nœuds

Le service a été déployé sur les deux nœuds uniquement.


Test du Load Balancer sur les nœuds

J’ai à nouveau exécuté le script Python de la partie 2 pour tester la distribution des requêtes entre les conteneurs. Cette fois-ci, les conteneurs étaient répartis sur les deux Raspberry Pi Zero W2. Le script a confirmé que le round-robin fonctionnait correctement sur les deux machines.


Résultat final

  • Le cluster est maintenant composé d’un manager (Raspberry Pi 3) et de deux nœuds pour le moment (Raspberry Pi Zero W2).
  • Les conteneurs sont déployés uniquement sur les nœuds pour préserver les ressources du manager.
  • Le partage NFS centralise les fichiers Nginx pour tous les nœuds.
  • Docker Swarm gère correctement le Load Balancer entre les conteneurs des deux nœuds.

Avec cette configuration, le cluster n’est pas encore complètement stable. J’ai rencontré un problème de perte du manager lors du déploiement des services, probablement lié à une surcharge. Je vais approfondir l’analyse pour identifier et résoudre ce souci, ce qui fera l’objet d’une partie 4.

A bientôt 😉 !