Voyons comment réaliser des backups de nos pods et volumes Kubernetes avec Velero.
Les backups seront copiés sur le NAS via un serveur S3 (minio)


Pour commencer, une video en français pour dégrossir le sujet:

Etapes de réalisation

  • Installation et configuration de MinIO sur un synology (facultatif)
  • Installation de Velero client et déploiement sur le cluster kubernetes
  • Lancement des premiers backups (one-shot et programmés)

Installation de minio sur le synology

On crée simplement un container, avec l'image minio/minio, sans oublier d'activer le redémarrage automatique:

On expose ensuite deux ports (9000: Api S3/Minio et 9090: interface GUI Web):

On affecte un répertoire du NAS sur le point de montage /data:

On crée un utilisateur administrateur et un bon gros mot de passe associé

On ajoute la commande de démarrage:

minio server /data --address ":9000" --console-address ":9090"

et voila, on essaye maintenant d'accéder a l'interface de velero http://<ip-du-nas>:9090

  • Creation du user et du bucket MinIO

On se loggue sur l'interface d'administration (http://<ip-du-nas>:9090) avec le user root et le mot de passe précédemment défini.

Ensuite, il faut créer un bucket, et un utilisateur (avec une policy permettant d'accéder au bucket)

Ces credentials seront utilisés par Velero pour copier les backups.

Installation de velero

On commence par créer un fichier de credentials AWS/minio (avec le user créé ci-dessus)

[default]
aws_access_key_id = k8s-velero
aws_secret_access_key = <mot de passe user >

Ensuite on lance l'installation, en prenant soin de spécifier l'ip du nas, et du nom du bucket Minio ex:

BUCKET="k8s-backups"
S3URL="http://<nas-ip>:9000"

velero install \
   --use-node-agent \
   --provider aws \
   --use-volume-snapshots=false \
   --plugins velero/velero-plugin-for-aws:v1.11.0 \
   --bucket ${BUCKET} \
   --secret-file ./minio.credentials \
   --backup-location-config region=minio,s3ForcePathStyle=true,s3Url=${S3URL}

on contrôle ensuite que l'installation est OK et que la connexion avec minio est fonctionnelle:

$ velero backup-location get 
NAME      PROVIDER   BUCKET/PREFIX   PHASE       LAST VALIDATED                   ACCESS MODE   DEFAULT
default   aws        k8s-backups     Available   2025-05-16 15:42:16 +0200 CEST   ReadWrite     true

Lancement d'un permier backup

Par défaut, velero ne va pas réaliser les backups des volumes. Plus d'infos ici:
https://velero.io/docs/v1.10/customize-installation/#default-pod-volume-backup-to-file-system-backup

Pour cela, il faut créer une annotation spécifique sur le pod pour lui indiquer qu'un volume est à backup:

Exemple pour prendre en compte un volume spécifique:

// Ajout de l'anotation
$ kubectl -n unifi annotate pod/unifi-ctrl-0  backup.velero.io/backup-volumes=unifi-ctrl

// Lancement d'un backup
$ velero backup create bk-unifi --include-namespaces unifi --ttl 24h

// Detail du backkup
$ velero  backup describe bk-unifi
...
  Pod Volume Backups - kopia (specify --details for more information):
    Completed:  1
...

Il existe aussi une option générique "--default-volumes-to-fs-backup=true" qui permet de forcer le backup des volumes, sans avoir a utiliser les annotations.

Autres configurations/annotations

Annotation Description
backup.velero.io/backup-volumes Liste des noms de volumes montés dans le pod à sauvegarder. (obligatoire pour déclencher la sauvegarde avec Restic)
backup.velero.io/backup-volumes-includes (optionnel) Chemins à inclure dans le backup. Relatifs au point de montage du volume.
backup.velero.io/backup-volumes-excludes (optionnel) Chemins à exclure du backup. Relatifs au point de montage.
backup.velero.io/force-full true ou false. Force un backup complet même si un backup incrémental est possible.
backup.velero.io/owner-only true ou false. Sauvegarde uniquement les fichiers appartenant à l’utilisateur qui exécute le processus. (utile pour des volumes multi-tenant)

backup.velero.io/backup-volumes=<volume>
backup.velero.io/backup-volumes-excludes: /path/to/exclude
backup.velero.io/backup-volumes-includes: /path/to/include

Ordonnancement des backups

Velero dispose d'un ordonnanceur pour programmer les backups.

Ici la commande pour créer un backup tous les dimanches soirs avec backup de tous les fs (sauf si annotation contraire):

$ velero schedule create full-weekly --schedule="0 3 * * 0" --default-volumes-to-fs-backup=true


$ velero schedule get
NAME          STATUS    CREATED                          SCHEDULE    BACKUP TTL   LAST BACKUP   SELECTOR   PAUSED
full-weekly   Enabled   2025-05-16 17:29:14 +0200 CEST   0 3 * * 0   0s           n/a           <none>     false

Restauration d'un backup

Exemple de restauration d'un namespace du backup (myblog) avec renommage dans un autre namespace (myblog-test), depuis un backup full.

velero restore create myrestore \
--from-backup bkup-full \
--include-namespaces myblog \
--namespace-mappings myblog:myblog-test 

Utilisation de kopia-cli

Velero utilise en arrière plan l'outil Kopia pour créer les snapshots des volumes.
Il est donc possible d'utiliser directement Kopia pour se connecter sur le S3 utilisé par Velero et monter les snapshots, ou récupérer un fichier égaré :

$ kopia repository connect s3 \
  --bucket "k8s-backups" --prefix=kopia/coroot/ \
  --access-key "S3-minio-key"  \
  --secret-access-key "S3-minio-secret-key"  \
  --endpoint "<s3-minio-ip:port"> \
  --disable-tls  \
  --password "velero-kopia-secret"
Connected to repository.

$ mkdir kopia-mnt
$ kopia mount all kopia-mnt
$ cd kopia-mnt
$ $ ls default\@default/host_pods_123456_volumes_kubernetes.io~csi_pvc-123456_mount/20250517-030020/
apps  data  files  images  logs  media	public	settings  themes

Conclusion

Après avoir compris quelques concepts, on arrive a lancer les premiers backups de son système.


La finalité étant la restauration, je vous invite a tester régulièrement la procédure de récupération des données.

La restauration permet aussi de recréer tout ou partie de ses ressources kubernetes dans un nouveau namespace ... idéal pour cloner un environnement et faire des tests