Sauvegardes et restaurations Kubernetes
Introduction
Velero est un outil open source permettant de sauvegarder et de restaurer en toute sécurité les ressources d'un cluster Kubernetes, d'effectuer une reprise d'activité et de migrer les ressources et les volumes persistants vers un autre cluster. Ce guide couvre :
- l'installation complète sur Kubernetes Numspot ;
- les stratégies de sauvegarde pour etcd et les nœuds ;
- les procédures de sauvegarde et de restauration complètes du cluster ;
- les scénarios de migration inter-fournisseurs ;
- l'intégration avec le pilote CSI Outscale BSU de Numspot.
Fonctionnalités clés
- Sauvegarde et restauration : sauvegardes complètes du cluster incluant les espaces de noms, les ressources et les volumes persistants ;
- Reprise d'activité : restauration complète du cluster depuis le stockage de sauvegarde ;
- Migration de cluster : migration des charges de travail entre clusters et fournisseurs cloud ;
- Sauvegardes planifiées : politiques de sauvegarde automatisées avec rétention ;
- Sauvegarde sélective : sauvegarde d'espaces de noms, de ressources ou d'étiquettes spécifiques.
Prérequis
Sur le cluster Numspot
- un cluster Kubernetes v1.16+ avec le DNS et la mise en réseau des conteneurs activés ;
kubectlinstallé et configuré ;- un accès au stockage objet (compatible S3) ;
- un pilote CSI pour les volumes persistants (Outscale BSU CSI est disponible par défaut).
Prérequis de stockage
Velero nécessite deux types de stockage :
- Stockage objet : pour les métadonnées de sauvegarde et les manifestes de ressources Kubernetes (compatible S3).
- Instantanés de volumes : pour les données de volumes persistants (utilise les instantanés Outscale BSU).
Informations requises
- le nom du compartiment (bucket) de stockage objet et les identifiants ;
- la région du compartiment (pour la région Numspot Standard :
eu-west-2) ; - la clé d'accès et la clé secrète pour le stockage compatible S3.
Installation
Étape 1 : Installer Velero CLI
macOS
# Avec Homebrew
brew install velero
# Ou téléchargement manuel
cd /tmp
curl -sLO https://github.com/vmware-tanzu/velero/releases/download/v1.13.2/velero-v1.13.2-darwin-amd64.tar.gz
tar -xzf velero-v1.13.2-darwin-amd64.tar.gz
mkdir -p ~/bin
mv velero-v1.13.2-darwin-amd64/velero ~/bin/
export PATH=$PATH:~/bin
Linux
cd /tmp
curl -sLO https://github.com/vmware-tanzu/velero/releases/download/v1.13.2/velero-v1.13.2-linux-amd64.tar.gz
tar -xzf velero-v1.13.2-linux-amd64.tar.gz
sudo mv velero-v1.13.2-linux-amd64/velero /usr/local/bin/
Vérifiez l'installation :
velero version --client-only
Étape 2 : Créer les identifiants de stockage compatible S3
Velero nécessite des identifiants pour accéder au stockage objet. Créez un fichier d'identifiants :
cat > ~/.aws/credentials-velero <<EOF
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
EOF
Pour le stockage objet Numspot :
- obtenez les identifiants depuis la Console Numspot ;
- stockez-les dans la section IAM ;
- le point d'accès (endpoint) sera :
https://oos.eu-west-2.numspot.com.
Étape 3 : Installer Velero sur le cluster
Option A : Utiliser un stockage objet compatible S3 (recommandé pour Numspot)
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.9.2 \
--bucket YOUR_BUCKET_NAME \
--region eu-west-2 \
--secret-file ~/.aws/credentials-velero \
--backup-location-config region=eu-west-2,s3ForcePathStyle=true,s3Url=https://oos.eu-west-2.numspot.com \
--snapshot-location-config region=eu-west-2 \
--use-volume-snapshots=true \
--use-node-agent \
--features=EnableCSI \
--namespace velero
Principaux paramètres :
--provider aws: utilise le plugin AWS (compatible S3).--plugins: plugin AWS pour les opérations S3.--bucket: le nom de votre compartiment (bucket) de stockage objet.--region: la région Numspot (eu-west-2).--s3ForcePathStyle=true: requis pour le stockage compatible S3.--s3Url: le point d'accès du stockage objet Numspot.--use-node-agent: active la sauvegarde du système de fichiers pour les volumes.--features=EnableCSI: active la prise en charge des instantanés (snapshots) CSI (volumes block storage).
Option B : Installation minimale (sans Snapshots CSI)
Si vous n'avez pas besoin d'instantanés (snapshots) de volumes persistants :
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.9.2 \
--bucket YOUR_BUCKET_NAME \
--region eu-west-2 \
--secret-file ~/.aws/credentials-velero \
--backup-location-config region=eu-west-2,s3ForcePathStyle=true,s3Url=https://oos.eu-west-2.numspot.com \
--use-volume-snapshots=false
Étape 4 : Vérifier l'installation
# Vérifier les pods Velero
kubectl get pods -n velero
# Vérifier l'emplacement de stockage de sauvegarde
velero backup-location get
# Vérifier l'emplacement des instantanés
velero snapshot-location get
# Vérifier la version de Velero
velero version
Sortie attendue :
NAME PHASE LAST VALIDATED ACCESS MODE DEFAULT
default Available 1m ago ReadWrite true
NAME PROVIDER LOCATION
default aws eu-west-2
Configuration
Configurer l'emplacement de stockage de sauvegarde
Si vous devez ajouter des emplacements de sauvegarde supplémentaires :
velero backup-location create secondary-backup \
--provider aws \
--bucket SECONDARY_BUCKET \
--region eu-west-2 \
--config region=eu-west-2,s3ForcePathStyle=true,s3Url=https://oos.eu-west-2.numspot.com
Configurer l'emplacement des instantanés
Ajoutez des emplacements d'instantanés pour différentes régions :
velero snapshot-location create secondary-snapshots \
--provider aws \
--config region=eu-west-2
Définir la durée de vie par défaut des sauvegardes
Créez une planification avec une politique de rétention :
velero schedule create daily-backup \
--schedule="0 2 * * *" \
--include-namespaces '*' \
--ttl 720h0m0s # rétention de 30 jours
Configurer les demandes de ressources
Modifiez le déploiement Velero pour les clusters plus volumineux :
kubectl set resources deployment/velero \
-n velero \
--containers=velero \
--requests=cpu=500m,memory=512Mi \
--limits=cpu=1000m,memory=1Gi
Opérations de sauvegarde
Types de sauvegarde
1. Sauvegarde complète du cluster
Sauvegardez toutes les ressources, y compris les ressources à l'échelle du cluster :
velero backup create full-cluster-backup \
--include-cluster-resources=true \
--wait
# Vérifier le statut de la sauvegarde
velero backup describe full-cluster-backup --details
velero backup logs full-cluster-backup
2. Sauvegarde d'espace de noms spécifique
Sauvegardez uniquement des espaces de noms spécifiques :
velero backup create app-backup \
--include-namespaces myapp \
--wait
Plusieurs espaces de noms :
velero backup create multi-ns-backup \
--include-namespaces ns1,ns2,ns3 \
--wait
3. Sauvegarde basée sur les étiquettes (labels)
Sauvegardez les ressources correspondant à des étiquettes spécifiques :
velero backup create labeled-backup \
--selector app=myapp \
--wait
4. Sauvegarde avec instantanés de volumes
Incluez explicitement les volumes persistants :
velero backup create pvc-backup \
--include-namespaces myapp \
--snapshot-volumes \
--wait
5. Sauvegarde du système de fichiers (FSB)
Pour les applications nécessitant des sauvegardes cohérentes :
# Annoter les pods pour le FSB
kubectl annotate pod/myapp-pod -n myapp \
backup.velero.io/backup-volumes=app-data
# Créer la sauvegarde
velero backup create fsb-backup \
--include-namespaces myapp \
--wait
6. Sauvegardes planifiées
Créez des sauvegardes récurrentes :
# Sauvegarde quotidienne à 2h du matin
velero schedule create daily-backup \
--schedule="0 2 * * *" \
--include-namespaces '*' \
--include-cluster-resources=true \
--ttl 168h0m0s # rétention de 7 jours
# Sauvegarde horaire
velero schedule create hourly-backup \
--schedule="0 * * * *" \
--include-namespaces production \
--ttl 24h0m0s
# Sauvegarde complète hebdomadaire
velero schedule create weekly-full \
--schedule="0 3 * * 0" \
--include-cluster-resources=true \
--ttl 720h0m0s # rétention de 30 jours
Sauvegarder les données etcd
Velero ne sauvegarde pas directement etcd, mais il capture tous les objets de l'API Kubernetes. Pour une sauvegarde compl ète d'etcd :
# Méthode 1 : sauvegarde complète du cluster Velero (capture tous les objets API)
velero backup create etcd-backup \
--include-cluster-resources=true \
--include-namespaces '*' \
--wait
# Méthode 2 : instantané etcd direct (exécution via kubectl)
kubectl exec -n kube-system etcd-<node-name> -- \
etcdctl snapshot save /var/lib/etcd/backup.db \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/peer.crt \
--key=/etc/kubernetes/pki/etcd/peer.key
Sauvegarder les informations des nœuds
Velero capture les ressources des nœuds, mais ne sauvegarde pas le système d'exploitation ni la configuration des nœuds. Pour une sauvegarde complète des nœuds :
# Sauvegarde des étiquettes et taints des nœuds (capturées par Velero)
velero backup create nodes-backup \
--include-resources nodes \
--include-cluster-resources=true \
--wait
# Sauvegarde manuelle de la configuration des nœuds (externe)
kubectl get nodes -o yaml > nodes-config-backup.yaml
Exclure des ressources spécifiques
# Exclure un espace de noms spécifique
velero backup create backup-exclude \
--exclude-namespaces kube-system,velero \
--wait
# Exclure par étiquette
kubectl label namespace test-ns velero.io/exclude-from-backup=true
velero backup create backup-no-test
Vérifier les sauvegardes
# Lister toutes les sauvegardes
velero backup get
# Détails de la sauvegarde
velero backup describe BACKUP_NAME --details
# Journaux de la sauvegarde
velero backup logs BACKUP_NAME
# Vérifier le contenu de la sauvegarde (télécharger le tarball)
velero backup download BACKUP_NAME
tar -tzf BACKUP_NAME.tar.gz
Opérations de restauration
Types de restauration
1. Restauration complète du cluster
Restaurer tout depuis une sauvegarde :
velero restore create --from-backup full-cluster-backup \
--wait
# Vérifier le statut de la restauration
velero restore describe RESTORE_NAME --details
velero restore logs RESTORE_NAME
2. Restauration d'espace de noms
Restaurer des espaces de noms spécifiques :
velero restore create restore-app \
--from-backup app-backup \
--include-namespaces myapp \
--wait
3. Restauration dans un espace de noms différent
Restaurer dans un nouvel espace de noms :
velero restore create restore-to-new \
--from-backup app-backup \
--namespace-mappings myapp:myapp-restored \
--wait
4. Restauration sélective de ressources
Restaurer des types de ressources spécifiques :
velero restore create restore-deployments \
--from-backup app-backup \
--include-resources deployments,services \
--wait
5. Restauration avec modificateurs de ressources
Modifier les ressources lors de la restauration :
Créez un modificateur de ressources de restauration :
apiVersion: v1
kind: ConfigMap
metadata:
name: restore-modifiers
namespace: velero
data:
modifiers.yaml: |
- version: v1
kind: Service
name: my-service
namespace: myapp
operations:
- op: replace
path: /spec/type
value: LoadBalancer
---
apiVersion: velero.io/v1
kind: Restore
metadata:
name: modified-restore
namespace: velero
spec:
backupName: app-backup
includedNamespaces:
- myapp
restorePVs: true
preserveNodePorts: true
6. Restauration des volumes persistants
# Restaurer avec recréation du volume
velero restore create restore-volumes \
--from-backup pvc-backup \
--restore-volumes \
--existing-resource-policy update \
--wait
Restaurer etcd
La restauration Velero recrée tous les objets de l'API Kubernetes :
# Restaurer toutes les ressources (similaire à la restauration etcd)
velero restore create etcd-restore \
--from-backup etcd-backup \
--include-cluster-resources=true \
--wait
Pour une restauration directe d'etcd depuis un instantané :
# Arrêter etcd
kubectl exec -n kube-system etcd-<node-name> -- \
mv /var/lib/etcd/member /var/lib/etcd/member.bak
# Restaurer depuis l'instantané
kubectl exec -n kube-system etcd-<node-name> -- \
etcdctl snapshot restore /var/lib/etcd/backup.db
Hooks de restauration
Exécuter des commandes pendant la restauration :
apiVersion: velero.io/v1
kind: Restore
metadata:
name: hook-restore
namespace: velero
spec:
backupName: app-backup
hooks:
resources:
- name: pre-hook
includedNamespaces:
- myapp
labelSelector:
matchLabels:
app: myapp
postHooks:
- exec:
container: app
command:
- /bin/sh
- -c
- "mysql -u root -p$MYSQL_ROOT_PASSWORD < /backup/init.sql"
Gérer les conflits de restauration
Lors de la restauration vers des ressources existantes :
# Mettre à jour les ressources existantes
velero restore create restore-update \
--from-backup app-backup \
--existing-resource-policy update \
--wait
# Supprimer et recréer
velero restore create restore-recreate \
--from-backup app-backup \
--existing-resource-policy delete \
--wait
# Ignorer les ressources existantes (aucune)
velero restore create restore-skip \
--from-backup app-backup \
--existing-resource-policy none \
--wait
Migration de cluster
Scénario 1 : Migrer vers un autre cluster Numspot
Sur le cluster source
- Créez une sauvegarde complète :
velero backup create migration-backup \
--include-namespaces '*' \
--include-cluster-resources=true \
--snapshot-volumes \
--wait
- Vérifiez la fin de la sauvegarde :
velero backup describe migration-backup --details
- Assurez l'upload de la sauvegarde :
velero backup logs migration-backup
Sur le cluster de destination (même fournisseur)
- Installez Velero avec le même stockage :
# Utiliser le MÊME compartiment (bucket) et les MÊMES identifiants que la source
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.9.2 \
--bucket YOUR_BUCKET_NAME \
--region eu-west-2 \
--secret-file ~/.aws/credentials-velero \
--backup-location-config region=eu-west-2,s3ForcePathStyle=true,s3Url=https://oos.eu-west-2.numspot.com \
--snapshot-location-config region=eu-west-2 \
--use-volume-snapshots=true \
--use-node-agent \
--features=EnableCSI
- Attendez la synchronisation de la sauvegarde :
# Velero synchronisera automatiquement les sauvegardes depuis le stockage objet
velero backup get
- Restaurez sur le nouveau cluster :
velero restore create migration-restore \
--from-backup migration-backup \
--include-cluster-resources=true \
--wait
- Vérifiez la restauration :
kubectl get all --all-namespaces
velero restore describe migration-restore --details
Scénario 2 : Migrer depuis un fournisseur non-Numspot (AWS, GCP, Azure)
Sur le cluster source (autre fournisseur)
- Installez Velero sur la source (exemple AWS) :
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.9.2 \
--bucket aws-backup-bucket \
--region us-east-1 \
--secret-file ~/.aws/credentials \
--backup-location-config region=us-east-1 \
--use-volume-snapshots=true
- Créez la sauvegarde :
velero backup create aws-to-numspot-backup \
--include-namespaces production \
--snapshot-volumes \
--wait
- Copiez la sauvegarde vers le stockage Numspot :
# Télécharger la sauvegarde depuis la source
velero backup download aws-to-numspot-backup
# Uploader vers le stockage Numspot en utilisant AWS CLI ou un outil compatible S3
aws s3 cp aws-to-numspot-backup.tar.gz \
s3://numspot-backup-bucket/backups/aws-to-numspot-backup/ \
--endpoint-url=https://oos.eu-west-2.numspot.com
Sur le cluster de destination Numspot
- Installez Velero sur Numspot :
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.9.2 \
--bucket numspot-backup-bucket \
--region eu-west-2 \
--secret-file ~/.aws/credentials-velero \
--backup-location-config region=eu-west-2,s3ForcePathStyle=true,s3Url=https://oos.eu-west-2.numspot.com \
--use-volume-snapshots=false
- Attendez la synchronisation de la sauvegarde :
velero backup get
- Créez la restauration avec ajustements :
velero restore create aws-restore \
--from-backup aws-to-numspot-backup \
--restore-volumes=false \
--existing-resource-policy update \
--wait
Les instantanés (snapshots) de stockage diffèrent entre les fournisseurs. Vous devrez effectuer les actions suivantes :
- recréer les PV manuellement ou utiliser le clonage de volumes ;
- mettre à jour les références de StorageClass vers des classes compatibles Numspot (
gp2,io1,standard) ; - ajuster les sélecteurs de nœuds et les règles d'affinité.