Copias de seguridad

Situación actual (2026-10-20): ⚠️ no hay copias recuperables

Mecanismo Qué protege Dónde guarda Estado
Velero, schedule daily-backup (02:00, retención 7 días) Solo objetos de Kubernetes (manifiestos), de 13 namespaces MinIO dentro del propio clúster (bucket velero) ❌ No existe ningún Backup. La ejecución del 2026-10-20 a las 02:00 se queda en Setting up backup store to persist the backup y no termina.
Snapshots de Longhorn Contenido de los volúmenes Longhorn Los mismos discos del clúster Solo snapshots manuales u ocasionales. Sin backup target ni recurring jobs.
Snapshots de etcd de k3s Estado del control-plane /var/lib/rancher/k3s/server/db/snapshots/ en cada master ✅ Funciona. Por defecto en k3s: cada 12 h (00:00 y 12:00), se guardan 5 de ~120 MB. Pero están en el mismo disco del master.
local-path — — Sin copia
Este repositorio Configuración declarativa (values de Helm y manifiestos) GitHub ✅ (sin secretos)

Problemas de diseño:

  1. Velero no copia el contenido de los volúmenes. No tiene node-agent (kopia) ni snapshots CSI (snapshotsEnabled: false). Restaurar un namespace recrearía los objetos con los volúmenes vacíos. Ya pasó con n8n en julio.
  2. El destino está dentro del clúster que se quiere proteger. Si se pierde el clúster o el volumen de MinIO, se pierden también las copias.
  3. Los datos más valiosos están en local-path (Postgres central, Postgres de Jira, Kafka y Jenkins), sin réplica y sin copia.

Diseño objetivo

Postgres (pg_dump, CronJob diario) ─┐
Longhorn recurring backup ──────────┼──► S3 FUERA de casa (Backblaze B2, OVH Object Storage…)
Velero + kopia (node-agent) ────────┘        cifrado, versionado y con retención
etcd snapshots k3s (--etcd-s3) ─────────────►

Pasos, por orden de impacto:

  1. Volcados lógicos de Postgres (central y Jira) con un CronJob de pg_dump hacia S3 externo. Es lo más barato y lo que más protege.
  2. Backup target de Longhorn apuntando a S3 externo, con un RecurringJob diario de backup (no solo snapshot).
  3. Velero: activar deployNodeAgent: true y defaultVolumesToFsBackup: true, y cambiar el BackupStorageLocation a S3 externo.
  4. etcd: --etcd-s3 con el mismo bucket externo.
  5. Probar una restauración de verdad en un namespace de prueba. Una copia que nunca se ha restaurado no es una copia.

Comandos útiles

# Estado de Velero
kubectl -n velero get schedule,backup,backupstoragelocation
kubectl -n velero logs deploy/velero --since=24h | grep -iE 'error|daily-backup' | tail

# Snapshots de etcd (en un master)
sudo k3s etcd-snapshot list
sudo k3s etcd-snapshot save --name manual-$(date +%F)

# Volcado puntual del Postgres central
kubectl -n infra-db exec postgres-central-postgresql-0 -- \
  sh -c 'PGPASSWORD="$POSTGRES_PASSWORD" pg_dumpall -U postgres' | gzip > postgres-central-$(date +%F).sql.gz