Velero Kubernetes es la herramienta open-source definitiva para proteger tus clústeres de Kubernetes mediante backups automatizados y disaster recovery. En esta guía completa, aprenderás a instalar Velero Kubernetes de manera profesional, configurar backups programados, y garantizar la continuidad de negocio ante cualquier fallo crítico sin perder datos.
¿Qué es Velero?
Velero es un proyecto open-source desarrollado por VMware que proporciona capacidades completas de backup, restauración y migración para clústeres de Kubernetes. Con más de 9,600 estrellas en GitHub y más de 20,000 usuarios activos estimados, Velero se ha consolidado como la solución más popular para proteger aplicaciones cloud-native.
A diferencia de las soluciones tradicionales de backup, Velero entiende la naturaleza dinámica de Kubernetes y puede capturar tanto los recursos del clúster (deployments, services, configmaps) como los volúmenes persistentes de tus aplicaciones.
Características principales de Velero
- Backups completos o selectivos: Puedes respaldar todo el clúster o seleccionar namespaces específicos mediante etiquetas
- Programación automática: Configura backups recurrentes con políticas de retención personalizadas
- Disaster recovery: Restaura tu clúster completo en minutos tras un fallo catastrófico
- Migración entre clústeres: Mueve aplicaciones entre entornos (producción → staging → desarrollo)
- Hooks personalizados: Ejecuta comandos antes y después de los backups para preparar aplicaciones
- Soporte multi-cloud: Compatible con AWS S3, Google Cloud Storage, Azure Blob Storage y MinIO
Casos de uso principales
Velero resulta especialmente valioso en estos escenarios:
- Recuperación ante desastres: Protección contra fallos de infraestructura, corrupción de datos o eliminaciones accidentales
- Clonación de entornos: Replicar producción en staging para testing realista
- Migraciones cloud: Mover workloads entre proveedores (AWS → GCP → Azure)
- Cumplimiento normativo: Satisfacer requisitos de backup y retención de datos (GDPR, SOC2)
- Actualizaciones seguras: Crear snapshots antes de cambios críticos en el clúster
Arquitectura de Velero Kubernetes
Velero Kubernetes se compone de dos componentes principales que trabajan en conjunto para proporcionar protección de datos:
Componente servidor
El servidor de Velero se ejecuta como un deployment dentro de tu clúster de Kubernetes (típicamente en el namespace velero). Este componente:
- Monitoriza las peticiones de backup y restore mediante Custom Resources (CRs)
- Interactúa con la API de Kubernetes para capturar recursos
- Gestiona la comunicación con el backend de almacenamiento (S3, GCS, Azure)
- Ejecuta hooks y plugins durante las operaciones
- Gestiona programaciones automáticas de backups
Cliente CLI
La herramienta de línea de comandos velero permite a los administradores:
- Iniciar backups y restauraciones bajo demanda
- Configurar programaciones de backup automáticas
- Consultar el estado de operaciones en curso
- Gestionar ubicaciones de almacenamiento (BackupStorageLocations)
- Administrar políticas de retención y eliminación
Flujo de backup
Cuando ejecutas un backup con Velero Kubernetes, el proceso sigue estos pasos:
- Descubrimiento: Velero consulta la API de Kubernetes para listar recursos según los selectores configurados
- Pre-hooks: Ejecuta comandos personalizados (ej: flush de bases de datos)
- Serialización: Convierte recursos de Kubernetes a formato JSON
- Backup de volúmenes: Usa snapshots nativos del proveedor cloud o restic para volúmenes
- Compresión: Comprime los datos en formato tar.gz
- Carga: Sube el backup al almacenamiento objeto configurado
- Post-hooks: Ejecuta comandos de limpieza si es necesario
- Metadata: Registra información del backup en un Custom Resource
Requisitos Previos
Antes de instalar Velero Kubernetes, asegúrate de cumplir estos requisitos:
Infraestructura
- Clúster Kubernetes: Versión 1.18 o superior (compatible hasta 1.34)
- kubectl: Instalado y configurado con acceso administrativo al clúster
- Backend de almacenamiento: Bucket S3, GCS, Azure Blob Storage o MinIO configurado
- Credenciales cloud: Permisos para crear snapshots de volúmenes (si usas snapshots nativos)
Recursos mínimos
- CPU: 500m (0.5 cores) para el pod de Velero
- RAM: 256Mi mínimo, 512Mi recomendado
- Almacenamiento: Depende del tamaño de tu clúster (típicamente 10-100GB para backups)
Conocimientos previos
- Administración básica de Kubernetes
- Familiaridad con kubectl y manifests YAML
- Conceptos de namespaces, deployments y persistent volumes
- Experiencia con almacenamiento objeto (S3, GCS, etc.)
Instalar Velero Kubernetes Paso a Paso
Vamos a instalar Velero Kubernetes utilizando MinIO como backend de almacenamiento, ideal para entornos locales y on-premise.
Paso 1: Descargar el CLI de Velero
# Descargar la última versión (v1.17.1)
wget https://github.com/vmware-tanzu/velero/releases/download/v1.17.1/velero-v1.17.1-linux-amd64.tar.gz
# Extraer el archivo
tar -xvzf velero-v1.17.1-linux-amd64.tar.gz
# Mover el binario a PATH
sudo mv velero-v1.17.1-linux-amd64/velero /usr/local/bin/
# Verificar instalación
velero version --client-only
Salida esperada:
Client:
Version: v1.17.1
Git commit: 7b8f0f8e5f4a3b2c1d9e6f7a8b9c0d1e2f3a4b5c
Paso 2: Desplegar MinIO como almacenamiento
Para este tutorial usaremos MinIO, una alternativa S3-compatible open-source:
apiVersion: v1
kind: Namespace
metadata:
name: minio
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: minio
namespace: minio
spec:
selector:
matchLabels:
app: minio
template:
metadata:
labels:
app: minio
spec:
containers:
- name: minio
image: minio/minio:latest
args:
- server
- /data
- --console-address
- :9001
env:
- name: MINIO_ROOT_USER
value: "minio"
- name: MINIO_ROOT_PASSWORD
value: "minio123"
ports:
- containerPort: 9000
- containerPort: 9001
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: minio
namespace: minio
spec:
type: ClusterIP
ports:
- name: api
port: 9000
targetPort: 9000
- name: console
port: 9001
targetPort: 9001
selector:
app: minio
Aplica el manifest:
kubectl apply -f minio.yaml
# Verificar que MinIO está corriendo
kubectl get pods -n minio
Paso 3: Crear bucket en MinIO
Accede a la consola de MinIO y crea el bucket para Velero Kubernetes:
# Port-forward para acceder a MinIO
kubectl port-forward -n minio svc/minio 9001:9001
# Abre http://localhost:9001 en tu navegador
# Usuario: minio
# Password: minio123
# Crea un bucket llamado "velero-backups"
Alternativamente, usa el cliente mc de MinIO:
# Instalar mc CLI
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
# Configurar MinIO
kubectl port-forward -n minio svc/minio 9000:9000 &
mc alias set myminio http://localhost:9000 minio minio123
# Crear bucket
mc mb myminio/velero-backups
Paso 4: Crear credenciales para Velero
# Crear archivo de credenciales
cat > /tmp/credentials-velero << EOF
[default]
aws_access_key_id = minio
aws_secret_access_key = minio123
EOF
Paso 5: Instalar Velero Kubernetes en el clúster
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.10.0 \
--bucket velero-backups \
--secret-file /tmp/credentials-velero \
--use-volume-snapshots=false \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.minio.svc:9000
Explicación de los parámetros:
--provider aws: Usamos el plugin AWS-compatible (MinIO es S3-compatible)--plugins: Plugin para integrarse con APIs S3--bucket: Nombre del bucket creado en MinIO--secret-file: Credenciales de acceso a MinIO--use-volume-snapshots=false: Deshabilitamos snapshots nativos (usaremos restic)s3ForcePathStyle="true": Requerido para MinIOs3Url: URL interna del servicio MinIO
Paso 6: Verificar la instalación
# Ver pods de Velero
kubectl get pods -n velero
# Verificar deployment
kubectl get deployment -n velero
# Comprobar BackupStorageLocation
velero backup-location get
Salida esperada:
NAME PROVIDER BUCKET/PREFIX PHASE LAST VALIDATED
default aws velero-backups Available 2025-11-19 23:45:30 +0000 UTC
Paso 7: Habilitar restic para backup de volúmenes
Restic permite hacer backup de PersistentVolumes sin snapshots nativos del proveedor:
# Instalar restic daemonset
velero install --use-node-agent
# Verificar que restic está corriendo en todos los nodos
kubectl get daemonset -n velero
Configurar Velero Kubernetes con Backups Automáticos
Una vez instalado Velero Kubernetes, es hora de configurar políticas de backup automatizadas.
Crear un backup manual de prueba
# Backup de un namespace específico
velero backup create nginx-backup --include-namespaces nginx
# Backup de todo el clúster
velero backup create cluster-backup
# Backup con etiquetas específicas
velero backup create app-backup --selector app=production
Monitorizar el progreso del backup
# Ver estado del backup
velero backup describe nginx-backup
# Seguir logs en tiempo real
velero backup logs nginx-backup
# Listar todos los backups
velero backup get
Programar backups automáticos
Velero Kubernetes utiliza expresiones cron para programar backups recurrentes:
# Backup diario a las 2 AM (retención 30 días)
velero schedule create daily-backup \
--schedule="0 2 * * *" \
--ttl 720h0m0s
# Backup cada 6 horas de namespace production
velero schedule create production-backup \
--schedule="0 */6 * * *" \
--include-namespaces production \
--ttl 168h0m0s
# Backup semanal completo (domingos a las 3 AM)
velero schedule create weekly-full \
--schedule="0 3 * * 0" \
--ttl 2160h0m0s
Verificar programaciones activas
# Listar schedules
velero schedule get
# Ver detalles de una programación
velero schedule describe daily-backup
# Ver backups generados por un schedule
velero backup get --selector velero.io/schedule-name=daily-backup
Configurar hooks para aplicaciones stateful
Para aplicaciones con bases de datos, configura hooks que aseguren consistencia:
apiVersion: v1
kind: Pod
metadata:
name: postgres
namespace: database
annotations:
# Pre-backup hook: flush y freeze de BD
pre.hook.backup.velero.io/command: '["/bin/bash", "-c", "PGPASSWORD=$POSTGRES_PASSWORD psql -U postgres -c \"SELECT pg_start_backup(''velero-backup'');\""]'
# Post-backup hook: descongelar BD
post.hook.backup.velero.io/command: '["/bin/bash", "-c", "PGPASSWORD=$POSTGRES_PASSWORD psql -U postgres -c \"SELECT pg_stop_backup();\""]'
# Timeout para hooks
pre.hook.backup.velero.io/timeout: 30s
post.hook.backup.velero.io/timeout: 30s
Restauración y Disaster Recovery con Velero Kubernetes
El verdadero valor de Velero Kubernetes se demuestra cuando necesitas recuperar datos tras un fallo.
Restaurar un backup completo
# Listar backups disponibles
velero backup get
# Restaurar desde un backup específico
velero restore create --from-backup nginx-backup
# Restaurar con nuevo nombre de namespace
velero restore create --from-backup production-backup \
--namespace-mappings production:production-restore
Restauración selectiva de recursos
# Restaurar solo deployments
velero restore create --from-backup cluster-backup \
--include-resources deployments
# Restaurar excluyendo secretos
velero restore create --from-backup app-backup \
--exclude-resources secrets
# Restaurar por etiquetas
velero restore create --from-backup prod-backup \
--selector tier=frontend
Monitorizar restauración
# Ver progreso de restauración
velero restore describe nginx-backup-20251119234530
# Logs detallados
velero restore logs nginx-backup-20251119234530
# Listar todas las restauraciones
velero restore get
Migrar aplicaciones entre clústeres
Una capacidad poderosa de Velero Kubernetes es migrar workloads entre clústeres:
# CLÚSTER ORIGEN
# Crear backup del namespace a migrar
velero backup create app-migration --include-namespaces myapp
# Esperar a que complete
velero backup describe app-migration
# CLÚSTER DESTINO
# Configurar mismo BackupStorageLocation
velero backup-location create origin-backups \
--provider aws \
--bucket velero-backups \
--config region=minio,s3ForcePathStyle="true",s3Url=http://minio-origin.example.com
# Restaurar desde el backup compartido
velero restore create --from-backup app-migration
Optimización y Best Practices
Seguridad
- Cifrado en tránsito: Usa HTTPS para comunicación con el backend de almacenamiento
- Cifrado en reposo: Habilita cifrado en el bucket S3/GCS/Azure
- RBAC estricto: Limita permisos de Velero solo a namespaces necesarios
- Rotación de credenciales: Cambia periódicamente las claves de acceso al almacenamiento
- Auditoría: Monitoriza logs de Velero para detectar backups/restores no autorizados
# Crear ServiceAccount con permisos limitados
apiVersion: v1
kind: ServiceAccount
metadata:
name: velero-readonly
namespace: velero
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: velero-backup-viewer
namespace: production
rules:
- apiGroups: [""]
resources: ["pods", "configmaps", "services"]
verbs: ["get", "list"]
Rendimiento
- Paralelismo: Aumenta el número de workers para backups más rápidos
- Compresión: Velero usa gzip por defecto, ajusta nivel según necesidad
- Selectividad: Evita backups innecesarios con etiquetas y selectores precisos
- Resource limits: Ajusta CPU/RAM del pod Velero según tamaño del clúster
# Aumentar recursos de Velero
kubectl edit deployment velero -n velero
# Modificar:
resources:
requests:
cpu: 1000m
memory: 512Mi
limits:
cpu: 2000m
memory: 1Gi
Políticas de retención
Implementa la estrategia 3-2-1 con Velero Kubernetes:
- 3 copias: Backup diario, semanal y mensual
- 2 medios: Almacenamiento local (MinIO) + cloud (S3)
- 1 offsite: Replicación cross-region en el proveedor cloud
# Backups con diferentes retenciones
velero schedule create daily --schedule="0 2 * * *" --ttl 168h # 7 días
velero schedule create weekly --schedule="0 3 * * 0" --ttl 720h # 30 días
velero schedule create monthly --schedule="0 4 1 * *" --ttl 2160h # 90 días
Monitorización con Prometheus
Velero expone métricas para Prometheus:
# Habilitar métricas en Velero
kubectl patch deployment velero -n velero --type='json' -p='[
{
"op": "add",
"path": "/spec/template/spec/containers/0/args/-",
"value": "--metrics-address=:8085"
}
]'
# ServiceMonitor para Prometheus Operator
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: velero
namespace: velero
spec:
selector:
matchLabels:
app.kubernetes.io/name: velero
endpoints:
- port: metrics
interval: 30s
Métricas clave a monitorizar:
velero_backup_success_total: Backups exitososvelero_backup_failure_total: Backups fallidosvelero_backup_duration_seconds: Duración de backupsvelero_restore_success_total: Restauraciones exitosas
Troubleshooting Velero Kubernetes
Error: Backup stuck en fase InProgress
Síntoma: El backup nunca completa y permanece en estado InProgress.
Diagnóstico:
velero backup describe stuck-backup --details
kubectl logs -n velero deployment/velero
Soluciones:
- Verificar conectividad con el backend de almacenamiento
- Revisar que las credenciales sean válidas
- Comprobar que el bucket existe y es accesible
- Aumentar timeout:
velero install --backup-timeout=60m
Error: Volumes no se respaldan
Síntoma: Los PersistentVolumes no aparecen en el backup.
Solución:
# Anotar pods para incluir volúmenes con restic
kubectl annotate pod/my-pod -n my-namespace backup.velero.io/backup-volumes=data-volume,logs-volume
# Verificar que restic está corriendo
kubectl get pods -n velero -l name=node-agent
Error: Restauración parcial
Síntoma: Algunos recursos no se restauran correctamente.
Diagnóstico:
velero restore describe my-restore --details
velero restore logs my-restore
Causas comunes:
- Recursos con nombres duplicados ya existentes en el clúster
- CRDs no instalados antes de restaurar CRs
- Conflictos con resourceVersion
Solución:
# Restaurar en un nuevo namespace para evitar conflictos
velero restore create --from-backup my-backup \
--namespace-mappings old-ns:new-ns
# Restaurar CRDs primero
velero restore create --from-backup my-backup \
--include-resources customresourcedefinitions
Error: BackupStorageLocation unavailable
Síntoma: velero backup-location get muestra estado Unavailable.
Solución:
# Verificar configuración
kubectl describe backupstoragelocation default -n velero
# Probar conectividad manualmente
kubectl run -it --rm debug --image=amazon/aws-cli --restart=Never -- \
s3 ls s3://velero-backups --endpoint-url http://minio.minio.svc:9000
# Recrear BackupStorageLocation si es necesario
velero backup-location delete default
velero backup-location create default \
--provider aws \
--bucket velero-backups \
--config region=minio,s3ForcePathStyle="true",s3Url=http://minio.minio.svc:9000
Conclusión
Velero Kubernetes se ha consolidado como la solución estándar de facto para backup y disaster recovery en entornos cloud-native. Con más de 9,600 estrellas en GitHub y respaldo de la CNCF, ofrece una plataforma robusta y madura para proteger tus aplicaciones Kubernetes.
En esta guía has aprendido a instalar Velero Kubernetes desde cero, configurar backups automáticos programados, implementar disaster recovery, y aplicar best practices de seguridad y rendimiento. La combinación de backups declarativos, migración entre clústeres y políticas de retención flexibles hace de Velero una herramienta indispensable para cualquier equipo que opere infraestructura Kubernetes en producción.
Los próximos pasos recomendados incluyen integrar Velero Kubernetes con tu pipeline de CI/CD para backups automáticos antes de despliegues, configurar alertas en Prometheus para monitorizar fallos de backup, e implementar tests periódicos de disaster recovery para validar tus RPO/RTO.
FAQ sobre Velero Kubernetes
¿Velero Kubernetes funciona con cualquier distribución de Kubernetes?
Sí, Velero Kubernetes es compatible con cualquier distribución certificada de Kubernetes (versión 1.18+), incluyendo EKS, GKE, AKS, OpenShift, Rancher, K3s y clústeres on-premise. La única dependencia es tener acceso a un backend de almacenamiento compatible con S3, GCS o Azure Blob Storage.
¿Cuánto espacio de almacenamiento necesito para los backups?
El espacio depende del tamaño de tu clúster. Como referencia, un clúster con 100 pods, 50 servicios y 20GB de volúmenes persistentes genera backups de ~5-10GB comprimidos. Velero comprime automáticamente los datos con gzip, reduciendo el espacio entre 60-80%. Planifica 2-3x el tamaño de tus PersistentVolumes más metadata de recursos.
¿Puedo usar Velero Kubernetes para migraciones multi-cloud?
Absolutamente. Velero Kubernetes es ideal para migraciones entre proveedores cloud (AWS → GCP → Azure) o entre on-premise y cloud. Los backups son portables y agnósticos al proveedor. Solo necesitas configurar BackupStorageLocations accesibles desde ambos clústeres. Ten en cuenta que snapshots nativos de volúmenes son específicos del proveedor, por lo que para migraciones multi-cloud debes usar restic.
¿Velero Kubernetes afecta el rendimiento de mi clúster en producción?
El impacto de Velero Kubernetes en producción es mínimo. El pod de Velero consume típicamente 500m CPU y 256Mi RAM. Durante operaciones de backup, el mayor impacto proviene de restic cuando lee volúmenes, pero esto es configurable con resource limits. Los backups pueden programarse en ventanas de bajo tráfico (madrugada) y el paralelismo es ajustable. En benchmarks, clusters con 500+ pods reportan overhead <5%.
¿Cómo pruebo que mis backups funcionan correctamente?
Implementa disaster recovery drills periódicos: 1) Crea un clúster temporal de testing, 2) Restaura un backup de producción, 3) Valida que las aplicaciones arrancan correctamente, 4) Verifica integridad de datos en bases de datos, 5) Documenta el tiempo de recuperación (RTO). Automatiza esto mensualmente con scripts. Recuerda: un backup no probado es un backup que no existe. Velero Kubernetes facilita estos drills con restauraciones en namespaces aislados.
Recursos Adicionales
- Documentación oficial de Velero
- Repositorio GitHub de Velero
- Guía de PersistentVolumes en Kubernetes
- Más artículos sobre Kubernetes
