Gestion des sauvegardes
Vue d'ensemble
La sauvegarde des ressources Kubernetes est un élément critique de la stratégie de résilience et de continuité d'activité. SdV intègre Velero comme solution de backup pour l'ensemble des objets du cluster, permettant la sauvegarde et la restauration à la fois des ressources Kubernetes et des volumes persistants.
Objectifs de la sauvegarde
La stratégie de sauvegarde mise en place répond à plusieurs besoins opérationnels :
| Objectif | Description | Exemple d'usage |
|---|---|---|
| Disaster Recovery | Restauration complète après incident majeur | Corruption cluster, panne datacenter |
| Migration de cluster | Transfert d'applications entre environnements | Migration dev → staging → prod |
| Rollback applicatif | Retour arrière après déploiement défaillant | Annulation d'un release problématique |
| Clonage d'environnement | Duplication d'une configuration complète | Reproduction d'un bug en environnement isolé |
| Conformité et audit | Conservation de l'état du cluster à un instant T | Obligation réglementaire, forensic |
Architecture de sauvegarde
Composants Velero
Velero s'appuie sur plusieurs composants pour assurer la sauvegarde et la restauration :
| Composant | Type | Rôle |
|---|---|---|
| Velero Server | Deployment dans le namespace velero | Orchestrateur des opérations de backup/restore |
| Node Agent DaemonSet | DaemonSet sur chaque nœud worker | Sauvegarde des données des PersistentVolumes |
| Backend S3 | Stockage objet externe | Stockage distant et résilient des backups |
| Velero CLI | Outil en ligne de commande | Interface d'administration depuis un poste client |
Flux de sauvegarde

Périmètre de sauvegarde
Ressources sauvegardées
Velero peut sauvegarder l'ensemble des ressources Kubernetes ainsi que leurs données persistantes :
Ressources Kubernetes
| Type de ressource | Sauvegardé par défaut | Notes |
|---|---|---|
Namespaces | Oui | Structure et métadonnées |
Deployments, StatefulSets, DaemonSets | Oui | Définitions complètes |
Services, Ingress | Oui | Configuration réseau |
ConfigMaps, Secrets | Oui | Configuration applicative |
PersistentVolumeClaims | Non | Métadonnées + données si annotation spécifique présente sur le pod |
CustomResourceDefinitions (CRDs) | Oui | Définitions et instances |
ServiceAccounts, Roles, RoleBindings | Oui | Configuration RBAC |
NetworkPolicies | Oui | Politiques réseau |
Volumes persistants
| Type de volume | Méthode de sauvegarde | Performances |
|---|---|---|
Volumes NFS (managed-nfs-storage) | kopia (snapshot niveau fichier) | Moyennes (scan complet au 1er backup) |
PersistentVolumes avec hostPath | Non supporté par défaut | ⚠️ Non recommandé en production |
Volumes éphémères (emptyDir) | ❌ Non sauvegardé | Nature temporaire |
Filtrage et sélection
Velero offre des mécanismes de filtrage pour cibler précisément le périmètre de sauvegarde :
| Critère de filtrage | Exemple | Cas d'usage |
|---|---|---|
| Par namespace | --include-namespaces production,staging | Sauvegarder uniquement certains environnements |
| Par label | --selector app=webapp,tier=frontend | Sauvegarder un sous-ensemble d'objets |
| Par type de ressource | --include-resources deployments,services | Sauvegarder uniquement certaines ressources |
| Par exclusion | --exclude-namespaces dev,test | Exclure des environnements non-critiques |
Installation et configuration du CLI
Prérequis
Pour interagir avec Velero, vous devez disposer de :
- Accès au cluster Kubernetes : fichier
kubeconfigfourni par SdV (généralement nommékube_config_rke_config.yml) - Connexion réseau : accès à l'API Kubernetes (via VPN si cluster en mode privé)
- Droits suffisants : permissions RBAC pour lire/créer des ressources Velero
Téléchargement du CLI
Velero CLI est disponible pour les principaux systèmes d'exploitation :
| OS | Architecture | Lien de téléchargement |
|---|---|---|
| Linux | amd64 | velero-v1.17.1-linux-amd64.tar.gz |
| macOS | amd64 | velero-v1.17.1-darwin-amd64.tar.gz |
| Windows | amd64 | velero-v1.17.1-windows-amd64.tar.gz |
Installation
# Télécharger et extraire
wget https://github.com/vmware-tanzu/velero/releases/download/v1.17.1/velero-v1.17.1-linux-amd64.tar.gz
tar -xvzf velero-v1.17.1-linux-amd64.tar.gz
# Copier le binaire dans le PATH
sudo mv velero-v1.17.1-linux-amd64/velero /usr/local/bin/
# Vérifier l'installation
velero version --client-onlyConfiguration du kubeconfig
Pour que le CLI Velero puisse communiquer avec votre cluster, vous devez spécifier le fichier kubeconfig fourni par SdV :
Méthode 1 : Variable d'environnement (recommandée)
# Définir la variable d'environnement (à ajouter dans ~/.bashrc ou ~/.zshrc)
export KUBECONFIG=/chemin/vers/kube_config_rke_config.yml
# Vérifier la connexion
kubectl cluster-info
velero versionMéthode 2 : Option en ligne de commande
# Spécifier le kubeconfig à chaque commande
velero backup get --kubeconfig=/chemin/vers/kube_config_rke_config.ymlValidation de l'installation
Une fois le CLI installé et configuré, vérifiez la communication avec le cluster :
# Vérifier la version du CLI et du serveur Velero
velero version
# Lister les backups existants
velero backup get
# Vérifier la configuration du backend de stockage
velero backup-location get
# Vérifier le statut de la sauvegarde des volumes persistants
velero repo getClient:
Version: v1.17.1
Git commit: -
Server:
Version: v1.17.1Opérations de sauvegarde
Sauvegarde ponctuelle
Sauvegarde complète d'un namespace
# Sauvegarder tous les objets d'un namespace
velero backup create backup-production-$(date +%Y%m%d-%H%M%S) \
--include-namespaces production \
--wait
# Surveiller la progression
velero backup describe backup-production-20260219-143000 --details--include-namespaces: liste des namespaces à sauvegarder--wait: attend la fin du backup avant de rendre la main
Sauvegarde sélective par labels
# Sauvegarder uniquement les ressources avec un label spécifique
velero backup create backup-webapp-$(date +%Y%m%d-%H%M%S) \
--selector app=webapp,environment=production \Sauvegarde multi-namespaces
# Sauvegarder plusieurs namespaces
velero backup create backup-multi-ns-$(date +%Y%m%d-%H%M%S) \
--include-namespaces production,staging,integration \Sauvegarde complète du cluster
# Sauvegarder l'intégralité du cluster (hors namespaces système)
velero backup create backup-cluster-complet-$(date +%Y%m%d-%H%M%S) \
--exclude-namespaces kube-system,kube-public,kube-node-lease,velero \Sauvegarde planifiée (Schedule)
Les sauvegardes planifiées garantissent une protection continue sans intervention manuelle.
Créer une sauvegarde quotidienne
# Sauvegarde quotidienne à 2h00 du matin
velero schedule create daily-production \
--schedule="0 2 * * *" \
--include-namespaces production \
--ttl 720h0m0s--schedule: expression cron (format standard Unix)--ttl: durée de rétention (ici 30 jours = 720 heures)
Exemples d'expressions cron
| Expression | Description | Heure d'exécution |
|---|---|---|
0 2 * * * | Tous les jours à 2h00 | Quotidien |
0 3 * * 0 | Tous les dimanches à 3h00 | Hebdomadaire |
0 4 1 * * | Le 1er de chaque mois à 4h00 | Mensuel |
0 */6 * * * | Toutes les 6 heures | Toutes les 6h |
0 0 * * 1-5 | Du lundi au vendredi à minuit | Jours ouvrés |
Lister les sauvegardes planifiées
# Afficher toutes les schedules
velero schedule get
# Détails d'une schedule
velero schedule describe daily-productionModifier ou supprimer une schedule
# Supprimer une schedule
velero schedule delete daily-production
# Mettre en pause temporairement (la schedule reste définie mais n'est plus exécutée)
kubectl patch schedule daily-production -n velero --type merge -p '{"spec":{"paused":true}}'
# Réactiver une schedule en pause
kubectl patch schedule daily-production -n velero --type merge -p '{"spec":{"paused":false}}'Surveiller les sauvegardes
Lister les backups
# Lister tous les backups
velero backup get
# Filtrer par statut
velero backup get --selector velero.io/schedule-name=daily-production
# Afficher les backups des 7 derniers jours
velero backup get --selector 'velero.io/backup.expiration-date>'$(date -d '7 days ago' +%Y-%m-%d)Vérifier le statut d'un backup
# Statut résumé
velero backup describe backup-production-20260219-143000
# Statut détaillé avec liste des erreurs éventuelles
velero backup describe backup-production-20260219-143000 --details
# Consulter les logs
velero backup logs backup-production-20260219-143000New: backup créé mais pas encore démarréInProgress: backup en coursCompleted: backup terminé avec succèsPartiallyFailed: backup terminé mais avec des erreurs non-bloquantesFailed: backup échoué
Télécharger un backup localement
# Télécharger les métadonnées et les ressources d'un backup
velero backup download backup-production-20260219-143000 \
--output-dir ./backup-export/
# Cette commande télécharge :
# - backup-production-20260219-143000.tar.gz (ressources Kubernetes)
# - backup-production-20260219-143000-logs.gz (logs du backup)Suppression de backups
# Supprimer un backup unique
velero backup delete backup-production-20260219-143000
# Supprimer tous les backups expirés
velero backup delete --expired
# Supprimer tous les backups d'une schedule
velero backup delete --selector velero.io/schedule-name=daily-production --confirmOpérations de restauration
Restauration complète
Restaurer un namespace complet
# Restaurer un namespace depuis un backup
velero restore create restore-production-$(date +%Y%m%d-%H%M%S) \
--from-backup backup-production-20260219-143000 \
--wait
# Surveiller la progression
velero restore describe restore-production-20260219-143000 --detailsRestaurer plusieurs namespaces
# Restaurer plusieurs namespaces spécifiques
velero restore create restore-multi-ns-$(date +%Y%m%d-%H%M%S) \
--from-backup backup-multi-ns-20260219-143000 \
--include-namespaces production,stagingRestauration sélective
Restaurer uniquement certaines ressources
# Restaurer uniquement les Deployments et Services
velero restore create restore-partial-$(date +%Y%m%d-%H%M%S) \
--from-backup backup-production-20260219-143000 \
--include-resources deployments,services \
--include-namespaces productionRestaurer avec mapping de namespace
# Restaurer dans un namespace différent (utile pour tests)
velero restore create restore-production-to-test-$(date +%Y%m%d-%H%M%S) \
--from-backup backup-production-20260219-143000 \
--namespace-mappings production:test-production- Cloner un environnement de production vers staging
- Tester une restauration sans impacter la production
- Debugger un problème dans un environnement isolé
Restaurer par labels
# Restaurer uniquement les ressources avec un label spécifique
velero restore create restore-webapp-$(date +%Y%m%d-%H%M%S) \
--from-backup backup-production-20260219-143000 \
--selector app=webapp,tier=frontendGestion des conflits
Par défaut, Velero ne restaure pas les ressources déjà existantes dans le cluster pour éviter les écrasements accidentels.
Forcer la restauration (écraser les ressources existantes)
# Restaurer en écrasant les ressources existantes
velero restore create restore-force-$(date +%Y%m%d-%H%M%S) \
--from-backup backup-production-20260219-143000 \
--existing-resource-policy=updatenone(défaut) : ignore les ressources existantesupdate: met à jour les ressources existantes avec les données du backup
Surveiller les restaurations
# Lister toutes les restaurations
velero restore get
# Détails d'une restauration
velero restore describe restore-production-20260219-143000
# Logs de restauration
velero restore logs restore-production-20260219-143000New: restauration créée mais pas encore démarréeInProgress: restauration en coursCompleted: restauration terminée avec succèsPartiallyFailed: restauration terminée mais avec des erreurs non-bloquantesFailed: restauration échouée
Validation post-restauration
Après une restauration, vérifiez systématiquement l'état du cluster :
# Vérifier les Pods du namespace restauré
kubectl get pods -n production
# Vérifier les événements récents
kubectl get events -n production --sort-by='.lastTimestamp'
# Vérifier les PVC et leur montage
kubectl get pvc -n production
kubectl describe pvc <pvc-name> -n production
# Tester la connectivité applicative
kubectl run test-curl --image=curlimages/curl:latest -it --rm -- sh
# Dans le pod : curl http://mon-service.production.svc.cluster.localBonnes pratiques
Stratégie de sauvegarde
Fréquence de sauvegarde recommandée
| Environnement | Fréquence | Rétention | Justification |
|---|---|---|---|
| Production | Quotidienne (2h00) | 30 jours | Balance entre protection et coût de stockage |
| Staging | Hebdomadaire | 14 jours | Environnement moins critique |
| Développement | Optionnel | 7 jours | Données facilement reconstituables |
Sauvegardes avant maintenance
Effectuez toujours une sauvegarde immédiatement avant :
- Mise à jour majeure d'une application
- Modification de la configuration réseau ou stockage
- Intervention sur l'infrastructure du cluster
- Opération de migration ou de réorganisation
# Backup pré-maintenance avec annotation
velero backup create pre-maintenance-$(date +%Y%m%d-%H%M%S) \
--include-namespaces production \
--labels maintenance=true,date=$(date +%Y%m%d)Sécurité et confidentialité
Protection des Secrets
Les objets Secret Kubernetes sont sauvegardés par Velero. Pour une sécurité renforcée :
# Exclure les Secrets de la sauvegarde (si géré par un vault externe)
velero backup create backup-no-secrets-$(date +%Y%m%d-%H%M%S) \
--include-namespaces production \
--exclude-resources secretsAlternativement, utilisez une solution de gestion de secrets externe (HashiCorp Vault, Sealed Secrets, etc.) pour ne pas persister les secrets sensibles dans les backups.
Contrôle d'accès RBAC
Limitez l'accès aux opérations Velero via des RoleBindings Kubernetes :
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: velero-operator
namespace: production
subjects:
- kind: User
name: ops-team@sdv.fr
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: velero-operator
apiGroup: rbac.authorization.k8s.ioTests de restauration
Fréquence de test recommandée
| Fréquence | Type de test | Environnement cible |
|---|---|---|
| Mensuel | Restauration complète d'un namespace | Cluster de test dédié |
| Trimestriel | Disaster Recovery complet | Nouveau cluster temporaire |
| Avant migration | Restauration dans l'environnement cible | Cluster destination |
Procédure de test type
# 1. Créer un namespace de test
kubectl create namespace test-restore-$(date +%Y%m%d)
# 2. Restaurer le backup dans ce namespace
velero restore create test-restore-$(date +%Y%m%d-%H%M%S) \
--from-backup backup-production-20260219-143000 \
--namespace-mappings production:test-restore-20260219
# 3. Valider le fonctionnement
kubectl get all -n test-restore-20260219
# 4. Nettoyer après validation
kubectl delete namespace test-restore-20260219Monitoring et alerting
Vérification automatique des backups
Mettez en place un monitoring automatique pour détecter les échecs de backup :
# Lister les backups en erreur
velero backup get | grep -E "Failed|PartiallyFailed"
# Vérifier qu'au moins un backup récent existe
velero backup get | grep "Completed" | head -1- Statut du dernier backup (succès/échec)
- Temps écoulé depuis le dernier backup réussi
- Taille des backups (détection de dérives)
- Durée d'exécution des backups (dégradation des performances)
Intégration avec Prometheus
Velero expose des métriques Prometheus accessibles via un ServiceMonitor :
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: velero
namespace: velero
spec:
selector:
matchLabels:
app.kubernetes.io/name: velero
endpoints:
- port: monitoring
path: /metricsvelero_backup_total: nombre total de backups créésvelero_backup_success_total: nombre de backups réussisvelero_backup_failure_total: nombre de backups échouésvelero_backup_duration_seconds: durée des backups
Optimisation des performances
Accélérer les sauvegardes
# Exclure les namespaces non-critiques
velero backup create backup-optimized-$(date +%Y%m%d-%H%M%S) \
--include-namespaces production \
--exclude-resources events,events.events.k8s.io
# Exclure les volumes temporaires
velero backup create backup-no-tmpfs-$(date +%Y%m%d-%H%M%S) \
--include-namespaces production \
--snapshot-volumes=falseUtiliser les annotations pour contrôler la sauvegarde des volumes persistants
apiVersion: v1
kind: Pod
metadata:
name: webapp
namespace: production
annotations:
# Ignorer ce Pod dans les backups de volume persistant
backup.velero.io/backup-volumes-excludes: cache-volume,tmp-volume
spec:
containers:
- name: webapp
image: webapp:1.0
volumeMounts:
- name: data-volume
mountPath: /data
- name: cache-volume
mountPath: /cache
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: webapp-data
- name: cache-volume
emptyDir: {}Rétention et nettoyage
Définir une politique de rétention
# Schedule avec rétention de 30 jours
velero schedule create production-30d \
--schedule="0 2 * * *" \
--include-namespaces production \
--ttl 720h0m0s
# Schedule avec rétention de 90 jours (backups mensuels)
velero schedule create production-monthly \
--schedule="0 3 1 * *" \
--include-namespaces production \
--ttl 2160h0m0sNettoyage manuel
# Supprimer les backups de plus de 60 jours
velero backup get -o json | jq -r '.items[] | select(.status.expiration < now) | .metadata.name' | xargs -I {} velero backup delete {}
# Supprimer tous les backups d'un namespace supprimé
velero backup delete --selector velero.io/namespace=ancien-namespace --confirmDépannage et résolution de problèmes
Problèmes courants
Backup bloqué en état InProgress
Symptômes :
velero backup get
# NAME STATUS ...
# backup-prod InProgress ...# Vérifier les logs du backup
velero backup logs backup-prod
# Vérifier les Pods Velero
kubectl get pods -n velero
# Vérifier les logs du serveur Velero
kubectl logs -n velero deployment/velero -f- Vérifier la connectivité au backend S3
- Vérifier les quotas de stockage
- Redémarrer le serveur Velero si nécessaire :
kubectl rollout restart deployment/velero -n velero
Échec de sauvegarde des volumes
Symptômes :PartiallyFailed: some volumes failed to backup# Vérifier le status
velero repo get
# Vérifier les logs du DaemonSet
kubectl logs -n velero daemonset/node-agent -f- Volume non compatible (ex:
hostPath) - Permissions insuffisantes sur le volume
- Ajouter l'annotation
backup.velero.io/backup-volumessur lesPods
Restauration partielle
Symptômes :PartiallyFailed: some resources failed to restore# Afficher les erreurs détaillées
velero restore describe <restore-name> --details
# Vérifier les événements Kubernetes
kubectl get events -A --sort-by='.lastTimestamp' | grep -i errorStorageClassnon disponible sur le cluster cibleCustomResourceDefinitionsmanquantes- Conflits de noms avec des ressources existantes
- Quotas de ressources dépassés
- Installer les
CRDsmanquantes avant la restauration - Utiliser
--existing-resource-policy=updatesi approprié - Augmenter les quotas du namespace
Collecte d'informations pour le support
En cas de problème persistant, collectez les informations suivantes avant de contacter le support SdV :
# Dump complet de la configuration Velero
kubectl get all -n velero -o yaml > velero-resources.yaml
# Logs du serveur Velero
kubectl logs -n velero deployment/velero --tail=500 > velero-server.log
# Logs node-agent
kubectl logs -n velero daemonset/node-agent --tail=500 --all-containers=true > node-agent.log
# Configuration du backend de stockage
velero backup-location get -o yaml > backup-locations.yaml
# Liste des backups et restaurations récentes
velero backup get > backups-list.txt
velero restore get > restores-list.txtRessources complémentaires
Documentation officielle
- Documentation complète Velero v1.17.1 : velero.io/docs/v1.17
- Guide de dépannage : troubleshooting
- API Reference : api-types
Pages liées
- Guide pratique Velero : Exemples d'utilisation détaillés
- Stockage persistant : Configuration des StorageClass
- Démarrage rapide : Premiers pas avec le cluster
Support SdV
Pour toute question ou assistance sur la configuration avancée de Velero :
- Email support technique : support@sdv.fr
- Outil de requêtes : requete.sdv.fr
- Hotline : Consultez votre documentation de livraison pour les coordonnées