Docker et Keepalived

📝 Introduction

Une architecture informatique est hautement disponible lorsqu'elle est conçue pour répondre à deux enjeux majeurs :

  1. Tolérance aux pannes : Assurer la continuité des services en cas de défaillance d’un ou plusieurs composants (matériels ou logiciels).

  2. Gestion des charges : Supporter un grand nombre de requêtes sans interruption.

Dans ce guide, nous explorons la mise en place d'une solution de haute disponibilité au niveau des services réseau à l'aide de Docker Swarm et Keepalived. Vous apprendrez à configurer un cluster Swarm et à gérer une adresse IP flottante avec Keepalived, garantissant une redondance efficace.


🚀 Pré-requis

Avant de commencer, assurez-vous d’avoir :

  • Trois machines virtuelles ou serveurs physiques configurés avec des adresses IP statiques.

  • Docker installé sur chaque nœud.

  • VMware comme driver pour Docker Machine.

Configuration des nœuds Docker

Exemple de commandes pour créer vos trois nœuds avec Docker Machine et VMware :

docker-machine create --driver vmware node1
docker-machine create --driver vmware node2
docker-machine create --driver vmware node3

Pour vérifier les machines créées :

docker-machine ls

Sortie attendue :

NAME    ACTIVE   DRIVER   STATE     URL                          SWARM   DOCKER      ERRORS
node1   -        vmware   Running   tcp://192.168.253.145:2376           v19.03.12
node2   -        vmware   Running   tcp://192.168.253.146:2376           v19.03.12
node3   -        vmware   Running   tcp://192.168.253.147:2376           v19.03.12

📡 Initialisation du cluster Docker Swarm

🖥️ Connexion au nœud manager

Le cluster Docker Swarm est initialisé depuis le nœud manager. Connectez-vous à node1 :

docker-machine ssh node1

🚀 Initialisation du Swarm

Sur node1, exécutez la commande suivante pour initialiser le Swarm. L’adresse utilisée doit être celle de node1 sur le réseau (vous pouvez la vérifier avec docker-machine ip node1) :

docker swarm init --advertise-addr 192.168.253.145
  • Explication :

    • --advertise-addr : Spécifie l’adresse IP utilisée pour communiquer avec les autres nœuds.

Résultat attendu :

Swarm initialized: current node (cu3vdhdtysaqzjuf20twcfhlv) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-58j0mfkvy70snrne6o5rqp6eldfxfijw4tpxljn2f01o4iy043-3sw50hj1qo06mjjuuw7g8pg8l 192.168.253.145:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

➕ Ajout des nœuds workers

🔗 Récupération du token

Le Swarm génère un token permettant aux autres nœuds de rejoindre le cluster. Pour l’obtenir, exécutez sur node1 :

docker swarm join-token worker

Cette commande affiche une autre commande à exécuter sur les workers (node2 et node3).

🤝 Connexion des workers

Sur chaque worker, connectez-vous et exécutez la commande donnée par docker swarm join-token :

Sur node2 :

docker-machine ssh node2
docker swarm join --token SWMTKN-1-58j0mfkvy70snrne6o5rqp6eldfxfijw4tpxljn2f01o4iy043-3sw50hj1qo06mjjuuw7g8pg8l 192.168.253.145:2377

Sur node3 :

docker-machine ssh node3
docker swarm join --token SWMTKN-1-58j0mfkvy70snrne6o5rqp6eldfxfijw4tpxljn2f01o4iy043-3sw50hj1qo06mjjuuw7g8pg8l 192.168.253.145:2377

✅ Vérification du cluster

Revenez sur node1 et exécutez la commande suivante pour vérifier l'état des nœuds du cluster :

docker node ls

Sortie attendue :

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
zkhmae4w3jaefwvyz49nzgyj1 *   node1               Ready               Active              Leader              19.03.12
u1f30td61v99tlnecl1ntw7wz     node2               Ready               Active                                  19.03.12
u8rs95rby94dhccknyfbbqpxl     node3               Ready               Active                                  19.03.12

🛠️ Déploiement et gestion des services

🌐 Déploiement d’un service Nginx

Pour déployer un service Nginx avec 2 réplicas, exécutez sur node1 :

docker service create --name mon-nginx --replicas 3 -p 80:80 nginx

🔄 Configuration de Keepalived

Installation et exécution de Keepalived sur chaque nœud : Lancez un conteneur Keepalived sur chacun des nœuds en utilisant les adresses IP de vos nœuds et une adresse IP virtuelle (VIP) pour la redondance.

docker run -d --name keepalived --restart=always \
  --cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW \
  --net=host \
  -e KEEPALIVED_UNICAST_PEERS="#PYTHON2BASH:['192.168.253.145', '192.168.253.146', '192.168.253.147']" \
  -e KEEPALIVED_VIRTUAL_IPS=192.168.253.222 \
  -e KEEPALIVED_PRIORITY=100 \
  osixia/keepalived:2.0.20

🚦 Tester la haute disponibilité

  1. Simulation de panne d’un nœud : Arrêtez le deuxième nœud (node2) :

    docker-machine stop node2

    Vérifiez que le service est toujours accessible via l’adresse VIP.

  2. Simulation de panne de plusieurs nœuds : Arrêtez le troisième nœud (node3) :

    docker-machine stop node3

    Testez de nouveau l’accessibilité du service via l’adresse VIP.


🏁 Conclusion

En combinant Docker Swarm et Keepalived :

  • Vous garantissez une disponibilité réseau grâce à l’IP flottante gérée par Keepalived.

  • Vous assurez une haute disponibilité applicative avec le clustering de conteneurs Docker.

Ces deux niveaux de redondance permettent de minimiser les interruptions et d’optimiser la gestion des charges.

Last updated