TP Avancé - Déployer dans Swarm
Objectifs
Section titled “Objectifs”Dans ce TP, vous allez :
- Déployer automatiquement 3 serveurs Ubuntu avec Docker via Terraform
- Configurer manuellement un cluster Docker Swarm
- Comprendre l’architecture manager/worker de Swarm
- Déployer un service distribué sur le cluster
Prérequis
Section titled “Prérequis”- Un compte Hetzner Cloud avec un token API (générer ici)
- Une clé SSH ajoutée à votre compte Hetzner Cloud
- Terraform installé sur votre machine (version >= 1.0)
- Connaissances de base en Docker
Partie 1 : Déploiement de l’infrastructure avec Terraform
Section titled “Partie 1 : Déploiement de l’infrastructure avec Terraform”Étape 1 : Configuration
Section titled “Étape 1 : Configuration”Naviguez dans le dossier du projet :
cd swarm_lab_terraformCréez un fichier terraform.tfvars avec la configuration suivante :
hcloud_token = "votre_token_hetzner_cloud"prefix = "votre_prefix_perso"username = "votre_nom_utilisateur"server_type = "cx22"node_count = 3docker_mode = "standard"enable_swarm = falsehcloud_ssh_keys = ["nom-de-votre-cle-ssh"]enable_dns = true
digitalocean_token = ""dns_domain = "dopl.uk"dns_subdomain = "elie"dns_create_wildcard = truePoints importants :
docker_mode = "standard": Installation Docker classique (pas rootless)enable_swarm = false: Pas de configuration automatique de Swarm (nous le ferons manuellement)node_count = 3: Déploiement de 3 serveursenable_dns = true: Configuration DNS (optionnel)- Le formateur va vous fournir une clé hetzner cloud et digitalocean
Étape 2 : Déploiement
Section titled “Étape 2 : Déploiement”Initialisez Terraform :
terraform initVérifiez le plan de déploiement :
terraform planDéverrouilez la clé ssh stagiaire :
ssh-add ~/.ssh/id_stagiaireDéployez l’infrastructure :
terraform applyConfirmez avec yes lorsque demandé.
Étape 3 : Récupération des adresses IP
Section titled “Étape 3 : Récupération des adresses IP”À la fin du déploiement, notez les adresses IP affichées :
Outputs:
server_ips = { "swarm-server-1" = { "ipv4" = "x.x.x.x" "ipv6" = "..." } "swarm-server-2" = { "ipv4" = "y.y.y.y" "ipv6" = "..." } "swarm-server-3" = { "ipv4" = "z.z.z.z" "ipv6" = "..." }}Étape 4 : Vérification
Section titled “Étape 4 : Vérification”Testez la connexion SSH et vérifiez Docker :
# Connexion au premier serveurssh votre_utilisateur@<ip-server-1>
# Vérifier Dockerdocker --versiondocker ps
# DéconnexionexitPartie 2 : Configuration manuelle de Docker Swarm
Section titled “Partie 2 : Configuration manuelle de Docker Swarm”Maintenant que les 3 serveurs sont prêts, vous allez configurer manuellement le cluster Swarm.
Étape 1 : Initialiser le manager
Section titled “Étape 1 : Initialiser le manager”Connectez-vous au premier serveur (qui deviendra le manager) :
ssh votre_utilisateur@<ip-server-1>Initialisez Docker Swarm :
docker swarm init --advertise-addr <ip-server-1>Copiez la commande docker swarm join affichée, vous en aurez besoin pour les workers.
Étape 2 : Vérifier l’état du cluster
Section titled “Étape 2 : Vérifier l’état du cluster”Toujours sur le manager, vérifiez l’état du cluster :
docker node lsVous devriez voir un seul nœud (le manager) avec le statut Leader.
Étape 3 : Ajouter les workers
Section titled “Étape 3 : Ajouter les workers”Ouvrez deux nouveaux terminaux et connectez-vous aux deux autres serveurs :
Terminal 2 - Server 2 :
ssh votre_utilisateur@<ip-server-2>
# Exécutez la commande join copiée précédemmentdocker swarm join --token SWMTKN-1-xxxxx <ip-server-1>:2377Terminal 3 - Server 3 :
ssh votre_utilisateur@<ip-server-3>
# Exécutez la même commande joindocker swarm join --token SWMTKN-1-xxxxx <ip-server-1>:2377Étape 4 : Vérifier le cluster complet
Section titled “Étape 4 : Vérifier le cluster complet”Retournez sur le manager (server-1) et vérifiez que tous les nœuds sont présents :
docker node lsVous devriez voir quelque chose comme :
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSIONabc123 * swarm-server-1 Ready Active Leader 24.x.xdef456 swarm-server-2 Ready Active 24.x.xghi789 swarm-server-3 Ready Active 24.x.xPartie 3 : Test du cluster avec un service
Section titled “Partie 3 : Test du cluster avec un service”Déployer un service Nginx
Section titled “Déployer un service Nginx”Depuis le manager, créez un service distribué :
docker service create \ --name web \ --replicas 3 \ --publish published=8080,target=80 \ nginx:alpineCette commande crée un service avec 3 réplicas (un par nœud).
Vérifier le service
Section titled “Vérifier le service”Lister les services :
docker service lsVoir les détails et la distribution des conteneurs :
docker service ps webVous devriez voir les 3 réplicas distribués sur les différents nœuds.
Tester l’accès
Section titled “Tester l’accès”Depuis votre machine locale, testez l’accès au service :
# Le service est accessible sur n'importe quel nœud du clustercurl http://<ip-server-1>:8080curl http://<ip-server-2>:8080curl http://<ip-server-3>:8080Toutes les requêtes devraient retourner la page d’accueil Nginx.
Scaler le service
Section titled “Scaler le service”Augmentez le nombre de réplicas :
docker service scale web=6Vérifiez la nouvelle distribution :
docker service ps webNettoyer
Section titled “Nettoyer”Supprimez le service :
docker service rm webPartie 4 : Exploration avancée (optionnel)
Section titled “Partie 4 : Exploration avancée (optionnel)”Promouvoir un worker en manager
Section titled “Promouvoir un worker en manager”Pour la haute disponibilité, il est recommandé d’avoir plusieurs managers (nombre impair : 3, 5, 7).
Depuis le manager actuel :
# Promouvoir server-2 en managerdocker node promote swarm-server-2Vérifiez :
docker node lsDrainer un nœud
Section titled “Drainer un nœud”Pour effectuer une maintenance sur un nœud sans impacter les services :
# Marquer le nœud comme indisponibledocker node update --availability drain swarm-server-3
# Vérifier que les conteneurs ont migrédocker service ps web
# Remettre le nœud en servicedocker node update --availability active swarm-server-3Labels et contraintes
Section titled “Labels et contraintes”Ajouter un label à un nœud :
docker node update --label-add environment=production swarm-server-1Déployer un service uniquement sur les nœuds de production :
docker service create \ --name prod-app \ --constraint 'node.labels.environment==production' \ nginx:alpineNettoyage
Section titled “Nettoyage”Une fois le TP terminé, vous pouvez détruire l’infrastructure :
cd swarm_lab_terraformterraform destroyConfirmez avec yes. Tous les serveurs seront supprimés de Hetzner Cloud.
Récapitulatif
Section titled “Récapitulatif”Dans ce TP, vous avez appris à :
✅ Déployer une infrastructure cloud avec Terraform ✅ Initialiser un cluster Docker Swarm manuellement ✅ Comprendre les rôles manager et worker ✅ Déployer et scaler des services distribués ✅ Utiliser l’ingress network pour le load balancing ✅ Gérer les nœuds (promotion, drain, labels)
Pour aller plus loin
Section titled “Pour aller plus loin”- Déployer une application multi-services avec un fichier stack
- Configurer un reverse proxy Traefik sur le cluster
- Mettre en place des secrets et configs Swarm
- Expérimenter avec les stratégies de déploiement (rolling update, rollback)