Objectif

Dans cet exercice nous allons voir comment faire le backup et la restauration d’un cluster Swarm

Quelques rappels

Comme nous l’avons vu, les nodes de type Manager sont les garants de l’état du swarm. Chaque action effectuée dans le swarm (création d’un service, mise à jour d’un service, création d’un network, ….) est sauvegardée dans un fichier de log sur le leader des managers. Ce fichier étant répliqué sur les autres managers.

Sur chaque manager les clés servant à chiffrer ces logs, et d’autres fichiers relatifs à l’état du swarm, sont stockés dans le répertoire /var/lib/docker/swarm. Ce répertoire est créé lors de l’initialisation du swarm (docker swarm init).

Création de 2 clusters swarm

Dans cet exercice, nous allons utiliser Multipass. Une fois Multipass installé, lancez la commande suivante afin de créer 2 VMs nommées swarm1 et swarm2:

for i in 1 2; do
  multipass launch -n swarm$i
done

Installez Docker sur chacune de ces VMs en utilisant la commande suivante:

for i in 1 2; do
  multipass exec swarm$i -- /bin/bash -c "curl -sSL https://get.docker.com | sh"
done

Créez ensuiten un service sur le premier cluster:

$ multipass exec swarm1 -- docker service create --replicas=2 nginx:1.18

Backup du premier cluster (swarm1)

Afin de réaliser le backup d’un swarm, effectuez les opérations suivantes:

  • arrêtez le daemon Docker depuis le manager:
$ multipass exec swarm1 -- sudo systemctl stop docker
  • copiez le répertoire /var/lib/docker/swarm à l’extérieur du cluster. Nous utilisons pour cela un répertoire de la machine local que nous montons dans le système de fichier du manager
$ mkdir /tmp/backup
$ multipass mount /tmp/backup swarm1:/tmp/backup
$ multipass exec swarm1 -- sudo cp -r /var/lib/docker/swarm /tmp/backup/
  • redémarrez le daemon Docker avec la commande suivante:
$ multipass exec swarm1 -- sudo systemctl start docker

Restauration du backup sur le second cluster (swarm2)

Afin de réaliser la restauration d’un backup, effectuez les opérations suivantes:

  • arrêtez le daemon Docker sur le manager
$ multipass exec swarm2 -- sudo systemctl stop docker
  • supprimez le répertoire /var/lib/docker/swarm
$ multipass exec swarm2 -- sudo rm -rf /var/lib/docker/swarm 
  • copiez le contenu du backup dans /var/lib/docker/swarm. Nous utilisons pour cela le répertoire local dans lequel le backup a été créé:
$ multipass mount /tmp/backup swarm2:/tmp/backup
$ multipass exec swarm2 -- sudo cp -r /tmp/backup/swarm /var/lib/docker/
  • redémarrez le daemon
$ multipass exec swarm2 -- sudo systemctl start docker
  • forcez la ré-initialisation du swarm avec la commande suivante, celle-ci force la création d’un nouveau cluster à partir de l’état courant (les éléments présents dans le répertoire /var/lib/docker/swarm)
$ multipass exec swarm2 --  docker swarm init --force-new-cluster

Vérifiez ensuite que le service contenant 2 replicas de nginx a bien été lancé sur ce nouveau cluster:

$ multipass exec swarm2 -- docker service ls
ID             NAME                 MODE         REPLICAS   IMAGE        PORTS
sh2uiyoaml6m   nervous_tereshkova   replicated   2/2        nginx:1.18