Mise à jour automatiques des services Docker Swarm avec Shepherd

Il peut s’avérer utile pour certains services de reposer sur une image « up to date ». Pour cela, nous allons mettre en place le service Shepherd qui va automatiser ce processus de mise à jour.

Pour son fonctionnement, Shepherd utilise un certain nombre de variables d’environnement:

– SLEEP_TIME: par défaut, Shepherd recherche les mises à jour d’image toutes les 5 minutes. C’est un rythme un peu élevé à mon gout et je vais adopter une mise à jour toutes les heures en définissant la variable à « 60m »

– BLACKLIST_SERVICES: Shepherd ne fera pas la mise à jour des services définis dans cette variable d’environnement. Par exemple, la mise à jour de Plex en plein visionnage d’un film peut-être énervante. Pour l’instant, je vais black-lister le service « shepherd »

– IMAGE_AUTOCLEAN_LIMIT: Shepherd procèdera au nettoyage des anciennes images qui peuvent représenter une taille non négligeable. Je vais fixer la limite à « 5 »

– APPRISE_SIDECAR_URL: active un système de notifications lors de la mise à jour de services. Ce système de notification utilise le microservice « apprise ».

Nous allons maintenant ouvrir un terminal sur le manager de notre Docker Swarm et créer le service:

sudo docker service create --name shepherd \
                    --constraint "node.role==manager" \
                    --env SLEEP_TIME="60m" \
                    --env BLACKLIST_SERVICES="shepherd" \
                    --env WITH_REGISTRY_AUTH="true" \
                    --env WITH_INSECURE_REGISTRY="true" \
                    --env WITH_NO_RESOLVE_IMAGE="true" \
                    --env APPRISE_SIDECAR_URL="apprise-microservice:5000" \
                    --env IMAGE_AUTOCLEAN_LIMIT="5" \
                    --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock,ro \
                    mazzolino/shepherd

Installation de Swarmpit pour gérer facilement un cluster Docker Swarm

Swarmpit (à ne pas confondre avec Brad Pitt …) est une interface Web légère et relativement intuitive permettant de gérer un cluster Docker Swarm.

L’installation de Swarmpit est relativement simple: on va se connecter sur le manager de notre cluster Docker Swarm et nous allons exécuter la commande ci-dessous:

sudo docker run -it --rm \
--name swarmpit-installer \
--volume /var/run/docker.sock:/var/run/docker.sock \
swarmpit/install:1.9
Installation de Swarmpit

Nous pouvons maintenant nous connecter sur le tableau de bord Swarmpit via l’URL suivante:

http://managercentos8:888
Tableau de bord Swarmpit

Déploiement d’un service

Nous allons déployer un service tout simple qui va nous permettre de vérifier que notre Swarm fonctionne correctement.

Dans le menu « Services », nous allons donc cliquer sur « New service »:

Création d’un premier service

Ensuite, nous allons rechercher l’image « topmonks/docker-napp » dans le « repository » public:

Installation service docker-napp

Sur la page suivante, nous allons définir quelle version de l’image utiliser. La dernière version semble la plus indiquer. Nous allons donc choisir « latest ».

Pour le nom du service, vous avez la possibilité de ne pas le renseigner et un nom aléatoire sera attribué au service. Pour ma part, je préfère le renseigner avec un nom intelligible.

Nous allons ensuite choisir le mode de déploiement:
– « global »: un service va être mis en place sur chaque noeud du cluster
– « replicated » : permet d’obtenir plusieurs instances d’un même service sur un même noeud

Configuration du service docker-napp

L’étape suivante va consister à définir les paramètres réseau de notre service: nous allons exporter le port 8080 de notre container au travers du port 9001:

Configuration réseau pour le service docker-napp

On peut ensuite configurer divers éléments très importants mais qui ne sont d’aucun intérêt pour ce container:
– des variables d’environnement
– des points de montage
– des configurations
– des secrets

Configuration des variables et des points de montage pour le service docker-napp

Nous allons ensuite définir les ressources processeur et mémoire nécessaires à l’exécution du service. Dans notre cas, nous allons tout laisser par défaut:

Définition des ressources pour le service docker-napp

La page suivante va nous permettre d’ajouter des « labels » à notre service et surtout de définir la stratégie de déploiement.

Dans mon cas, j’ai choisir de déployer le service uniquement sur des noeuds de type « worker ». Cela se traduit donc par la contrainte : « node.role == worker ».

Définition de l’emplacement du service docker-napp

Enfin, nous allons définir la méthode de log du service en laissant les paramètres par défaut:

Définition de la log du service docker-napp

Le service va alors se déployer sur les 2 noeuds.

Nous allons maintenant tester la distribution des requêtes au sein de notre cluster en appelant plusieurs fois le service (192.168.0.105 est l’adresse IP du manager :

curl http://192.168.0.105:9001

On voit bien ci-dessous que les appels du service sont traités indifféremment par les 2 noeuds du cluster. Well done!

Test de l’équilibrage de charge