Stockage

Velero

Sauvegarde et restauration K8s - ressources + volumes persistants. Backends S3, Azure Blob, GCS. Migrations de clusters, DR et snapshots programmés via CRDs.

Velero est l'outil de référence pour la sauvegarde, la restauration et la migration de clusters Kubernetes. Il sauvegarde deux choses distinctes : les ressources Kubernetes (Deployments, Services, ConfigMaps, Secrets, etc.) en les sérialisant dans un object storage, et les données des volumes persistants via des snapshots cloud ou via Kopia (agent de sauvegarde fichier inclus).

Velero est développé par VMware (Broadcom) et est un projet CNCF. Il s'utilise via sa CLI et expose des CRDs (Backup, Restore, Schedule) pour automatiser les sauvegardes.


Informations essentielles

Origine : VMware / Heptio → CNCF  ·  Licence : Apache 2.0  ·  Architectures : x86_64, ARM64

Liens : Site officiel  ·  Documentation  ·  GitHub  ·  Releases

Support : Les 3 dernières versions mineures sont maintenues.

Stack par défaut

ComposantValeur
Sauvegarde ressources K8sObject storage (S3, Azure Blob, GCS, MinIO…)
Sauvegarde volumes PVKopia (agent fichier) ou snapshots cloud natifs
Format de sauvegardeTar compressé dans l'object storage
PlanificationCRD Schedule (cron) ou CLI
RestaurationSélective par namespace, label, ressource

Concepts clés

ConceptDescription
BackupStorageLocation (BSL)Où stocker les sauvegardes (bucket S3, conteneur Azure…)
VolumeSnapshotLocation (VSL)Où stocker les snapshots de volumes (AWS EBS, GCE PD…)
BackupRessource CRD représentant une sauvegarde à un instant T
RestoreRessource CRD pour restaurer depuis un Backup
ScheduleSauvegarde récurrente (format cron)
BackupRepositoryStockage Kopia pour les données des volumes

Sauvegarde des volumes PV

Deux approches :

ApprocheMécanismeUsage
Kopia (file-system backup)Agent copie les fichiers du volumeTout stockage, indépendant du cloud
Snapshots natifsAPI snapshot du provider cloud (AWS EBS, GCE PD, Azure Disk)Cloud uniquement
CSI SnapshotsVolumeSnapshot Kubernetes (CSI)Clusters avec CSI driver compatible

Prérequis

RessourceValeur
Kubernetes1.20+
kubectlCompatible avec le cluster
Object storageBucket S3, Azure Blob, GCS ou MinIO
velero CLIÀ installer sur le poste de travail

Installation

1. Installer la CLI Velero

# Linux
VELERO_VERSION=v1.13.0
curl -Lo velero.tar.gz \
  https://github.com/vmware-tanzu/velero/releases/download/${VELERO_VERSION}/velero-${VELERO_VERSION}-linux-amd64.tar.gz
tar -xzf velero.tar.gz
sudo mv velero-*/velero /usr/local/bin/
velero version --client-only

2. Installer Velero sur le cluster (backend S3 / MinIO)

# Créer le fichier de credentials S3
cat > credentials-velero <<EOF
[default]
aws_access_key_id=<ACCESS_KEY>
aws_secret_access_key=<SECRET_KEY>
EOF

# Installer Velero avec le plugin AWS
velero install \
  --provider aws \
  --plugins velero/velero-plugin-for-aws:v1.9.0 \
  --bucket velero-backups \
  --secret-file ./credentials-velero \
  --backup-location-config region=eu-west-1 \
  --snapshot-location-config region=eu-west-1 \
  --use-node-agent                          # Active Kopia pour les volumes PV

# Vérifier
kubectl get pods -n velero
velero backup-location get

Avec MinIO (self-hosted S3)

velero install \
  --provider aws \
  --plugins velero/velero-plugin-for-aws:v1.9.0 \
  --bucket velero \
  --secret-file ./credentials-velero \
  --use-node-agent \
  --backup-location-config \
    region=minio,s3ForcePathStyle=true,s3Url=http://minio.minio.svc.cluster.local:9000

Via Helm

helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
helm install velero vmware-tanzu/velero \
  --namespace velero --create-namespace \
  -f velero-values.yaml

Vérification de l'installation

# 1. Pods Velero
kubectl get pods -n velero
# velero-* (1/1) et node-agent-* (1/1 sur chaque nœud si --use-node-agent)

# 2. Vérifier la connexion au backend de stockage
velero backup-location get
# PHASE doit être Available, LAST VALIDATED récent (< 1 min)
# Si Unavailable : credentials incorrects ou bucket inaccessible

# 3. Tester avec un backup de validation rapide (namespace kube-system léger)
velero backup create install-check \
  --include-namespaces kube-system \
  --exclude-resources pods,events
velero backup get install-check
# STATUS doit passer InProgress → Completed (quelques secondes)

# 4. Vérifier les logs en cas de problème
kubectl logs -n velero -l component=velero --tail=50

# 5. Nettoyer le backup de test
velero backup delete install-check --confirm

Pièges courants à l'installation

SymptômeCauseCorrection
BackupStorageLocation UnavailableBucket inexistant ou credentials incorrectsVérifier le bucket + le secret credentials-velero
BackupStorageLocation UnavailableEndpoint S3 inaccessible depuis le clusterVérifier la connectivité réseau K8s → S3
Backup PartiallyFailedRessources cluster-scoped sans permissionAjouter --exclude-resources pour les ressources problématiques
Volumes PV non sauvegardés--default-volumes-to-fs-backup manquantAjouter le flag ou annoter les pods
node-agent non présent sur un nœudNœud ajouté après installationRedéployer : kubectl rollout restart ds/node-agent -n velero

Sauvegardes

Sauvegarde manuelle

# Sauvegarde complète du cluster
velero backup create cluster-backup-$(date +%Y%m%d)

# Sauvegarde d'un namespace uniquement
velero backup create prod-backup \
  --include-namespaces production

# Sauvegarde avec volumes (Kopia)
velero backup create prod-backup-with-pv \
  --include-namespaces production \
  --default-volumes-to-fs-backup

# Exclure des ressources
velero backup create prod-backup \
  --include-namespaces production \
  --exclude-resources secrets,events

# Vérifier
velero backup get
velero backup describe prod-backup
velero backup logs prod-backup

Sauvegarde planifiée (Schedule)

# Sauvegarde quotidienne à 3h
velero schedule create daily-backup \
  --schedule="0 3 * * *" \
  --include-namespaces production \
  --default-volumes-to-fs-backup \
  --ttl 720h0m0s             # Rétention 30 jours

# Lister les schedules
velero schedule get

# Déclencher manuellement depuis un schedule
velero backup create --from-schedule daily-backup

Via CRD

apiVersion: velero.io/v1
kind: Schedule
metadata:
  name: daily-production
  namespace: velero
spec:
  schedule: "0 3 * * *"
  template:
    includedNamespaces:
    - production
    defaultVolumesToFsBackup: true
    ttl: 720h0m0s
    storageLocation: default

Restauration

# Lister les backups disponibles
velero backup get

# Restaurer un namespace dans le cluster actuel
velero restore create --from-backup prod-backup \
  --include-namespaces production

# Restaurer dans un namespace différent
velero restore create --from-backup prod-backup \
  --include-namespaces production \
  --namespace-mappings production:production-restored

# Restaurer uniquement certaines ressources
velero restore create --from-backup prod-backup \
  --include-resources deployments,services,configmaps

# Vérifier l'état de la restauration
velero restore get
velero restore describe <restore-name>
velero restore logs <restore-name>

Migration de cluster

Velero permet de migrer des workloads d'un cluster source vers un cluster cible via un object storage partagé.

# --- Sur le cluster SOURCE ---

# 1. Configurer Velero avec le même bucket que le cluster cible
# 2. Lancer une sauvegarde du namespace à migrer
velero backup create migration-backup \
  --include-namespaces production \
  --default-volumes-to-fs-backup

# Attendre la fin
velero backup get migration-backup

# --- Sur le cluster CIBLE ---

# 3. Installer Velero avec les mêmes credentials bucket
# 4. Synchroniser les backups (auto-sync toutes les minutes)
velero backup-location get          # Doit voir le backup du cluster source

# 5. Restaurer
velero restore create --from-backup migration-backup

Hooks pre/post sauvegarde

Pour assurer la cohérence des bases de données, exécuter un flush avant la sauvegarde :

# Annotation sur le pod (ex: MySQL)
metadata:
  annotations:
    pre.hook.backup.velero.io/command: '["/bin/bash", "-c", "mysql -u root -p$MYSQL_ROOT_PASSWORD -e \"FLUSH TABLES WITH READ LOCK\""]'
    pre.hook.backup.velero.io/timeout: "60s"
    post.hook.backup.velero.io/command: '["/bin/bash", "-c", "mysql -u root -p$MYSQL_ROOT_PASSWORD -e \"UNLOCK TABLES\""]'

Mise à jour

# Mettre à jour la CLI
curl -Lo velero.tar.gz \
  https://github.com/vmware-tanzu/velero/releases/download/v1.13.0/velero-v1.13.0-linux-amd64.tar.gz
tar -xzf velero.tar.gz && sudo mv velero-*/velero /usr/local/bin/

# Mettre à jour le déploiement cluster
velero install --upgrade \
  --provider aws \
  --plugins velero/velero-plugin-for-aws:v1.9.0 \
  ...

Troubleshooting

# Logs du serveur Velero
kubectl logs -n velero -l component=velero --tail=100

# Logs de l'agent node-agent (Kopia)
kubectl logs -n velero -l name=node-agent --tail=100

# Vérifier la connexion au backend de stockage
velero backup-location get
velero backup-location check

# Backup en erreur
velero backup describe <nom>
velero backup logs <nom>

Backup en état PartiallyFailed

# Voir les ressources qui ont échoué
velero backup describe <nom> --details

# Souvent : permission manquante sur une ressource cluster-scoped
# Ajouter --exclude-resources sur les ressources problématiques

Volume PV non sauvegardé

# Vérifier que --default-volumes-to-fs-backup est utilisé
# OU que l'annotation est présente sur le pod
kubectl get pod <pod> -o yaml | grep backup.velero.io

# Vérifier que node-agent tourne sur tous les nœuds
kubectl get pods -n velero -l name=node-agent

Commandes utiles

velero backup get                          # Lister les sauvegardes
velero backup describe <nom> --details     # Détail complet d'une sauvegarde
velero backup delete <nom>                 # Supprimer une sauvegarde
velero schedule get                        # Lister les schedules
velero restore get                         # Lister les restaurations
velero backup-location get                 # Vérifier les backends de stockage
velero version                             # Version client + serveur

Ressources

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic