25/12/2022

3. Déploiement

Lu 306 fois Licence Creative Commons

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