Aller au contenu principal

Installation et création du cluster


Objectifs du chapitre

  • Initialiser un cluster Swarm
  • Ajouter des nœuds managers et workers
  • Gérer les nœuds du cluster
  • Configurer Docker Desktop pour Swarm

1 - Prérequis

Configuration requise

ÉlémentMinimumRecommandé
Docker Engine1.12+Latest stable
RAM par nœud2 Go4 Go+
CPU par nœud1 core2+ cores
Réseau100 Mbps1 Gbps

Ports à ouvrir

# Sur tous les nœuds du cluster
# TCP 2377 : Management du cluster
# TCP/UDP 7946 : Communication entre nœuds
# UDP 4789 : Overlay network

# Avec UFW (Ubuntu)
sudo ufw allow 2377/tcp
sudo ufw allow 7946/tcp
sudo ufw allow 7946/udp
sudo ufw allow 4789/udp

# Avec firewalld (CentOS/RHEL)
sudo firewall-cmd --permanent --add-port=2377/tcp
sudo firewall-cmd --permanent --add-port=7946/tcp
sudo firewall-cmd --permanent --add-port=7946/udp
sudo firewall-cmd --permanent --add-port=4789/udp
sudo firewall-cmd --reload

Vérifier Docker

# Vérifier l'installation Docker
docker --version
docker info

# Vérifier que le mode Swarm est disponible
docker swarm --help

2 - Initialiser le cluster

Sur le premier manager

# Initialisation simple
docker swarm init

# Avec une IP spécifique (recommandé)
docker swarm init --advertise-addr 192.168.1.10

# Avec un port personnalisé
docker swarm init --advertise-addr 192.168.1.10:2377

Sortie de l'initialisation

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

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

docker swarm join --token SWMTKN-1-xxx-yyy 192.168.1.10:2377

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

Vérifier l'état

# État du Swarm
docker info | grep -A 10 Swarm

# Lister les nœuds
docker node ls

# Résultat
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
abc123def456 * manager1 Ready Active Leader

3 - Ajouter des nœuds

Récupérer les tokens

# Token pour ajouter un worker
docker swarm join-token worker

# Token pour ajouter un manager
docker swarm join-token manager

# Afficher uniquement le token (pour scripts)
docker swarm join-token -q worker
docker swarm join-token -q manager

Ajouter un worker

Sur le serveur worker :

# Rejoindre comme worker
docker swarm join --token SWMTKN-1-xxx-worker 192.168.1.10:2377

# Résultat
This node joined a swarm as a worker.

Ajouter un manager

Sur le serveur manager :

# Rejoindre comme manager
docker swarm join --token SWMTKN-1-xxx-manager 192.168.1.10:2377

# Résultat
This node joined a swarm as a manager.

Vérifier le cluster

# Sur un manager
docker node ls

# Résultat
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
abc123def456 * manager1 Ready Active Leader
ghi789jkl012 manager2 Ready Active Reachable
mno345pqr678 manager3 Ready Active Reachable
stu901vwx234 worker1 Ready Active
yza567bcd890 worker2 Ready Active

4 - Gestion des nœuds

Promouvoir un worker en manager

# Promouvoir
docker node promote worker1

# Équivalent
docker node update --role manager worker1

Rétrograder un manager en worker

# Rétrograder
docker node demote manager3

# Équivalent
docker node update --role worker manager3

Mettre un nœud en maintenance

# Drainer un nœud (les tâches sont déplacées)
docker node update --availability drain worker1

# Mettre en pause (pas de nouvelles tâches)
docker node update --availability pause worker1

# Réactiver
docker node update --availability active worker1

Supprimer un nœud

# Sur le nœud à supprimer
docker swarm leave

# Forcer (si manager ou si problème)
docker swarm leave --force

# Sur un manager : supprimer le nœud de la liste
docker node rm worker1

# Forcer la suppression
docker node rm --force worker1

Inspecter un nœud

# Informations détaillées
docker node inspect worker1

# Format spécifique
docker node inspect --format '{{.Status.Addr}}' worker1
docker node inspect --format '{{.Spec.Role}}' worker1

5 - Labels sur les nœuds

Ajouter des labels

# Ajouter un label
docker node update --label-add env=production worker1
docker node update --label-add zone=eu-west-1 worker1
docker node update --label-add type=gpu worker2

# Plusieurs labels
docker node update \
--label-add env=production \
--label-add tier=frontend \
worker1

Voir les labels

# Voir les labels d'un nœud
docker node inspect --format '{{.Spec.Labels}}' worker1

# Format plus lisible
docker node inspect worker1 --format '{{json .Spec.Labels}}' | jq

Utiliser les labels pour le placement

# Déployer uniquement sur les nœuds de production
docker service create \
--name web \
--constraint 'node.labels.env==production' \
nginx

# Déployer sur les nœuds GPU
docker service create \
--name ml-model \
--constraint 'node.labels.type==gpu' \
tensorflow/tensorflow

6 - Sécurité du cluster

Rotation des tokens

# Changer le token worker
docker swarm join-token --rotate worker

# Changer le token manager
docker swarm join-token --rotate manager

Rotation des certificats

# Forcer la rotation des certificats
docker swarm ca --rotate

# Définir la période de rotation (90 jours par défaut)
docker swarm update --cert-expiry 720h

Verrouiller le cluster (autolock)

# Activer l'autolock
docker swarm update --autolock=true

# Sauvegarder la clé de déverrouillage !
# To unlock a swarm manager after it restarts, run:
# docker swarm unlock

# Déverrouiller après un redémarrage
docker swarm unlock

# Voir la clé actuelle
docker swarm unlock-key

# Changer la clé
docker swarm unlock-key --rotate

7 - Configuration avec Docker Desktop

Windows/macOS

Docker Desktop inclut un Swarm single-node :

# Initialiser Swarm (single-node)
docker swarm init

# C'est tout ! Vous pouvez utiliser les services
docker service create --name web -p 80:80 nginx

Swarm multi-nœuds avec Docker Machine (legacy)

# Créer des machines virtuelles
docker-machine create manager1
docker-machine create worker1
docker-machine create worker2

# Se connecter au manager
eval $(docker-machine env manager1)

# Initialiser le swarm
docker swarm init --advertise-addr $(docker-machine ip manager1)

Alternative : Multipass ou Vagrant

# Avec Multipass (Ubuntu)
multipass launch --name manager1
multipass launch --name worker1
multipass launch --name worker2

# Installer Docker sur chaque VM
multipass exec manager1 -- bash -c "curl -fsSL https://get.docker.com | sh"

8 - Play with Docker (apprentissage)

Environnement gratuit en ligne

Visitez labs.play-with-docker.com pour un environnement Swarm gratuit :

# Créer 3 instances (bouton "Add new instance")
# Sur la première instance :
docker swarm init --advertise-addr eth0

# Copier la commande join et l'exécuter sur les autres instances

9 - Haute disponibilité des managers

Architecture recommandée

                    Production Setup
┌────────────────────────────────────────────────────┐
│ │
│ Manager 1 Manager 2 Manager 3 │
│ (Leader) (Reachable) (Reachable) │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ Raft │◄───────▶│ Raft │◄───────▶│ Raft │ │
│ └──────┘ └──────┘ └──────┘ │
│ │
│ Zone A Zone B Zone C │
│ │
├────────────────────────────────────────────────────┤
│ │
│ Worker 1 Worker 2 Worker 3 Worker N │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ │ │ │ │ │ │ │ │
│ └──────┘ └──────┘ └──────┘ └──────┘ │
│ │
└────────────────────────────────────────────────────┘

Répartition géographique

# Manager 1 - Zone A
docker node update --label-add zone=a manager1

# Manager 2 - Zone B
docker node update --label-add zone=b manager2

# Manager 3 - Zone C
docker node update --label-add zone=c manager3

Récupération après perte de quorum

# Si vous perdez le quorum (plus de la moitié des managers)
# Sur un manager survivant :
docker swarm init --force-new-cluster --advertise-addr <IP>

# Attention : cela crée un nouveau cluster avec ce seul manager
# Vous devrez ré-ajouter les autres managers

10 - Commandes de diagnostic

État du cluster

# Vue d'ensemble
docker info

# Nœuds
docker node ls

# Services
docker service ls

# Stacks
docker stack ls

Logs système

# Logs du daemon Docker (Linux)
sudo journalctl -u docker.service -f

# Événements Swarm
docker events --filter type=node
docker events --filter type=service

Résumé des commandes

CommandeDescription
docker swarm initInitialiser un cluster
docker swarm joinRejoindre un cluster
docker swarm leaveQuitter le cluster
docker swarm join-tokenAfficher les tokens
docker node lsLister les nœuds
docker node promotePromouvoir en manager
docker node demoteRétrograder en worker
docker node updateModifier un nœud
docker node rmSupprimer un nœud
Points clés
  • docker swarm init crée le cluster et le premier manager
  • Les tokens permettent de rejoindre comme worker ou manager
  • Utilisez 3 ou 5 managers pour la haute disponibilité
  • Les labels permettent de cibler le placement des services

Exercices pratiques

  1. Initialisez un cluster Swarm sur votre machine
  2. Créez un cluster multi-nœuds avec Play with Docker
  3. Ajoutez des labels à vos nœuds
  4. Testez la promotion/rétrogradation d'un nœud

← Introduction | Services et Tasks →