Sauvegarder et restaurer votre cluster Kubernetes

Dans cet article, nous allons étudier les différentes façons pour sauvegarder et restaurer un cluster Kubernetes.

Introduction

Dans ce chapitre nous examinerons les différentes méthodologies de sauvegarde et de restauration de votre cluster Kubernetes. Jusqu’à présent, nous avons déployé différentes ressources Kubernetes à l’aide de la commande kubectl mais aussi grâce aux différents fichiers manifest au format YAML.

Il existe différentes façons pour sauvegarder et restaurer un cluster Kubernetes, chaque méthode comporte ses propres avantages et inconvénients.

Nous avons tout d'abord l’approche déclarative qui consiste à créer et à sauvegarder toutes vos ressources Kubernetes depuis un fichier manifest au format YAML, et par la suite exécuter la commande kubectl apply -f ou kubectl create -f. C'est la méthode classique, vous pouvez en plus de ça, sauvegarder vos fichiers de configuration directement dans votre propre outil sauvegarde, dans ce cas vous pouvez facilement les réutiliser à un moment ultérieur ou les partager avec d'autres personnes. Vous aurez donc une copie de ces fichiers enregistrés à tout moment.

Information

Une autre bonne pratique consiste à commiter vos fichiers Manifest, afin de revenir plus facilement sur une version précédente mais aussi redéployer vos applications sur le cluster en exécutant simplement ces fichiers de configuration.

Cependant, il se peut que des membres de votre équipe créent un objet Kubernetes de manière impérative sans documenter cette information, en utilisant directement la commande kubectl create <object name>. Cette méthode ne garantit pas donc une sauvegarde complète de toutes vos données de votre cluster Kubernetes.

ETCD

Description

Dans ce cas, la meilleure solution consiste à utiliser le composant ETCD. Pour rappel ETCD est un composant du master Kubernetes qui est l'endroit où toutes les informations relatives au cluster sont stockées. Dont, des informations sur le cluster lui-même, ainsi que les nœuds et toutes les autres ressources créées dans le cluster.

Comme nous l'avions vu au début de notre cours, le composant ETCD est hébergé sur les nœuds maîtres. Lors de la configuration d’ETCD, un emplacement est spécifié par défaut où toutes les données k8s seraient stockées. Vous retrouverez cet emplacement à l'aide de la commande suivante :

kubectl describe pod etcd-master -n kube-system | grep data-dir

Résultat :

--data-dir=/var/lib/etcd

Backup

ETCD est également livré avec une solution de Snapshot intégrée, que nous utiliserons ainsi pour créer notre première backup. Pour cela, nous devons récupérer quelques informations.

Premièrement on récupère, l'adresse et le port utilisé par le master pour communiquer avec le composant ETCD. Pour ce faire, lancez donc la commande suivante :

kubectl describe pod etcd-master -n kube-system | grep  listen-client-urls

Résultat :

--listen-client-urls=https://127.0.0.1:2379

Deuxièmement, on récupère le fichier de certificat du serveur ETCD :

kubectl describe pod etcd-master -n kube-system | grep cert-file

Résultat :

--cert-file=/etc/kubernetes/pki/etcd/server.crt

Enfin, on récupère, la location du fichier CA (Autorité de Certification) du serveur ETCD :

kubectl describe pod etcd-master -n kube-system | grep trusted-ca

Résultat :

--trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt

Une fois toutes ces informations récupérées, on peut commencer à utiliser l'outil de backup ETCD à savoir ETCDCTL_API afin de créer la première backup de notre cluster Kubernetes :

ETCDCTL_API=3 etcdctl --endpoints=https://[127.0.0.1]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt \
    --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key \
    snapshot save /tmp/snapshot-etcd.db

Dans la commande, nous précisons que notre backup sera sauvegardée sous un fichier de base de données sous le nom de snapshot-etcd.db qui sera placé dans le dossier /tmp/. Ce fichier est très important car nous le réutiliserons plus tard pour la restauration de notre cluster Kubernetes.

Réstauration

Afin de restaurer notre sauvegarde, Nous devons tout d'abord initialiser un nouveau répertoire de restauration de notre base de données et par la suite modifier notre configuration de ETCD en changeant l'emplacement où le composant cherche sa nouvelle base de données.

Nous allons commencer par générer notre nouveau répertoire de sauvegarde en se basant sur notre fichier de sauvegarde toujours en utilisant l'outil ETCDCTL_API :

ETCDCTL_API=3 etcdctl --endpoints=https://[127.0.0.1]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt \
    --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key \
    --data-dir /var/lib/etcd-backup \
    snapshot restore /tmp/snapshot-etcd.db

En exécutant cette commande, un nouveau répertoire de données est créé à l'emplacement /var/lib/etcd-backup qui contient toutes les données de notre cluster sauvegardées précédemment.

L'étape suivante consiste à mette à jour la configuration du pod statique ETCD pour utiliser le nouveau répertoire de données en modifiant le fichier /etc/kubernetes/manifests/etcd.yaml. Il faut mettre à jour la valeur de --data-dir et d'y insérer notre nouveau chemin de sauvegarde, dans notre cas ça nous donnera :

Information

Les pods statiques sont une sorte de pod qui ne sont pas gérés via le composant kube-apiserver et sont directement liés au démon kubelet sur un nœud spécifique. C'est le kubelet qui crée et gère le cycle de vie de ce type de pods. Pour retrouver l'emplacement des pods statiques, il suffit de lancer la commande grep -i static /var/lib/kubelet/config.yaml. Une fois le path récupéré, vous y trouverez tous les fichiers manifests YAML de vos statiques pods (vous pouvez d'ailleurs créer votre propre statique pod en déposant votre fichier yaml dans ce répertoire).

--data-dir=/var/lib/etcd-backup

Enfin, toujours dans le même fichier, il ne faut pas oublier de modifier les volumes afin qu'ils pointent vers le nouveau path :

volumeMounts:
- mountPath: /var/lib/etcd-backup
  name: etcd-data
- mountPath: /etc/kubernetes/pki/etcd
  name: etcd-certs
hostNetwork: true
priorityClassName: system-cluster-critical
volumes:
- hostPath:
  path: /var/lib/etcd-backup
  type: DirectoryOrCreate
name: etcd-data
- hostPath:
  path: /etc/kubernetes/pki/etcd
  type: DirectoryOrCreate
name: etcd-certs

Vous n'avez pas besoin de lancer d'autres commandes, puisque les statiques pods sont automatiquement mis à jour par le démon kubelet.

Espace commentaire

Écrire un commentaire

Rejoignez la discussion

Vous devez être connecté pour poster un message.

21 commentaires

ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Pense à supprimer les vieux snapshots dans /tmp/ de temps en temps, sinon tu vas saturer ta partition root.

22/12/2019 à 16:55
bernier-denis
Membre Actif Secouriste
Avatar de bernier-denis
bernier-denis
Membre Actif Secouriste

Merci, c'était bien ça. Le propriétaire du dossier n'était pas le bon.

22/12/2019 à 12:27
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Vérifie tes permissions sur le nouveau répertoire de restauration :

chown -R etcd:etcd /var/lib/etcd-backup

Si le user du conteneur n'a pas les droits, il ne démarrera jamais.

22/12/2019 à 06:42
ecarlier
Membre Actif
Avatar de ecarlier
ecarlier
Membre Actif

Le volumeMounts dans le fichier etcd.yaml me pose problème. Le pod reste en CrashLoopBackOff.

22/12/2019 à 02:20
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Utilise etcdctl snapshot status. Si la commande te rend les infos du DB, c'est que le fichier est intègre.

21/12/2019 à 19:21
petit-marcelle
Membre Actif
Avatar de petit-marcelle
petit-marcelle
Membre Actif

Comment je vérifie que le snapshot est pas corrompu avant de faire une bêtise en prod ?

21/12/2019 à 12:26
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

La restauration etcd ne marche qu'avec des versions identiques. Tu ne peux pas restaurer un snapshot d'un cluster 1.25 sur un 1.28. Faut migrer proprement.

21/12/2019 à 07:10
guillaume71
Membre Actif
Avatar de guillaume71
guillaume71
Membre Actif

J'ai essayé de restaurer sur une autre version de K8s, ça a planté. Une idée ?

21/12/2019 à 02:16
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Oui, tu peux. Mais gaffe : ne stocke jamais tes snapshots sur le même disque que le master. Si le master crame, tu perds le backup aussi.

20/12/2019 à 22:01
catherine58
Membre Actif
Avatar de catherine58
catherine58
Membre Actif

Est-ce qu'on peut automatiser ça avec un cron job ?

20/12/2019 à 16:09
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Ça dépend de la taille de ton cluster. Si t'as beaucoup de ConfigMaps ou de Secrets, ça monte vite. Vérifie juste que t'as assez de place sur le disque.

20/12/2019 à 11:40
theodore-dossantos
Membre Actif
Avatar de theodore-dossantos
theodore-dossantos
Membre Actif

Gros merci pour l'article, c'était flou cette histoire de --data-dir. Par contre, mon snapshot fait 4Go, c'est normal ?

20/12/2019 à 04:56
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Exact. Comme c'est un pod statique, le kubelet surveille le fichier manifeste. Dès que tu modifies /etc/kubernetes/manifests/etcd.yaml, il détecte le changement et kill/restart le conteneur automatiquement.

20/12/2019 à 00:32
dominique-charles
Membre Actif
Avatar de dominique-charles
dominique-charles
Membre Actif

Pour la restauration, si je change le --data-dir dans etcd.yaml, le pod redémarre tout seul ?

19/12/2019 à 18:38
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Oui, les accès aux certificats /etc/kubernetes/pki/etcd/ nécessitent les droits root. Fais un sudo -i avant de lancer la commande.

19/12/2019 à 14:00
bmoulin
Membre Actif
Avatar de bmoulin
bmoulin
Membre Actif

J'ai une erreur permission denied quand je veux écrire dans /tmp/snapshot-etcd.db. Je dois être root ?

19/12/2019 à 06:07
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Le YAML c'est bien pour les déploiements, mais ça ne contient pas l'état du cluster (tokens, secrets générés, le statut des nodes). Si ton master crash, tu ne reconstruis pas tout avec juste tes manifestes.

19/12/2019 à 01:00
paul75
Membre Actif
Avatar de paul75
paul75
Membre Actif

C'est quoi l'intérêt de faire un snapshot etcd si on a déjà tous nos YAML dans git ?

18/12/2019 à 17:40
alphonse-martel
Membre Actif
Avatar de alphonse-martel
alphonse-martel
Membre Actif

Bien vu, j'avais un path foireux dans mon script. Ça passe maintenant.

18/12/2019 à 09:57
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

T'as bien vérifié tes certificats ? Si tu n'utilises pas les bons --cacert et --cert, ça rejette la connexion d'office. Vérifie le path avec kubectl describe pod etcd-master -n kube-system pour être sûr.

18/12/2019 à 03:18
aubert-bernadette
Membre Actif
Avatar de aubert-bernadette
aubert-bernadette
Membre Actif

J'essaie de faire un backup etcd mais je me prends une erreur de connexion sur https://127.0.0.1:2379. Le port est bien ouvert pourtant ?

17/12/2019 à 21:03

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire