Aller au contenu

Velero — sauvegarde du namespace

Velero sauvegarde le namespace openbao en entier : les objets Kubernetes et le contenu des volumes persistants, donc l'état Raft du coffre.

Pour savoir quand l'utiliser plutôt que Medusa, voir la vue d'ensemble.

Le contenu sauvegardé reste chiffré par le sceau

Velero copie les volumes tels quels. Sans les parts de descellement, les données restaurées ne sont pas exploitables.

C'est précisément le trou que Medusa comble.

Ce qui tourne

Six planifications couvrent le namespace, toutes en heure de Paris :

Planification Fréquence Rétention Destination
velero-backup-daily-openbao tous les jours à 00 h 30 15 jours prod-daily
velero-backup-weekly-openbao dimanche à 00 h 30 84 jours prod-weekly
velero-backup-monthly-openbao le 1er du mois 1 an prod-monthly
velero-backup-monthly-openbao-nl-ams le 1er du mois 1 an prod-monthly-nl
velero-backup-yearly-openbao le 2 septembre 10 ans prod-yearly
velero-backup-yearly-openbao-nl-ams le 2 septembre 10 ans prod-yearly-nl

Les deux planifications nl-ams écrivent dans une seconde région, Amsterdam, pour survivre à la perte de fr-par.

Velero a son propre planificateur

Il n'y a aucun CronJob Kubernetes derrière ces planifications. Chercher un CronJob pour comprendre ou déclencher une sauvegarde est une piste sans issue.

Vérifier que ça tourne

kubectl -n velero get schedules | grep openbao

La colonne LASTBACKUP doit afficher une durée cohérente avec la fréquence : moins de 24 h pour la quotidienne. PAUSED doit être vide.

Les sauvegardes récentes, la plus récente en dernier :

kubectl -n velero get backups | grep openbao

Vérifier qu'une sauvegarde est complète

Le nom d'une sauvegarde suit le motif <planification>-<horodatage UTC> :

BACKUP=NOM_DU_BACKUP

kubectl -n velero get backup $BACKUP -o jsonpath='{"phase   : "}{.status.phase}{"\n"}{"items   : "}{.status.progress.itemsBackedUp}{"/"}{.status.progress.totalItems}{"\n"}{"erreurs : "}{.status.errors}{"\n"}'

Attendu : Completed, un compte d'items identique de part et d'autre du /, et aucune erreur.

Les volumes sont sauvegardés séparément des objets Kubernetes, et c'est là que les échecs passent le plus facilement inaperçus :

kubectl -n velero get podvolumebackups -l velero.io/backup-name=$BACKUP \
  -o custom-columns=POD:.spec.pod.name,VOLUME:.spec.volume,PHASE:.status.phase

Attendu : 8 lignes en Completed, les volumes data et home de chacun des 4 pods openbao-0 à openbao-3.

Une sauvegarde Completed avec des volumes en échec est un faux vert

La phase globale peut afficher Completed alors qu'un PodVolumeBackup a échoué. Dans ce cas l'état Raft d'un nœud manque, et la sauvegarde n'est pas restaurable.

Contrôlez toujours les 8 volumes, pas seulement la phase.

Ne jamais supprimer une sauvegarde en cours

Ne pas kubectl delete un objet Backup en phase InProgress

Cela bloque la file de travail du contrôleur : plus aucune sauvegarde ne démarre, les nouvelles restent en Queued, et les planifications de la nuit ne partent pas non plus.

Symptôme : aucune ligne controller=backup dans les logs alors qu'une sauvegarde attend.

Remède : kubectl -n velero rollout restart deploy/velero. Le serveur est sans état, c'est sûr tant qu'aucune sauvegarde ne tourne.

Restauration

Procédure non éprouvée

Aucune restauration Velero du namespace openbao n'a été testée à ce jour. Les commandes existent (velero restore create --from-backup) mais leur comportement sur un StatefulSet avec des PVC zonaux et un coffre scellé n'a pas été vérifié.

En cas de besoin réel, privilégiez Medusa, dont la restauration est éprouvée, et traitez Velero comme un filet dont il faut d'abord valider le fonctionnement.

Points à éclaircir avant de pouvoir écrire cette procédure :

  • comportement sur les PVC zonaux, que le StatefulSet ne peut pas replacer dans une autre zone
  • ordre entre la restauration des volumes et le descellement des pods
  • interaction avec les pods vault-unseal, qui tentent de desceller pendant la restauration