Un clúster de Kubernetes es efímero por diseño: los pods van y vienen, pero tus datos, tus manifiestos y el estado de tus aplicaciones no deberían desaparecer con ellos. Velero es la herramienta de referencia para respaldar y restaurar clústeres completos —recursos de la API y volúmenes persistentes— directamente sobre almacenamiento de objetos compatible con S3. En esta guía montamos Velero apuntando a OtterStorage, programamos copias automáticas, las hacemos inmutables con Object Lock y preparamos una recuperación ante desastres entre clústeres. Comandos completos, sin atajos.
Qué respalda Velero (y qué no)
Velero trabaja en dos planos que conviene entender por separado, porque cada uno tiene su propio mecanismo y sus propias garantías.
- Recursos del clúster: todos los objetos de la API de Kubernetes (deployments, services, configmaps, secrets, CRDs, namespaces…). Velero los consulta vía API server, los serializa y los sube como un tarball comprimido a tu bucket de S3. Esto es lo que te permite reconstruir la "forma" del clúster.
- Volúmenes persistentes: los datos reales dentro de tus PersistentVolumeClaims. Aquí hay dos rutas: CSI snapshots (snapshots a nivel de almacenamiento mediante el driver CSI y
VolumeSnapshotClass) o File System Backup con Restic o Kopia (el node-agent lee los ficheros del volumen y los sube a S3). - Migraciones y recuperación ante desastres: como todo el estado vive en object storage, puedes restaurar en un clúster nuevo, en otra región o tras un incidente total.
Velero no es un sustituto del backup específico de tus bases de datos: para PostgreSQL o MySQL bajo carga conviene un volcado consistente. Echa un vistazo a nuestra guía de backup de PostgreSQL a S3 para combinarlo con Velero.
CSI snapshots frente a File System Backup
La elección del método de volúmenes depende de tu driver de almacenamiento y de tus necesidades de portabilidad. Esta tabla resume las diferencias prácticas.
| Aspecto | CSI Snapshots | File System Backup (Restic/Kopia) |
|---|---|---|
| Requisito | Driver CSI con soporte de snapshots | node-agent desplegado en cada nodo |
| Granularidad | Volumen completo | A nivel de ficheros |
| Portabilidad entre proveedores | Limitada (depende del backend) | Alta: los datos van íntegros a S3 |
| Rendimiento | Muy rápido (copy-on-write) | Más lento en el primer backup, incremental después |
| Destino final | S3 (datos del snapshot replicados) | S3 (repositorio Restic/Kopia) |
Regla práctica: si quieres máxima portabilidad hacia OtterStorage y migrar entre proveedores sin atarte a su sistema de snapshots, File System Backup con Kopia es la opción más robusta. Si tu CSI ya integra snapshots eficientes y solo buscas velocidad, úsalos.
1. Crea el bucket y las credenciales
Primero necesitas un bucket de destino en OtterStorage y un par de access keys. Lo ideal es generar una clave aislada por bucket para que Velero no tenga acceso a nada más; en OtterStorage las access keys se aíslan por bucket de fábrica. Crea el bucket desde la consola o con la AWS CLI siguiendo la guía de crear bucket.
aws s3 mb s3://mi-bucket-velero \
--endpoint-url https://s3.otterstorage.io \
--region eu-mad
Después prepara el fichero de credenciales que Velero leerá durante la instalación. El formato es el mismo que el de un perfil de AWS:
cat > credentials-velero <<EOF
[default]
aws_access_key_id=TU_ACCESS_KEY
aws_secret_access_key=TU_SECRET_KEY
EOF
2. Instala Velero apuntando a OtterStorage
Aquí está el corazón de la integración. El plugin velero-plugin-for-aws habla S3, y los flags s3Url y s3ForcePathStyle son lo que redirige todo el tráfico hacia el endpoint https://s3.otterstorage.io en lugar de AWS. Esta instalación usa File System Backup con el node-agent (recomendado para portabilidad).
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.10.0 \
--bucket mi-bucket-velero \
--secret-file ./credentials-velero \
--use-volume-snapshots=false \
--use-node-agent \
--default-volumes-to-fs-backup \
--backup-location-config \
region=eu-mad,s3ForcePathStyle=true,s3Url=https://s3.otterstorage.io
Desglose de los flags que importan:
--bucket mi-bucket-velero: el bucket de OtterStorage donde vivirán las copias.s3Url=https://s3.otterstorage.io: el endpoint S3 compatible. Sin esto, Velero intentaría hablar con AWS.s3ForcePathStyle=true: fuerza el estilo de ruta (endpoint/bucket) en lugar de subdominios virtuales; imprescindible para endpoints compatibles.region=eu-mad: la región de OtterStorage (Madrid). También dispones deeu-frayus-east.--use-node-agenty--default-volumes-to-fs-backup: activan el respaldo de volúmenes vía sistema de ficheros (Restic/Kopia) por defecto.
El BackupStorageLocation
La instalación crea un objeto BackupStorageLocation (BSL) que define dónde y cómo se guardan las copias. Si necesitas añadir más destinos —por ejemplo, una segunda región para DR— puedes declararlos como manifiestos. Así se ve un BSL apuntando a OtterStorage en Frankfurt:
apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
name: otter-fra
namespace: velero
spec:
provider: aws
objectStorage:
bucket: mi-bucket-velero-dr
config:
region: eu-fra
s3Url: https://s3.otterstorage.io
s3ForcePathStyle: "true"
Comprueba que el location está operativo antes de confiar en él:
velero backup-location get
# NAME PROVIDER BUCKET PHASE LAST VALIDATED
# default aws mi-bucket-velero Available 2026-06-12 09:14:02
3. Crea tu primer backup
Con el destino validado, ya puedes lanzar copias. Empieza por un namespace concreto para verificar el flujo completo de extremo a extremo.
velero backup create backup-produccion \
--include-namespaces produccion \
--wait
velero backup describe backup-produccion --details
velero backup logs backup-produccion
El flag --wait bloquea hasta que termina y te devuelve el estado final (Completed o PartiallyFailed). Revisa siempre los logs la primera vez: ahí aparecen los volúmenes que se han respaldado vía File System Backup y cualquier recurso omitido.
Backups programados con schedule
Un backup manual está bien para una prueba, pero la protección real viene de la automatización. Velero usa sintaxis cron para los schedules. Aquí defines uno diario a las 2:00 con retención de 30 días (720h):
velero schedule create diario-produccion \
--schedule="0 2 * * *" \
--include-namespaces produccion \
--ttl 720h0m0s
# Backup completo semanal, retención de 90 días
velero schedule create semanal-completo \
--schedule="0 3 * * 0" \
--ttl 2160h0m0s
El TTL debe ser coherente con tu objetivo de retención y con tu RPO (cuántos datos puedes permitirte perder). Como en OtterStorage no se facturan ni las peticiones ni los borrados, programar backups frecuentes y expirar los antiguos no añade coste oculto: solo pagas por los TB almacenados.
4. Restauración: total y selectiva
Restaurar es donde se demuestra si tu estrategia funciona. Velero permite recuperar un backup entero o filtrar por namespace, etiquetas o tipo de recurso.
Restauración total
velero restore create --from-backup backup-produccion --wait
Restauración selectiva por namespace
Quizá solo necesites recuperar un namespace concreto, o remapearlo a otro nombre (útil para clonar entornos):
# Solo un namespace del backup
velero restore create restore-app \
--from-backup backup-produccion \
--include-namespaces produccion
# Remapear produccion -> staging al restaurar
velero restore create clonar-a-staging \
--from-backup backup-produccion \
--namespace-mappings produccion:staging
Inspecciona el resultado igual que con los backups:
velero restore describe restore-app --details
velero restore logs restore-app
Inmutabilidad con Object Lock
Un backup que un atacante puede borrar no protege contra ransomware. La defensa es la inmutabilidad: activa Object Lock (modo WORM) en el bucket de Velero para que ni siquiera con tus credenciales se puedan eliminar o sobrescribir las copias dentro del periodo de retención. OtterStorage soporta los modos Governance y Compliance, y Legal Hold por bucket.
# Crear el bucket de Velero con Object Lock habilitado
aws s3api create-bucket \
--bucket mi-bucket-velero \
--object-lock-enabled-for-bucket \
--endpoint-url https://s3.otterstorage.io
# Política de retención por defecto: 30 días en modo Compliance
aws s3api put-object-lock-configuration \
--bucket mi-bucket-velero \
--object-lock-configuration '{"ObjectLockEnabled":"Enabled","Rule":{"DefaultRetention":{"Mode":"COMPLIANCE","Days":30}}}' \
--endpoint-url https://s3.otterstorage.io
El modo Compliance es el más estricto: nadie, ni siquiera el dueño de la cuenta, puede acortar la retención. Para entornos donde necesites flexibilidad operativa, Governance permite excepciones con permisos especiales. Si quieres profundizar, tienes la solución de backups inmutables (OtterVault) y la guía de Legal Hold.
Recuperación ante desastres entre clústeres
El escenario que de verdad importa: tu clúster primario deja de existir. Como todo el estado vive en OtterStorage, levantar un clúster nuevo y restaurar es un procedimiento reproducible.
- Aprovisiona un clúster nuevo (otra región, otro proveedor, on-premise…).
- Instala Velero apuntando al mismo bucket de OtterStorage con las mismas credenciales.
- Velero detectará automáticamente los backups existentes en el bucket.
- Restaura el último backup válido.
# En el clúster de recuperación, tras velero install con el mismo --bucket:
velero backup get # lista los backups encontrados en S3
velero restore create dr-completo --from-backup semanal-completo-20260609030012 --wait
Para DR geográfico real, mantén una copia en una segunda región. Puedes usar la replicación de OtterStorage (OtterSync) entre eu-mad y eu-fra, o configurar un segundo BackupStorageLocation y duplicar el schedule. Así, si pierdes una región entera, la otra sigue teniendo tus copias.
Buenas prácticas
- Prueba las restauraciones en un clúster de staging de forma periódica. Una copia que nunca se ha restaurado es solo una hipótesis.
- Activa Object Lock desde el día uno; añadirlo después no protege las copias ya existentes.
- Excluye lo que no aporta: namespaces de sistema volátiles o recursos generados pueden inflar el backup sin valor de recuperación.
- Vigila el estado con
velero backup gety alertas sobre fasesPartiallyFailed. - Documenta tu runbook de DR: en un incidente real no quieres improvisar los comandos de restauración.
Para los detalles del endpoint, regiones y configuración de seguridad, consulta la documentación y la guía de seguridad.
Preguntas frecuentes
¿Velero respalda también los datos de los volúmenes o solo los manifiestos? +
--default-volumes-to-fs-backup los datos de los PVC van íntegros a tu bucket de OtterStorage.¿Qué flags necesito para que Velero use OtterStorage en vez de AWS? +
--backup-location-config debes indicar s3Url=https://s3.otterstorage.io, s3ForcePathStyle=true y la región (eu-mad, eu-fra o us-east). El plugin velero-plugin-for-aws hace el resto, ya que OtterStorage es 100% compatible con la API S3.¿Los backups frecuentes encarecen la factura? +
Equipo OtterStorage
Protege tus clústeres
Destino S3 compatible con Velero, inmutable y sin sorpresas.
Hazte Founding Otter