Skip to content

Active clusters

swarm01

[Système : None] [Lifecycle : production]

Cluster principal de ComputableFacts basé sur Docker Swarm

Détails

Où est s006 ?

Nous avions un serveur s006 à l'installation de ce cluster. Mais la machine a eu un problème de ventilateur qui la faisait rédémarrer ou s'arrêter de façon impromptu. Nos 3 serveurs MySQL étaient stickés sur cette machine donc une grande partie de nos déploiements sur swarm01 étaient indisponibles puisque sans accès à leur base de données.

Nous avons donc pris, en urgence, le serveur s008 où nous avons déplacé toutes nos bases de données.

Au début, nous avons gardé s006 dans le cluster mais elle est à nouveau tombée en panne. Nous avons décidé de la décommissionner. Nous ne l'avons pas remplacée car nous n'avons pas besoin de plus de ressources, surtout depuis que nous avons décidé de déplacer les applications de nos clients vers des serveurs avec YunoHost (Towerify).

Events

2025-01-10 - 18:20 - Suppression de 2 managers du cluster swarm01 (s002 et s003)

Comme nous avons réduit le nombre de clients utilisant swarm01, nous voulons réduire le nombre de machines. Je veux commencer par retirer les 2 managers.

Je choisi de garder s001 comme manager et de supprimer s002 et s003.

Je sauvegarde le répertoire /var/lib/docker/swarm sur s001.

Commande
ansible@s001:~$ sudo tar -czvf var_lib_docker_swarm.20250110.tar.gz /var/lib/docker/swarm
tar: Removing leading `/' from member names
/var/lib/docker/swarm/
/var/lib/docker/swarm/worker/
/var/lib/docker/swarm/worker/tasks.db
/var/lib/docker/swarm/state.json
/var/lib/docker/swarm/docker-state.json
/var/lib/docker/swarm/raft/
/var/lib/docker/swarm/raft/wal-v3-encrypted/
/var/lib/docker/swarm/raft/wal-v3-encrypted/0000000000000282-0000000000fb5e32.wal
/var/lib/docker/swarm/raft/wal-v3-encrypted/0.tmp
/var/lib/docker/swarm/raft/snap-v3-encrypted/
/var/lib/docker/swarm/raft/snap-v3-encrypted/0000000000000184-0000000000fb7703.snap
/var/lib/docker/swarm/certificates/
/var/lib/docker/swarm/certificates/swarm-node.key
/var/lib/docker/swarm/certificates/swarm-root-ca.crt
/var/lib/docker/swarm/certificates/swarm-node.crt

Pour restaurer, faire (non testé) :

sudo systemctl stop docker
sudo tar -xzvf swarm-backup.tar.gz -C /
sudo systemctl start docker

Le status des noeuds de mon swarm :

ansible@s001:~$ sudo docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
k232lszqgaa76qas459m9v9c1 *   s001       Ready     Active         Reachable        24.0.4
0u3khzcl9z51ht6mkm4faejxw     s002       Ready     Active         Leader           24.0.4
ljt3zkvuzii9f90k7o0g5jx6d     s003       Ready     Active         Reachable        24.0.4
wvjk3zj5trf7shi8sk4lwaiau     s004       Ready     Active                          24.0.4
julb8p7h0lakc89ivtmhmtmhd     s005       Ready     Active                          24.0.4
yt8tm5wpiigklqt3zi7n1x2q8     s008       Ready     Active                          24.0.4

Je vais d'abord enlever le rôle de manager à s003. s002 devrait rester Leader. Puis je vais enlever le rôle de manager à s002 donc s001 sera le seul manager restant et devrait devenir Leader.

Commandes
ansible@s001:~$ sudo docker node demote ljt3zkvuzii9f90k7o0g5jx6d
Manager ljt3zkvuzii9f90k7o0g5jx6d demoted in the swarm.
ansible@s001:~$ sudo docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
k232lszqgaa76qas459m9v9c1 *   s001       Ready     Active         Reachable        24.0.4
0u3khzcl9z51ht6mkm4faejxw     s002       Ready     Active         Leader           24.0.4
ljt3zkvuzii9f90k7o0g5jx6d     s003       Ready     Active                          24.0.4
wvjk3zj5trf7shi8sk4lwaiau     s004       Ready     Active                          24.0.4
julb8p7h0lakc89ivtmhmtmhd     s005       Ready     Active                          24.0.4
yt8tm5wpiigklqt3zi7n1x2q8     s008       Ready     Active                          24.0.4
ansible@s001:~$ sudo docker node demote 0u3khzcl9z51ht6mkm4faejxw
Manager 0u3khzcl9z51ht6mkm4faejxw demoted in the swarm.
ansible@s001:~$ sudo docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
k232lszqgaa76qas459m9v9c1 *   s001       Ready     Active         Leader           24.0.4
0u3khzcl9z51ht6mkm4faejxw     s002       Ready     Active                          24.0.4
ljt3zkvuzii9f90k7o0g5jx6d     s003       Ready     Active                          24.0.4
wvjk3zj5trf7shi8sk4lwaiau     s004       Ready     Active                          24.0.4
julb8p7h0lakc89ivtmhmtmhd     s005       Ready     Active                          24.0.4
yt8tm5wpiigklqt3zi7n1x2q8     s008       Ready     Active                          24.0.4

Je teste :

  • l'accès à l'admin de Keycloak fonctionne
  • l'accès au datalake de DEV puis de PROD ISTA, en passant par Keycloak fonctionne

Je dois maintenant retirer s002 et s003 du swarm. Je veux le faire avec ansible.

Je mets à jour mon inventaire :

swarm01_nodes:
  children:
    # Must be one of the Swarm managers hosts (only the first host is used)
    swarm_initiator:
      hosts:
        s001:
    # Hosts that will be Swarm manager (at least one)
    swarm01_managers:
      hosts:
        s001:
    # Hosts that will be Swarm worker. Must not be in Swarm managers list.
    swarm01_workers:
      hosts:
        s004:
        s005:
        s008:
    # Hosts that will be remove from Swarm
    swarm01_leave:
      hosts:
        s002:
        s003:

Puis je fais la commande : ansible-playbook -i ansible/inventory.yml ansible/02-swarm.yaml --tags swarm-leave -e "infra=swarm01".

Elle est restée bloquée après avoir affichée Ok [s002]. J'ai donc fait aussi la commande sudo docker swarm leave directement sur s002 qui a réussi car elle a affiché : Node left the swarm..

s002 ne fait plus partie du swarm01
ansible@s001:~$ sudo docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
k232lszqgaa76qas459m9v9c1 *   s001       Ready     Active         Leader           24.0.4
0u3khzcl9z51ht6mkm4faejxw     s002       Down      Active                          24.0.4
ljt3zkvuzii9f90k7o0g5jx6d     s003       Ready     Active                          24.0.4
wvjk3zj5trf7shi8sk4lwaiau     s004       Ready     Active                          24.0.4
julb8p7h0lakc89ivtmhmtmhd     s005       Ready     Active                          24.0.4
yt8tm5wpiigklqt3zi7n1x2q8     s008       Ready     Active                          24.0.4

Mais j'ai un problème car Portainer était stické sur s002.

Comment j'ai rétabli Portainer

J'ai d'abord mis le tag qui sticke Portainer sur s001 avec la commande sudo docker node update --label-add portainer.portainer-data=true k232lszqgaa76qas459m9v9c1.

Portainer a démarré mais comme si je venais de l'installer. Je dois donc transférer le contenu du volume de s002 vers s001.

J'ai commencé par arrêter le service de Portainer qui utilise le volume avec cette commande sur s001 : sudo docker service scale portainer_portainer=0.

Puis j'ai transféré depuis mon poste avec ces 3 commandes :

  • ssh swarm01-s002 "sudo tar czf - /var/lib/docker/volumes/portainer_portainer-data/_data" > portainer_portainer-data/portainer-data.tar.gz
  • scp portainer_portainer-data/portainer-data.tar.gz swarm01-s001:/home/ansible/portainer-data.tar.gz
  • ssh swarm01-s001 "sudo tar xzf /home/ansible/portainer-data.tar.gz -C /home/ansible/ && sudo mv /home/ansible/var/lib/docker/volumes/portainer_portainer-data/_data/* /var/lib/docker/volumes/portainer_portainer-data/_data && sudo rm -rf /var/lib/docker/volumes/portainer_portainer-data/var"

Je redémarre le service avec sudo docker service scale portainer_portainer=1. J'arrive à me connecter. Je vois le swarm et je vois qu'il a 49 stacks mais je n'arrive pas à lister les stacks ni les services. Par contre je vois la liste des containers. J'ai des messages d'erreur "Unable to retrieve stacks" ou "Unable to retreive services". Parfois les stacks se sont affichées mais les services jamais.

Je décide de publier à nouveau portainer sur s001 avec ansible et la commande : ansible-playbook -i ansible/inventory.yml ansible/04-swarm01-utility-stacks.yaml --tags portainer (j'ai changé hosts: s002 par hosts: s001 avant).

Les agents de chaque node redémarrent (comme je le pensais) et, maintenant, mon portainer fonctionne à nouveau comme avant.

Je vois toujours s002 avec la commande sudo docker node ls exécutée sur s001. Il a le statut down depuis que je l'ai retiré du swarm. Je fais la commande sudo docker node rm 0u3khzcl9z51ht6mkm4faejxw pour l'enlever définitivement de la liste.

Je passe à s003. Sur s003, je fais la commande sudo docker swarm leave qui réussie avec le retour Node left the swarm.. Comme s002, s003 reste présent avec le statut down dans la liste de sudo docker node ls. Je le supprime donc avec la commande sudo docker node rm s003. Ca fonctionne : je n'ai plus que 4 serveurs dans swarm01.

J'arrête là pour aujourd'hui. Je supprimerai les machines la semaine prochaine.

2024-11-19 - 21:54 - Décommissionnement de s007

Maintenant qu'aucune application n'est stickée sur s007 et que je l'ai sorti de swarm01, je peux le rendre à Scaleway.

Serveur Elastic Metal s007 supprimé depuis l'UI de Scaleway.

Dependencies