Guide d'utilisation de Velero
Ce guide détaille l'utilisation de Velero pour la sauvegarde et la restauration de ressources Kubernetes sur un cluster SdV. Il s'adresse aux équipes DevOps/Ops/SRE responsables de la gestion des sauvegardes et de la continuité d'activité.
Introduction
Velero est un outil open-source permettant de sauvegarder et restaurer les ressources Kubernetes ainsi que les volumes persistants. Sur l'infrastructure SdV, Velero est pré-installé et configuré pour effectuer des sauvegardes automatiques.
Prérequis
Pour interagir avec Velero, vous devez disposer du velero-cli, que vous pouvez installer en suivant les instructions sur le site officiel.
Pour connaître la version de Velero installée sur votre cluster :
kubectl -n velero get deploy velero -o=jsonpath='{.spec.template.spec.containers[0].image}' | cut -d: -f2Configuration et paramètres
Namespace Velero
Chez SdV, Velero est installé par défaut dans le namespace velero. Il est donc inutile de préciser l'argument --namespace à velero-cli sauf si vous avez décidé de déplacer velero dans un autre namespace.
Configuration KUBECONFIG
Par défaut, velero-cli utilise la configuration KUBECONFIG courante de votre terminal, identique à votre commande kubectl.
Pour forcer l'utilisation d'un fichier KUBECONFIG particulier :
velero <commande> --kubeconfig=/path/to/kubeconfigPour forcer le contexte à utiliser :
velero <commande> --kubecontext=<nom-contexte>Inclusion et exclusion de namespaces
Sans précision de votre part, velero-cli utilise --include-namespaces '*', ce qui inclut tous les namespaces dans le scope de votre demande de backup.
velero <commande> --include-namespaces namespace1,namespace2velero <commande> --exclude-namespaces namespace1,namespace2Durée de rétention des sauvegardes
Pour préciser la durée de rétention lors de la création d'une sauvegarde ponctuelle ou d'une programmation, utilisez l'argument --ttl. La valeur est au format XXXhYYYmZZZs.
| Durée | Format | Description |
|---|---|---|
| 30 jours | 720h0m0s | Rétention standard |
| 7 jours | 168h0m0s | Rétention courte |
| 90 jours | 2160h0m0s | Rétention longue |
Cas d'usage et exemples
Programmer une sauvegarde récurrente
Exemple avec une sauvegarde quotidienne en gardant 30 jours de rétention :
velero create schedule dailybackup-name \
--schedule="@every 24h" \
--ttl 720h0m0s| Argument | Description |
|---|---|
create schedule dailybackup-name | Créer une tâche de sauvegarde programmée nommée dailybackup-name |
--schedule="@every 24h" | Exécution toutes les 24 heures |
--ttl 720h0m0s | Durée de conservation des sauvegardes : 720h (30 jours) |
# Tous les jours à 2h du matin
velero create schedule daily-2am --schedule="0 2 * * *" --ttl 720h0m0s
# Toutes les heures
velero create schedule hourly --schedule="@every 1h" --ttl 96h0m0s
# Tous les lundis à 3h
velero create schedule weekly --schedule="0 3 * * 1" --ttl 2160h0m0sCréer une sauvegarde ponctuelle
Pour effectuer immédiatement une sauvegarde du namespace backup-test :
velero create backup backup-test --include-namespaces backup-test# Backup complet du cluster (tous les namespaces)
velero create backup full-cluster-backup --ttl 720h0m0s
# Backup d'un namespace avec TTL personnalisé
velero create backup my-app-backup \
--include-namespaces my-app \
--ttl 168h0m0s
# Backup de plusieurs namespaces
velero create backup multi-ns-backup \
--include-namespaces app1,app2,app3 \
--ttl 720h0m0sSauvegarde des PersistentVolumes
Lorsque vous souhaitez que velero sauvegarde le contenu stocké sur les PersistentVolumeClaims, vous devez ajouter une annotation sur les Pods qui utilisent ces PersistentVolumeClaims.
Vos Pods étant pilotés par des Deployments, DaemonSets, StatefulSets, CronJobs et autres, vous devez prévoir l'annotation dans ces entités englobantes pour que les Pods qui en découlent disposent de la bonne annotation.
Exemple pour un Deployment :
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
namespace: my-namespace
spec:
replicas: 1
selector:
matchLabels:
app: my-deployment
template:
metadata:
labels:
app: my-deployment
annotations:
backup.velero.io/backup-volumes: my-service-storage
spec:
containers:
- name: my-service
image: myservice:tag
volumeMounts:
- name: my-service-storage
mountPath: /data
volumes:
- name: my-service-storage
persistentVolumeClaim:
claimName: my-persistent-volume-claimIci, le Deployment démarre un Pod qui va utiliser le PersistentVolumeClaim nommé my-persistent-volume-claim.
C'est ce PersistentVolumeClaim que nous souhaitons sauvegarder.
L'annotation est donc ajoutée au niveau .spec.template.metadata.annotations pour que le Pod porte bien l'annotation backup.velero.io.backup-volumes donnant pour instruction de sauvegarder les volumes nommés en valeur, dans notre cas : my-service-storage.
Ce volume my-service-storage fait référence à un persistentVolumeClaim nommé my-persistent-volume-claim. C'est bien celui-ci qui sera sauvegardé.
velero create schedule my-deployment-backup \
--include-namespaces my-namespace \
--schedule='0 5 * * *' \
--ttl 720h0m0s| Argument | Détail |
|---|---|
create schedule my-deployment-backup | Créer une tâche de sauvegarde programmée se nommant my-deployment-backup |
--include-namespaces my-namespace | La sauvegarde ne concernera que les entités annotées dans le Namespace my-namespace |
--schedule='0 5 * * *' | La plannificiation se fait tous les jours à 05h00 |
–ttl 720h0m0s | Définis la durée de conservation des sauvegardes à 720h soit 30 jours |
Visualisation et monitoring
Visualiser les sauvegardes programmées
velero schedule getNAME STATUS CREATED SCHEDULE BACKUP TTL LAST BACKUP SELECTOR
my-deployment-backup Enabled 2022-02-24 10:48:22 +0100 CET 0 5 * * * 720h0m0s 28m ago <none>
sdv-velero-hourly Enabled 2021-03-31 11:33:26 +0200 CEST @every 1h 96h0m0s 21m ago <none>Visualiser les sauvegardes réalisées
velero backup getNAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR
my-deployment-backup-20220224094824 Completed 0 0 2022-02-24 10:48:24 +0100 CET 29d default <none>
sdv-velero-hourly-20220224095616 Completed 0 0 2022-02-24 10:56:16 +0100 CET 3d default <none>
sdv-velero-hourly-20220224085616 Completed 0 0 2022-02-24 09:56:16 +0100 CET 3d default <none>Voir les détails d'une sauvegarde
velero describe backup my-deployment-backup-20220224094824Name: my-deployment-backup-20220224094824
Namespace: velero
Labels: velero.io/schedule-name=my-deployment-backup
velero.io/storage-location=default
Annotations: velero.io/source-cluster-k8s-gitversion=v1.20.14
Phase: Completed
Errors: 0
Warnings: 0
Namespaces:
Included: my-namespace
Excluded: <none>
Resources:
Included: *
Excluded: <none>
Cluster-scoped: auto
Label selector: <none>
Storage Location: default
Velero-Native Snapshot PVs: auto
Snapshot Move Data: auto
Data Mover: velero
TTL: 720h0m0s
CSISnapshotTimeout: 10m0s
ItemOperationTimeout: 0s
Hooks: <none>
Backup Format Version: 1.1.0
Started: 2022-02-24 10:48:24 +0100 CET
Completed: 2022-02-24 10:49:15 +0100 CET
Expiration: 2022-03-26 10:48:24 +0100 CET
Total items to be backed up: 42
Items backed up: 42
Backup Volumes:
Velero-Native Snapshots: <none included>
CSI Snapshots: <none included or not detectable>
Pod Volume Backups - (specify --details for more information):
Completed: 6Ajoutez l'argument --details pour voir le détail des entités et volumes sauvegardés :
velero describe backup my-deployment-backup-20220224094824 --detailsTélécharger une sauvegarde réalisée (manifestes YAML)
velero backup download my-deployment-backup-20220224094824Backup my-deployment-backup-20220224094824 has been successfully downloaded to ./my-deployment-backup-20220224094824-data.tar.gzVisualiser les sauvegardes de volumes
velero repo getNAME STATUS LAST MAINTENANCE
test-default-kopia Ready 2026-03-02 13:57:31 +0100 CETRestauration de sauvegardes
Principe de restauration
Commande de base :velero create restore --from-backup <BACKUP-NAME>Exemples de restauration
Restauration complète d'un namespace
# Supprimer le namespace existant (si nécessaire)
kubectl delete namespace blog
# Restaurer depuis un backup
velero create restore --from-backup backup-blogRestauration d'un namespace vers un nouveau nom
velero create restore \
--from-backup backup-blog \
--namespace-mappings blog:blog-restoredRestauration sélective de ressources
# Restaurer uniquement les Deployments et Services
velero create restore \
--from-backup backup-blog \
--include-resources deployments,services
# Restaurer en excluant certaines ressources
velero create restore \
--from-backup backup-blog \
--exclude-resources secrets,configmapsVérifier l'état d'une restauration
velero restore get
# Voir les détails d'une restauration
velero restore describe <RESTORE-NAME>Gestion avancée des PersistentVolumes
Récupération d'un PV orphelin
Dans Kubernetes, lorsqu'un Namespace ou un PersistentVolumeClaim est supprimé, le PersistentVolume associé se retrouve sans attribution et sera supprimé ou conservé selon la ReclaimPolicy configurée.
Consultez la documentation officielle des PersistentVolumes pour plus de détails.
Procédure manuelle de récupération
Étape 1 : Passer le PV en mode Retain
Si le PersistentVolume est en ReclaimPolicy: Delete, passez-le en Retain :
kubectl patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'Étape 2 : Retirer le finalizer du PVC
kubectl patch pvc <your-pvc-name> --type=json --patch='[{"op": "remove", "path": "/metadata/finalizers"}]'Étape 3 : Supprimer le PVC
kubectl delete pvc <your-pvc-name>Le PV reste disponible grâce à la ReclaimPolicy: Retain.
Étape 4 : Retirer la référence au PVC dans le PV
kubectl patch pv <your-pv-name> --type=json --patch='[{"op": "remove", "path": "/spec/claimRef"}]'Étape 5 : Créer un nouveau PVC lié au PV existant
Créez un nouveau PVC en spécifiant le champ volumeName :
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: your-pvc-name
namespace: your-namespace
spec:
storageClassName: managed-nfs-storage
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
volumeName: pv0001Étape 6 : Appliquer le manifeste
kubectl apply -f pvc.yamlExemple complet
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: webapp-data
namespace: production
spec:
storageClassName: managed-nfs-storage
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
volumeName: pvc-z11fe0a2-919c-4f58-b2e9-f9bd1cf925ddBonnes pratiques
- Planification : Configurez des sauvegardes automatiques avec des schedules adaptés (quotidien, hebdomadaire)
- TTL : Définissez des durées de rétention cohérentes avec votre politique de sauvegarde (30j minimum recommandé)
- Volumes : N'oubliez pas l'annotation
backup.velero.io/backup-volumespour sauvegarder les volumes persistants - Tests de restauration : Testez régulièrement vos restaurations sur un namespace de test
- Documentation : Documentez vos schedules et stratégies de sauvegarde
- Monitoring : Surveillez l'état des sauvegardes avec
velero backup getet alertez en cas d'erreur
Commandes utiles récapitulatives
# Lister toutes les sauvegardes
velero backup get
# Lister tous les schedules
velero schedule get
# Créer une sauvegarde immédiate d'un namespace
velero backup create <nom> --include-namespaces <namespace>
# Restaurer une sauvegarde
velero restore create --from-backup <backup-name>
# Voir les logs d'une sauvegarde
velero backup logs <backup-name>
# Voir les logs d'une restauration
velero restore logs <restore-name>
# Supprimer une sauvegarde
velero backup delete <backup-name>
# Supprimer un schedule
velero schedule delete <schedule-name>