Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

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 :

Terminal
kubectl -n velero get deploy velero -o=jsonpath='{.spec.template.spec.containers[0].image}' | cut -d: -f2

Configuration 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 :

Terminal
velero <commande> --kubeconfig=/path/to/kubeconfig

Pour forcer le contexte à utiliser :

Terminal
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.

Pour limiter le backup à un ou plusieurs namespaces :
Terminal
velero <commande> --include-namespaces namespace1,namespace2
Pour exclure un ou plusieurs namespaces :
Terminal
velero <commande> --exclude-namespaces namespace1,namespace2

Duré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.

Exemples :
DuréeFormatDescription
30 jours720h0m0sRétention standard
7 jours168h0m0sRétention courte
90 jours2160h0m0sRétention longue

Cas d'usage et exemples

Programmer une sauvegarde récurrente

Exemple avec une sauvegarde quotidienne en gardant 30 jours de rétention :

Terminal
velero create schedule dailybackup-name \
  --schedule="@every 24h" \
  --ttl 720h0m0s
ArgumentDescription
create schedule dailybackup-nameCréer une tâche de sauvegarde programmée nommée dailybackup-name
--schedule="@every 24h"Exécution toutes les 24 heures
--ttl 720h0m0sDurée de conservation des sauvegardes : 720h (30 jours)
Autres syntaxes de planification :
Terminal
# 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 2160h0m0s

Créer une sauvegarde ponctuelle

Pour effectuer immédiatement une sauvegarde du namespace backup-test :

Terminal
velero create backup backup-test --include-namespaces backup-test
Exemples avancés :
Terminal
# 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 720h0m0s

Sauvegarde 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 :

deployment.yaml
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-claim

Ici, 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é.

Terminal
velero create schedule my-deployment-backup \
  --include-namespaces my-namespace \
  --schedule='0 5 * * *' \
  --ttl 720h0m0s
ArgumentDétail
create schedule my-deployment-backupCréer une tâche de sauvegarde programmée se nommant my-deployment-backup
--include-namespaces my-namespaceLa 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 720h0m0sDéfinis la durée de conservation des sauvegardes à 720h soit 30 jours

Visualisation et monitoring

Visualiser les sauvegardes programmées

Terminal
velero schedule get
Exemple de sortie :
NAME                 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

Terminal
velero backup get
Exemple de sortie :
NAME                                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

Terminal
velero describe backup my-deployment-backup-20220224094824
Exemple de sortie :
Name:         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:  6

Ajoutez l'argument --details pour voir le détail des entités et volumes sauvegardés :

Terminal
velero describe backup my-deployment-backup-20220224094824 --details

Télécharger une sauvegarde réalisée (manifestes YAML)

Terminal
velero backup download my-deployment-backup-20220224094824
Sortie attendue :
Backup my-deployment-backup-20220224094824 has been successfully downloaded to ./my-deployment-backup-20220224094824-data.tar.gz

Visualiser les sauvegardes de volumes

Terminal
velero repo get
Exemple de sortie :
NAME                            STATUS   LAST MAINTENANCE
test-default-kopia              Ready    2026-03-02 13:57:31 +0100 CET

Restauration de sauvegardes

Principe de restauration

Commande de base :
Terminal
velero create restore --from-backup <BACKUP-NAME>

Exemples de restauration

Restauration complète d'un namespace

Terminal
# Supprimer le namespace existant (si nécessaire)
kubectl delete namespace blog
 
# Restaurer depuis un backup
velero create restore --from-backup backup-blog

Restauration d'un namespace vers un nouveau nom

Terminal
velero create restore \
  --from-backup backup-blog \
  --namespace-mappings blog:blog-restored

Restauration sélective de ressources

Terminal
# 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,configmaps

Vérifier l'état d'une restauration

Terminal
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 :

Terminal
kubectl patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'

Étape 2 : Retirer le finalizer du PVC

Terminal
kubectl patch pvc <your-pvc-name> --type=json --patch='[{"op": "remove", "path": "/metadata/finalizers"}]'

Étape 3 : Supprimer le PVC

Terminal
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

Terminal
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 :

pvc.yaml
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

Terminal
kubectl apply -f pvc.yaml

Exemple complet

pvc.yaml
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-f9bd1cf925dd

Bonnes 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-volumes pour 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 get et alertez en cas d'erreur

Commandes utiles récapitulatives

Terminal
# 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>