Ultra HA Docker Swarm
Dans cet article, nous allons explorer la mise en place d’une infrastructure Docker Swarm avec une ultra haute disponibilité (HA). L’objectif est de configurer un cluster capable de résister aux pannes matérielles ou logicielles tout en garantissant une continuité de service pour vos applications conteneurisées. Vous découvrirez les meilleures pratiques pour maximiser la résilience, répartir intelligemment les charges et renforcer la redondance de vos nœuds Docker Swarm.
I. Description
On va créer un stack nginx et un stack traefik et les déployer sur nos 3 noeuds afin d’avoir de la redondance sur notre service et ne pas avoir d’interruption de service en cas de panne d’un noeud.
Voici le schèma représentant l’architecture de notre cluster Docker Swarm :
II. Création du stack traefik
1. Créer un fichier stack.yaml dans un dossier traefik
mkdir traefik
mkdir traefik/traefik.yaml
Coller la configuration suivante dans le fichier :
version: '3.7'
services:
traefik:
image: traefik:v2.10
command:
- --api.insecure=true
- --providers.docker
- --entrypoints.web.address=:80
ports:
- "80:80" # HTTP
- "8080:8080" # Tableau de bord de Traefik
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
placement:
constraints:
- node.role == manager
III. Création du stack nginx
1. Créer un fichier stack.yaml dans un dossier nginx
mkdir nginx
mkdir nginx/nginx.yaml
2. Coller la configuration suivante dans le fichier :
version: '3.7'
services:
nginx:
image: nginx
ports:
- "8081:80" # Optionnel : expose localement si besoin d'accès direct au service
deploy:
replicas: 3 # Nombre d'instances de Nginx dans le cluster
labels:
- "traefik.enable=true" # Activer la gestion par Traefik
- "traefik.http.routers.nginx.rule=Host(`traefik.alliance.local`)" # Traefik route le trafic basé sur le domaine
- "traefik.http.services.nginx.loadbalancer.server.port=80" # Port exposé par le service Nginx
- "traefik.http.routers.nginx.entrypoints=web" # Utiliser l'entrypoint web (port 80)
- "traefik.docker.network=traefik-net" # Réseau Docker que Traefik utilise
networks:
- traefik-net # Réseau partagé avec Traefik
networks:
traefik-net:
external: true # Assure que ce réseau existe déjà, créé avec le service Traefik
3. Créer l’adaptateur réseau traefik :
docker network create --driver=overlay traefik-net
4. Lancer les stacks en vous plaçant dans les dossiers contenant les fichiers yaml :
docker stack deploy -c /nginx/stack.yaml nginx
docker stack deploy -c /trafik/stack.yaml traefik
5. Les applications sont accéssibles aux adresses suivantes :
traefik → http://adresseip:8080
nginx → http://adresseip:8081
IV. Test de redondance
Pour tester la continuité de service, nous allons couper les noeuds un à un afin de voir comment se comporte notre application nginx hebergée sur le port 8081.
Traefik fait déjà en sorte que l’adresse de référence pour notre application est celle du nœud manager (docker-1). Donc en théorie, si on coupe n’importe quel des 3 nœuds, le serveur web sera toujours accessible à l’adresse du manager, exemple :
Docker1 (manager) → 129.2.29.1
Docker2 (worker) → 129.2.29.2
Docker3 (worker) → 129.2.29.3
Même en coupant deux des noeuds, l’application reste dispoible à l’adresse du manager, même si on coupe le manager un des worker prendra la relève.
V. Test d'upgrade
Nous allons passer à 5 répliques pour le conteneurs nginx, pour ceci il faut lancer la commande suivante :
docker service update --replicas=5 nginx_nginx
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service nginx_nginx converged
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
14k4d0c3fytm nginx_nginx replicated 5/5 nginx:latest *:8081->80/tcp
VI. Test de downgrade
Nous allons repasser à 3 répliques pour le conteneurs nginx, pour ceci il faut lancer la commande suivante :
docker service update --replicas=3 nginx_nginx
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
14k4d0c3fytm nginx_nginx replicated 3/3 nginx:latest *:8081->80/tcp