Backups de Kubernetes con Velero y OtterStorage
Configura Velero para respaldar y restaurar tus clústeres de Kubernetes usando OtterStorage como almacén de objetos compatible con S3.
Velero es la herramienta estándar para hacer copias de seguridad, restaurar y migrar recursos de Kubernetes y sus volúmenes persistentes. Esta guía explica cómo apuntar Velero a un bucket de OtterStorage usando el plugin de AWS, programar backups recurrentes, restaurar desde una copia y proteger tus respaldos con Object Lock.
Antes de empezar
Necesitas tener listo lo siguiente:
- Un clúster de Kubernetes en funcionamiento y
kubectlconfigurado contra él. - La CLI de Velero instalada en tu máquina local (v1.12 o superior recomendada).
- Un bucket creado en OtterStorage que actuará como destino de los backups, por ejemplo
mi-bucket-velero. Revisa la documentación para crear buckets y generar claves. - Un par de credenciales (access key y secret key) con permisos sobre ese bucket. En OtterStorage las credenciales se emiten por bucket.
El endpoint S3 de OtterStorage es https://s3.otterstorage.io y en los ejemplos usamos la región eu-mad. Como no cobramos por peticiones ni por borrados, puedes ejecutar backups frecuentes y aplicar políticas de expiración agresivas sin que el coste por operaciones se dispare: solo pagas por el almacenamiento que ocupas.
1. Crear el fichero de credenciales
Velero lee las credenciales de un fichero con el formato de perfil de AWS. Crea un archivo llamado credentials-velero con tu access key y secret key del bucket:
[default]
aws_access_key_id=TU_ACCESS_KEY
aws_secret_access_key=TU_SECRET_KEY
Sustituye TU_ACCESS_KEY y TU_SECRET_KEY por las claves que generaste para mi-bucket-velero. Mantén este fichero fuera de tu control de versiones; Velero lo cargará en un Secret dentro del clúster durante la instalación.
2. Instalar Velero apuntando a OtterStorage
Usa el plugin oficial de AWS (velero/velero-plugin-for-aws), que es totalmente compatible con OtterStorage. La clave está en el bloque --backup-location-config, donde se indica la región, el endpoint personalizado y el estilo de ruta (path-style), necesario para almacenamiento S3 compatible:
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws \
--bucket mi-bucket-velero \
--secret-file ./credentials-velero \
--use-volume-snapshots=false \
--use-node-agent \
--backup-location-config region=eu-mad,s3ForcePathStyle=true,s3Url=https://s3.otterstorage.io
Desglose de las opciones más relevantes:
--use-volume-snapshots=false: desactiva los snapshots de volumen nativos del proveedor de nube. OtterStorage es un almacén de objetos, no gestiona snapshots de discos, así que los datos de los volúmenes se respaldan mediante el node-agent.--use-node-agent: despliega el agente de nodo (basado en Kopia) que copia el contenido de los volúmenes persistentes directamente al bucket. Imprescindible al no usar snapshots de volumen.s3ForcePathStyle=true: fuerza el direccionamiento por ruta (https://s3.otterstorage.io/mi-bucket-velero) en lugar de por subdominio.s3Url=https://s3.otterstorage.io: define el endpoint de OtterStorage.region=eu-mad: la región del bucket.
Comprueba que el almacén de backups quedó disponible:
velero backup-location get
El campo PHASE debe mostrar Available. Si aparece Unavailable, revisa las credenciales, el nombre del bucket y que la URL sea exactamente https://s3.otterstorage.io.
3. Crear un backup manual
Para respaldar todos los recursos del clúster:
velero backup create backup-completo
Para respaldar solo uno o varios namespaces:
velero backup create backup-app --include-namespaces produccion,staging
Consulta el estado y los detalles del backup:
velero backup describe backup-completo --details
velero backup logs backup-completo
Cuando el backup pasa a Completed, sus objetos (metadatos de recursos y datos de volúmenes) quedan almacenados en mi-bucket-velero.
4. Programar backups recurrentes
Usa schedule create con una expresión cron para automatizar las copias. El siguiente ejemplo crea un backup diario a las 02:00 que se conserva durante 30 días (TTL de 720 horas):
velero schedule create diario \
--schedule="0 2 * * *" \
--ttl 720h0m0s \
--include-namespaces produccion
Lista y revisa tus programaciones:
velero schedule get
velero schedule describe diario
Cada ejecución genera un backup independiente con el sufijo de fecha. Como OtterStorage no cobra por peticiones ni por borrados, mantener una retención corta con expiración automática vía el TTL de Velero no implica coste adicional por las operaciones de limpieza; únicamente liberas espacio.
5. Restaurar desde un backup
Para restaurar el contenido completo de un backup, utiliza restore create con --from-backup:
velero restore create --from-backup backup-completo
Puedes restaurar de forma selectiva, por ejemplo solo un namespace, o remapeándolo a otro distinto:
velero restore create restauracion-app \
--from-backup backup-app \
--include-namespaces produccion \
--namespace-mappings produccion:produccion-restore
Sigue el progreso de la restauración:
velero restore describe restauracion-app --details
velero restore logs restauracion-app
6. Proteger los backups con Object Lock
Object Lock añade inmutabilidad estilo WORM (Write Once, Read Many) a tus backups: una vez escritos, los objetos no pueden modificarse ni eliminarse hasta que expire su periodo de retención. Es una defensa eficaz frente a ransomware y borrados accidentales, ya que ni siquiera unas credenciales comprometidas pueden destruir las copias bloqueadas.
Requisitos
- El bucket debe crearse con Object Lock habilitado desde el inicio; no puede activarse sobre un bucket existente. Crea un bucket dedicado para esto (por ejemplo
mi-bucket-velero) en OtterStorage con la opción de Object Lock activada. - Define una regla de retención por defecto (modo
GOVERNANCEoCOMPLIANCE) acorde a cuánto tiempo deben permanecer inmutables tus backups.
Alinea Velero con el periodo de bloqueo
Asegúrate de que el TTL de los backups de Velero sea coherente con la retención de Object Lock. Si Velero intenta purgar un backup expirado antes de que termine el periodo de bloqueo, el borrado fallará hasta que el objeto deje de estar protegido. Configura el TTL igual o mayor que la retención del bucket:
velero schedule create diario-inmutable \
--schedule="0 2 * * *" \
--ttl 720h0m0s \
--include-namespaces produccion
Con un bucket bloqueado durante 30 días y un TTL de 30 días, Velero limpiará las copias justo cuando dejen de ser inmutables. Recuerda que las peticiones y los borrados no tienen coste en OtterStorage, así que la única variable de coste con Object Lock es el almacenamiento que ocupan las versiones retenidas mientras dura el bloqueo.
Resolución de problemas
- El backup-location aparece como
Unavailable: verificas3Url=https://s3.otterstorage.io,s3ForcePathStyle=truey que las credenciales del ficherocredentials-velerocorrespondan al bucket. - Errores
SignatureDoesNotMatcho403: comprueba que access key y secret key sean correctas y que laregioncoincida (eu-mad). - Los volúmenes no se respaldan: confirma que instalaste con
--use-node-agenty que los pods del node-agent están enRunningconkubectl -n velero get pods.
Para más detalles sobre buckets, claves y endpoints, consulta la documentación de OtterStorage.
¿Listo para probarlo?
Crea tu cuenta y obtén tus claves en minutos.