Aller au contenu

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 :
Capture decran 2024 10 08 144054

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

2d1695a0 759a 487f b6ac cca447fa264b
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.
36c6e0ca f9f6 414e 8d52 9407c3c6cd90

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