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