Lab 12.1 : Déployer une stack¶
| Durée | 75 min |
| Niveau | Semi-guidé |
| Prérequis | Lab 11.2 : Déployer et mettre à l'échelle des services (cluster de trois nœuds, image <utilisateur>/qui-repond:1.0 publiée sur Docker Hub), cours du chapitre 12 |
| Acquis visés | AA8 |
Objectifs
- Écrire un fichier de stack avec une section
deploy - Fournir un fichier de configuration à un service avec une config Swarm
- Déployer, observer et mettre à jour une stack avec
docker stack - Vérifier la résolution des noms sur un réseau overlay
- Contraindre le placement des tâches
- Comprendre que le fichier est la référence de l'état désiré
Contexte et schéma¶
Vous déployez sur le cluster une application en deux niveaux : un proxy nginx qui reçoit les requêtes et les transmet à l'application qui-repond du Lab 11.2, répliquée sur plusieurs nœuds. Le proxy reçoit sa configuration sous forme de config Swarm. Toutes les commandes s'exécutent sur swarm-manager. Dans ce lab, seules les commandes clés vous sont données : à vous de les adapter et de déduire le reste à l'aide du cours.
flowchart LR
C["Client<br/>port 8080 de n'importe quel nœud"] --> P["tp_proxy<br/>2 répliques"]
subgraph R["Réseau overlay de la stack"]
P -- "http://app:5000" --> A["tp_app<br/>3 répliques"]
end
CF["Config proxy_conf<br/>default.conf"] -. "montée dans le proxy" .-> P
Organisation du travail
Ouvrez trois terminaux (un par VM) comme aux labs précédents. Les tests curl se font depuis une VM Linux, avec l'adresse IP d'un nœud.
Étapes¶
Étape 1 : Préparer le dossier et vérifier le cluster¶
- Objectif : partir d'un cluster sain, avec l'image accessible.
- Indices :
docker node ls: trois nœudsReadyetActive;docker service ls: aucun service restant des labs précédents (supprimez-les sinon).- Vérifiez que l'image
<utilisateur>/qui-repond:1.0est bien disponible sur Docker Hub (dépôt public). - Créez un dossier
tp-stacksurswarm-manageret placez-vous dedans. - Créez dans ce dossier le fichier
default.confsuivant, qui configure le proxy :
Le nom app
Le proxy joint l'application par le nom de service app, grâce au DNS du réseau overlay. Vous nommerez le service app dans votre fichier de stack.
Point de contrôle
- Le cluster est sain et sans service
-
default.confexiste danstp-stack
Étape 2 : Créer la config Swarm¶
- Objectif : stocker
default.confdans le cluster. - Indices :
docker config create proxy_conf default.conf, puisdocker config ls.docker config inspect --pretty proxy_conf: repérez ce qui est affiché.- Essayez de la modifier : quelle commande permettrait de changer sa valeur ? (voir la section 4 du cours)
Point de contrôle
-
docker config lsafficheproxy_conf - Vous savez expliquer pourquoi une config ne se modifie pas
Étape 3 : Écrire le fichier de stack¶
- Objectif : décrire l'application dans
compose.yaml. - Indices : écrivez le fichier d'après le cahier des charges ci-dessous, en vous aidant des sections 3.4, 3.5 et 4.2 du cours.
| Service | Image | Contraintes |
|---|---|---|
proxy |
nginx:1.27-alpine |
2 répliques ; port 8080 de l'hôte vers le port 80 ; la config proxy_conf (déclarée external: true) montée sur /etc/nginx/conf.d/default.conf |
app |
<utilisateur>/qui-repond:1.0 |
3 répliques ; aucun port publié ; limites de 0,5 processeur et 128 Mo de mémoire ; redémarrage uniquement en cas d'échec |
- Les deux services partagent le réseau créé par défaut pour la stack (pas besoin de le déclarer).
- Remplacez
<utilisateur>par votre nom d'utilisateur Docker Hub : le fichier ne doit contenir aucun mot de passe. - Validez la syntaxe avec
docker compose -f compose.yaml config.
Point de contrôle
-
docker compose -f compose.yaml configs'exécute sans erreur - Seul
proxypublie un port - Chaque service a une section
deployconforme au tableau
Étape 4 : Déployer la stack¶
- Objectif : créer tous les services en une commande.
- Indices :
docker stack deploy -c compose.yaml tp: lisez les messages affichés (objets créés, avertissements éventuels).- Observez :
docker stack ls,docker stack services tp,docker stack ps tp. - Relevez les noms des services et du réseau (
docker network ls), puis comparez avec la section 3.2 du cours.
Point de contrôle
-
docker stack services tpaffichetp_proxy(2/2) ettp_app(3/3) - Le réseau de la stack existe, avec le pilote
overlay - Vous avez relevé la répartition des tâches sur les nœuds
Étape 5 : Tester l'application¶
- Objectif : vérifier la chaîne complète : client, proxy, application.
- Indices :
- Envoyez 12 requêtes à l'adresse du manager, puis d'un worker, et comptez les réponses par conteneur :
- Consultez les journaux du proxy : `docker service logs tp_proxy`, puis ceux de l'application.
Point de contrôle
- Chaque requête reçoit une réponse
Réponse du conteneur ... - Les réponses viennent de plusieurs conteneurs de l'application
- Les journaux du proxy montrent les requêtes transmises
Étape 6 : Examiner la résolution des noms sur le réseau overlay¶
- Objectif : voir comment le proxy trouve l'application.
- Indices :
- Sur un nœud qui héberge une tâche du proxy (
docker service ps tp_proxy), repérez son conteneur (docker ps). - Depuis ce conteneur, résolvez les noms
apppuistasks.app:
- Sur un nœud qui héberge une tâche du proxy (
- Comparez le nombre d'adresses obtenues dans chaque cas.
Point de contrôle
-
appest résolu vers une adresse (adresse virtuelle du service) -
tasks.appest résolu vers les adresses des tâches (trois adresses) - Vous savez expliquer l'intérêt de l'adresse virtuelle pour le proxy
Étape 7 : Mettre à jour la stack depuis le fichier¶
- Objectif : constater que le fichier est la référence.
- Indices :
- Dans
compose.yaml, passez les répliques deappà 5 et relancez la même commandedocker stack deploy. Observez les services recréés ou mis à jour. - Réduisez ensuite les répliques à 2 avec la commande
docker service scale tp_app=2, puis relancezdocker stack deploy -c compose.yaml tpsans modifier le fichier : combien de répliques deappobtenez-vous ?
- Dans
Point de contrôle
- Après la modification du fichier,
tp_apppasse à5/5sans quetp_proxysoit recréé - Après
docker service scalepuis un nouveau déploiement,tp_apprevient au nombre de répliques du fichier - Vous pouvez expliquer pourquoi il vaut mieux modifier le fichier que les services
Étape 8 : Contraindre le placement¶
- Objectif : exécuter le proxy uniquement sur les workers.
- Indices :
- Dans le fichier, ajoutez au service
proxyune contrainte de placement sur le rôle des nœuds (section 5 du cours) et redéployez. - Vérifiez avec
docker service ps tp_proxyqu'aucune tâche ne tourne sur le manager. - Testez que l'application répond toujours sur l'adresse du manager (routing mesh).
- Dans le fichier, ajoutez au service
Point de contrôle
- Aucune tâche de
tp_proxyne s'exécute sur le manager - Le manager répond toujours sur le port 8080
- Vous savez expliquer pourquoi, malgré l'absence de tâche, le manager répond
Étape 9 : Supprimer la stack¶
- Objectif : nettoyer proprement.
- Indices :
docker stack rm tp, puisdocker stack ls,docker service lsetdocker network ls.- Que devient la config
proxy_conf? Vérifiez avecdocker config ls.
Point de contrôle
- Les services et le réseau de la stack ont disparu
- La config
proxy_confexiste toujours : vous savez expliquer pourquoi
Étape 10 : Dresser la fiche de la stack¶
- Objectif : retenir le rôle des clés du fichier.
- Indices : complétez le tableau avec le rôle de chaque élément de votre fichier.
| Élément du fichier | Rôle |
|---|---|
deploy.replicas |
|
deploy.resources.limits |
|
deploy.restart_policy |
|
deploy.placement.constraints |
|
configs |
|
ports |
Point de contrôle
- Chaque ligne est complétée à partir de votre propre fichier
Questions de réflexion¶
Pourquoi le proxy peut-il joindre l'application par le nom app alors que les tâches sont sur des nœuds différents ?
Les deux services sont sur un réseau overlay qui s'étend sur les nœuds, avec un DNS intégré : le nom app est résolu vers une adresse virtuelle qui répartit les connexions entre les tâches, où qu'elles soient.
Quel avantage a l'adresse virtuelle par rapport aux adresses des tâches ?
Le proxy n'a pas à connaître le nombre ni l'emplacement des tâches : l'adresse virtuelle reste stable quand les tâches sont recréées ou déplacées, et Swarm répartit les connexions entre elles.
Pourquoi la stack ignore-t-elle build et ne peut-elle utiliser qu'une image publiée ?
Chaque nœud télécharge lui-même l'image qu'il doit exécuter : il faut un registre accessible par tous les nœuds.
Que se passe-t-il si vous changez le nombre de répliques avec docker service scale puis redéployez la stack ?
Le déploiement ramène le service à l'état décrit par le fichier : le fichier est la référence. C'est pourquoi on modifie le fichier, qui est versionné, plutôt que les services un à un.
Dépannage¶
| Symptôme | Pistes |
|---|---|
Message Ignoring unsupported options |
Une clé de Compose non gérée par les stacks (build, depends_on, restart…) : retirez-la ou remplacez-la par son équivalent deploy |
config proxy_conf not found |
La config n'a pas été créée avant le déploiement, ou son nom diffère dans le fichier |
tp_app reste à 0/3 |
docker stack ps tp --no-trunc : image introuvable (nom ou dépôt privé) ou nœud sans accès à Internet |
502 Bad Gateway depuis le proxy |
L'application n'est pas encore prête, ou le nom de service dans default.conf ne correspond pas : vérifiez app |
curl ne répond pas |
Port 8080 déjà utilisé, tâches du proxy non démarrées, ou ports du cluster bloqués entre nœuds |
nslookup introuvable dans le conteneur |
Outil absent de l'image : essayez getent hosts app ou un conteneur de diagnostic sur le même réseau |
docker stack deploy refuse le fichier |
Erreur d'indentation ou clé inconnue : validez avec docker compose -f compose.yaml config |
docker stack rm laisse le réseau |
Il disparaît après l'arrêt des dernières tâches : patientez quelques secondes |
Nettoyage et reprise¶
La stack a été supprimée à l'étape 9. Conservez le cluster, le fichier compose.yaml et default.conf : le Lab 12.2 les réutilise. La config proxy_conf peut rester ; supprimez-la avec docker config rm proxy_conf si vous n'en avez plus besoin.
Retour au chapitre¶
Chapitre 12 : Swarm : stacks et exploitation · Lab suivant : Lab 12.2 : Mises à jour, secrets et panne d'un nœud