Version : 1.0 — 28/07/2026
Public : Support N2 (supervision, diagnostic, restaurations simples) — restaurations CNPG et VM = N3
Principe (leçon INC-RBER-2026-07-23) : une sauvegarde non supervisée et non testée n'est pas une sauvegarde. Backstage a été en échec silencieux 18 jours ; la restauration Keycloak a sauvé la plateforme.
| Périmètre | Outil | Cible | Fréquence | Restauration |
|---|---|---|---|---|
| Bases PostgreSQL (7 clusters CNPG) | Barman (barmanObjectStore) + WAL (archive_timeout 5 min) | MinIO 10.29.112.150:9000 | Quotidienne 03h00 | N3 |
| Ressources K8s + volumes applicatifs | Velero | MinIO | RENSEIGNER_PLANNING_VELERO | Simple : N2 / complète : N3 |
| VMs Harvester hors RKE2 | ScheduleVMBackup | MinIO | RENSEIGNER_PLANNING_VMBACKUP | N3 |
| etcd RKE2 | Snapshots RKE2 (/var/lib/rancher/rke2/server/db/snapshots/) |
Local nœuds serveurs | Automatique | N3 |
| Réplication hors site | MinIO → Parakou (Synology NAS) | Parakou | Continue | N3 |
Périmètre VM Harvester (strict) : bbb/bbb-srv, default/rber-captive-portal, default/rber-captive-portal-02, default/rber-net-report, default/rber-devops-01, unstim/rber-ldb-int-01. Les nœuds fid-rke2-* sont EXCLUS (couverts par Velero/Barman). La VM default/rancher est couverte par l'opérateur rancher-backup, pas par un backup VM.
# Contexte RKE2
# 1. Sauvegardes CNPG des dernières 24 h — TOUS les namespaces à bases
kubectl get backups.postgresql.cnpg.io -A --sort-by=.metadata.creationTimestamp | tail -15
# Chaque cluster doit avoir un backup "completed" daté de cette nuit
# 2. Santé des 7 clusters PG
kubectl get clusters.postgresql.cnpg.io -A
# 3. Velero
velero backup get | head -10 # dernier backup Completed ?
# Contexte HARVESTER
# 4. Backups VM
kubectl get vmbackup -A # tous Ready ?
Toute anomalie = ticket P2 le jour même. Pas de report.
kubectl -n <ns> describe backup <nom> — message d'erreur.kubectl -n <ns> create -f - <<EOF
apiVersion: postgresql.cnpg.io/v1
kind: Backup
metadata:
name: manual-$(date +%Y%m%d-%H%M)
spec:
cluster:
name: RENSEIGNER_NOM_CLUSTER
EOF
mcli du, pas mcli ls (ls affiche toujours 0B sur les préfixes) :mcli du rber-minio/RENSEIGNER_BUCKET_BARMAN/<cluster>/
0 0 3 * * * = quotidien 03h. 0 3 * * * s'exécuterait toutes les heures — erreur déjà commise, vérifier à chaque nouveau cluster.L'opérateur tourne en 1.28.0 (namespace shared, deployment cnpg-cloudnative-pg). Le support natif barmanObjectStore est supprimé en 1.29.0. Toute mise à jour de l'opérateur avant migration de tous les clusters vers le plugin Barman Cloud casserait silencieusement toutes les sauvegardes.
→ N2 : interdiction absolue de mettre à jour cet opérateur. Si un outil (Renovate, ArgoCD…) propose la mise à jour : refuser et prévenir N3.
velero restore create --from-backup <backup> --include-resources configmaps --include-namespaces <ns>
| Cas | Préparation N2 avant l'arrivée du N3 |
|---|---|
| Restauration cluster CNPG (base détruite/corrompue) | Identifier le dernier backup completed + WAL disponibles (mcli du), sauvegarder les secrets applicatifs actuels du namespace (kubectl get secret -n <ns> -o yaml > secrets-AVANT.yaml) — le désalignement de secret a coûté 3 jours le 27/07 |
| Restauration VM Harvester | Identifier le dernier vmbackup Ready ; ne pas toucher à la VM source |
| Restauration etcd | Rien — appel N3 immédiat |
| PITR (point-in-time) | Noter l'heure cible exacte demandée et la justification |
Planifié, tracé dans Zammad, tournant sur le périmètre :
| Mois | Test |
|---|---|
| M | Restauration d'un cluster CNPG non critique vers un namespace de test, vérification des données |
| M+1 | Restauration VM Harvester depuis un vmbackup vers une VM de test (la preuve test-bbb-manual n'a jamais été confirmée — première échéance) |
| M+2 | Velero : restauration d'un namespace non critique complet |
Un test raté = ticket P1 sur la chaîne de sauvegarde. C'est le but du test.
10.29.112.150:9000 (le multipart échoue via HAProxy).mcli (pas mc), config ~/.mcli/config.json.rber-admin du secret de backup Harvester par le compte de service dédié harvester-backup — statut : RENSEIGNER_FAIT_OU_NON.mcli du par bucket) ; MinIO plein = plus aucune sauvegarde nulle part.