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 !!!