Déclaration de la stack
Traefik
Modifier le fichier docker-compose.inner.yml pour commencer à y déclarer un service pour Traefik:
version: "3.8"
services:
reverse-proxy:
image: "traefik:v2.9"
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
Dans la liste de command
, on ajoutera --providers.docker.swarmmode=true
car cette instance de Traefik tournera dans le cluster Swarm:
services:
reverse-proxy:
# ...
command:
- "--api.dashboard=true"
- "--providers.docker"
- "--providers.docker.endpoint=unix:///var/run/docker.sock"
- "--providers.docker.exposedbydefault=true"
- "--providers.docker.network=cluster-net"
- "--providers.docker.swarmmode=true"
- "--providers.docker.watch=true"
- "--entrypoints.web=true"
- "--entrypoints.web.address=:80"
On ajoutera les labels pour le dashboard sous la clé deploy
pour Docker Swarm, avec une contrainte de placement du service sur un noeud manager:
services:
reverse-proxy:
# ...
deploy:
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.rule=host(`traefik.cluster.localhost`)"
- "traefik.http.routers.traefik.entrypoints=web"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.services.traefik.loadbalancer.server.port=80"
placement:
constraints:
- "node.role==manager"
Serveurs
On utilisera l'image traefik/whoami pour les conteneurs qui joueront le rôle de l'application. On déclare également les labels sous la clé deploy
en précisant de répliquer le service en 5 conteneurs:
server:
image: "traefik/whoami:v1.8"
deploy:
replicas: 5
labels:
- "traefik.enable=true"
- "traefik.http.routers.server.rule=host(`cluster.localhost`)"
- "traefik.http.routers.server.entrypoints=web"
- "traefik.http.routers.server.service=server"
- "traefik.http.services.server.loadbalancer.server.port=80"
Déploiement
La gestion des services d'un cluster Swarm peut se faire de manière unitaire mais l'utilisation d'un fichier Compose est très pratique et permet d'unifier la configuration entre une version Compose et Swarm.
On va donc déployer la stack depuis le noeud manager avec la commande docker stack deploy
à laquelle on passe l'emplacement du fichier Compose et un nom à donner à la stack:
docker compose exec manager docker stack deploy -c /home/docker-compose.yml local-cluster
[output]Creating network local-cluster_default
[output]Creating service local-cluster_reverse-proxy
[output]Creating service local-cluster_server
Vérifications
Application
L'application devrait être accessible via cluster.localhost et renvoyer une réponse similaire à ceci:
Hostname: 266baeea8ad5
IP: 127.0.0.1
IP: 10.0.1.8
IP: 172.18.0.4
RemoteAddr: 10.0.1.3:44752
GET / HTTP/1.1
Host: cluster.localhost
...
En rafraichissant la page le Hostname
devrait changer.
Dashboard Traefik
Comme pour le reverse proxy du cluster, le dashboard est activé et normalement accessible sur traefik.cluster.localhost.
Les routers devraient tous être en statut "Success".
Répartition
On peut lister les tâches présentes sur chaque noeud du cluster avec la commande docker node ps
.
Ouvrir une session dans le noeud manager:
docker compose exec -it manager sh
Puis exécuter la commande suivant pour lister chaque noeud et leur liste de tâches:
docker node ls -q | xargs -i sh -c 'echo {} && docker node ps {} && printf "\n"'
[output]s18vrn4xgj1c80hibwlt29q4a
[output]ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
[output]bzlagaiyglf4 local-cluster_server.4 traefik/whoami:v1.8 3f393bdd5163 Running Running 14 minutes ago
[output]kupg5nkdai62 local-cluster_server.5 traefik/whoami:v1.8 3f393bdd5163 Running Running 14 minutes ago
[output]
[output]ahyo2afo20s163lnn43wi03mp
[output]ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
[output]ncknud0kizpv local-cluster_server.1 traefik/whoami:v1.8 13e5fe4f8331 Running Running 14 minutes ago
[output]
[output]wnuo2cug48wknwz7ehshqm75l
[output]ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
[output]4yq5q8jzj7ad local-cluster_reverse-proxy.1 traefik:v2.9 50e7db6c3c53 Running Running 14 minutes ago
[output]ypl3l0j1hsdb local-cluster_server.3 traefik/whoami:v1.8 50e7db6c3c53 Running Running 14 minutes ago
[output]
[output]3k6t4djs6xinbkgs9px71xt20
[output]ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
[output]f2ijt6u6try3 local-cluster_server.2 traefik/whoami:v1.8 a8f1d86d0c49 Running Running 14 minutes ago
On peut observer qu'il y a bien 1 instance de Traefik et 5 instances de whoami réparties sur 4 noeuds (1 manager + 3 workers) soit entre 1 et 2 tâches par noeud.
La tâche local-cluster_reverse-proxy.1
s'exécute à partir de l'image traefik:v2.9
, selon la contrainte de placement affectée plus tôt on peut en conclure que le noeud wnuo2cug48wknwz7ehshqm75l
correspond au manager.
The end
Vous pouvez arrêter la stack Compose qui gère le cluster depuis votre machine:
docker compose down