Velero — Sauvegarde & Restauration

Velero est un outil open-source de backup et restauration pour Kubernetes. Il permet de sauvegarder l’ensemble des ressources du cluster (manifests) et des volumes persistants, puis de les restaurer sur le même cluster ou un autre.


Ce que Velero sauvegarde

Velero backup
├── Ressources Kubernetes (Deployments, Services, ConfigMaps, Secrets…)
├── Namespaces
├── PersistentVolumeClaims + données (via snapshots ou Restic/Kopia)
└── Métadonnées RBAC, CustomResourceDefinitions…

Les backups sont stockés dans un object storage (S3, GCS, Azure Blob, MinIO…).


Architecture

velero (pod dans le cluster)
   │
   ├── surveille les ressources Kubernetes (via kube-apiserver)
   │
   ├── stocke les manifests YAML → Object Storage (ex: S3)
   │
   └── snapshots des volumes → Cloud provider snapshots ou Kopia/Restic

Installation via Helm

helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
helm repo update
 
helm install velero vmware-tanzu/velero \
  --namespace velero \
  --create-namespace \
  --set configuration.backupStorageLocation[0].name=default \
  --set configuration.backupStorageLocation[0].provider=aws \
  --set configuration.backupStorageLocation[0].bucket=mon-bucket-velero \
  --set configuration.backupStorageLocation[0].config.region=eu-west-1 \
  --set credentials.secretContents.cloud="[default]\naws_access_key_id=XXXX\naws_secret_access_key=YYYY"

Exemple : BackupStorageLocation (BSL)

Définit où stocker les backups (ici MinIO en self-hosted) :

apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
  name: default
  namespace: velero
spec:
  provider: aws                         # compatible S3
  objectStorage:
    bucket: velero-backups
    prefix: cluster-prod
  config:
    region: minio
    s3ForcePathStyle: "true"
    s3Url: http://minio.storage.svc:9000
  credential:
    name: minio-credentials
    key: cloud

Exemple : Backup manuel d’un namespace

apiVersion: velero.io/v1
kind: Backup
metadata:
  name: backup-production-2024
  namespace: velero
spec:
  includedNamespaces:
  - production
  storageLocation: default
  ttl: 720h                             # rétention 30 jours
  snapshotVolumes: true

Ou via CLI :

# Backup d'un namespace
velero backup create backup-prod --include-namespaces production
 
# Backup de tout le cluster
velero backup create backup-full
 
# Vérifier l'état
velero backup describe backup-prod
velero backup logs backup-prod

Exemple : Schedule (backup automatique)

apiVersion: velero.io/v1
kind: Schedule
metadata:
  name: backup-quotidien
  namespace: velero
spec:
  schedule: "0 2 * * *"               # tous les jours à 2h du matin
  template:
    includedNamespaces:
    - production
    - staging
    storageLocation: default
    ttl: 168h                          # rétention 7 jours
    snapshotVolumes: true

Restauration

# Lister les backups disponibles
velero backup get
 
# Restaurer un backup complet
velero restore create --from-backup backup-prod
 
# Restaurer uniquement certaines ressources
velero restore create \
  --from-backup backup-prod \
  --include-namespaces production \
  --include-resources deployments,services
 
# Vérifier la restauration
velero restore describe <nom-restore>

Cas d’usage

ScénarioSolution Velero
Migration cluster A → BBackup sur A, restore sur B
Suppression accidentelle d’un namespaceRestore du namespace depuis le backup
Mise à jour Kubernetes risquéeBackup avant, rollback si besoin
Disaster RecoveryBackup régulier vers S3 cross-region

Liens

  • etcd — Velero complète la sauvegarde etcd (etcd = état interne, Velero = ressources applicatives)
  • Plugins Kubernetes - Vue d’ensemble — vue globale
  • argocd — ArgoCD + Velero : GitOps pour les manifests, Velero pour les données