Velero Kubernetes: 7 Pasos para Backup Completo 2025

velero kubernetes - Dashboard de backup y recuperación de clústeres

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:

  1. Recuperación ante desastres: Protección contra fallos de infraestructura, corrupción de datos o eliminaciones accidentales
  2. Clonación de entornos: Replicar producción en staging para testing realista
  3. Migraciones cloud: Mover workloads entre proveedores (AWS → GCP → Azure)
  4. Cumplimiento normativo: Satisfacer requisitos de backup y retención de datos (GDPR, SOC2)
  5. 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:

  1. Descubrimiento: Velero consulta la API de Kubernetes para listar recursos según los selectores configurados
  2. Pre-hooks: Ejecuta comandos personalizados (ej: flush de bases de datos)
  3. Serialización: Convierte recursos de Kubernetes a formato JSON
  4. Backup de volúmenes: Usa snapshots nativos del proveedor cloud o restic para volúmenes
  5. Compresión: Comprime los datos en formato tar.gz
  6. Carga: Sube el backup al almacenamiento objeto configurado
  7. Post-hooks: Ejecuta comandos de limpieza si es necesario
  8. 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 MinIO
  • s3Url: 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 exitosos
  • velero_backup_failure_total: Backups fallidos
  • velero_backup_duration_seconds: Duración de backups
  • velero_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

Avatar

Por Mid

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x