Kubernetes - Sauvegarde/Restauration etcd - RaspberryPI - Rock64 (arm/amd64)

Script de sauvegarde à mettre en place sur le master

Nom du fichier : /usr/local/bin/kubernetes-backup-etcd.sh

Ajouter ce contenu :

#!/bin/bash
DIRBACKUP="/backup-etcd/snapshots/"
DEFAULTETCD="/backup-etcd/snapshots/default.etcd"
# prune in days
PRUNE=5
DEBUG=0
# Api etcd V3
export ETCDCTL_API=3 

if [ ! -d "$DIRBACKUP" ];then
  mkdir -p "$DIRBACKUP"
fi

if [ -d "$DEFAULTETCD" ];then
  rm -rf "$DEFAULTETCD"
  if [ "$?" != "0" ];then
    exit 1
  fi 
fi
# Backup
etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --endpoints=https://127.0.0.1:2379 --key=/etc/kubernetes/pki/etcd/server.key snapshot save "$DIRBACKUP/etcd-snapshot-$(date +%Y-%m-%d_%H:%M:%S_%Z).db" > /dev/null

if [ "$?" == "0" ];then
  # Prune
  FILESTODELETE=$(find "$DIRBACKUP" -mtime +$PRUNE)
  if [ "$FILESTODELETE" != "" ];then
    if [ "$DEBUG" == "1" ];then
      echo "-----------------"
      echo "Suppression des fichiers obsolètes ($PRUNE days)"
      echo "-----------------"
    fi
    for F in $FILESTODELETE
    do
      if [ "$DEBUG" == "1" ];then
        echo "Suppression de $F"
      fi
      rm -f "$F"
      if [ "$?" != "0" ];then
        echo "[ERR] - impossible de supprimer le fichier $F"
        exit 1
      fi
    done
  fi
fi

Job (tâche cron)

Personnellement ce script est exécuté une fois par jour (augmentez la fréquence quand vous faîtes des tests) :

vi /etc/cron.d/kubernetes-backup

# Backup etcd master
0 23 * * * root /usr/local/bin/kubernetes-backup-etcd.sh

## Pour restaurer Avant de lancer le script assurez-vous que le job de sauvegarde ne s’exécute pas durant la restauration (commenter la ligne).

Sur le serveur master exécuter ce script :

# !!!!ce répertoire est le répertoire oû vous sauvegarder les snapshots 
# (voir le shell ci-avant : /usr/local/bin/kubernetes-backup-etcd.sh )
DIRBACKUP="/backup-etcd/snapshots/"
# stop kubelet 
systemctl stop kubelet
# supression de /var/lib/etcd
rm -r /var/lib/etcd
cd "$DIRBACKUP"
# supprimer tous les fichiers qui se terminent par .part (sauvegardes partielles non exploitables)
rm *.part
# Récupération du fichier le plus récent
FILETORESTORE=$(ls -l -t | head -2 | awk '{print $9}' | xargs)
# restauration
ETCDCTL_API=3 etcdctl snapshot restore './$FILETORESTORE'
mv default.etcd /var/lib/etcd
# start kubelet
systemctl stop kubelet

Attendre quelques minutes et tester avec, par exemple, la commande : kubectl get nodes… Le cluster est à nouveau UP !!!