Introducción

Velero es una herramienta de código abierto para realizar copias de seguridad de tus clústeres de Kubernetes, ¡esto también incluye tus volúmenes de Kubernetes! La forma en que Velero funciona es solicitando a la API de Kubernetes los manifiestos deseados que deseas respaldar, de esta manera no necesitas acceso directo a la base de datos de etcd. Esto es muy útil cuando se utilizan clústeres de Kubernetes administrados como AWS, GCP, Digital Ocean, etc. Ya que al usar clústeres administrados, no tienes acceso directo a los nodos maestros.

Velero backup process

Como se describe en el diagrama anterior, el usuario crea un recurso de respaldo de Velero, luego el controlador de Velero instalado en el clúster solicita a la API de Kubernetes y realiza la copia de seguridad de los recursos deseados. Los datos de respaldo luego se pueden cargar en un S3 Bucket u cualquier otra ubicación de respaldo.

Restaurar desde una copia de seguridad es muy similar. Cuando el usuario crea un recurso de restauración, el controlador de Velero lo recopila, descarga los datos de respaldo y los restaura en el clúster. Lo bueno aquí es que Velero realiza una restauración no destructiva, lo que significa que no eliminará ningún recurso existente en el clúster y los omitirá.

Si quieres saber más sobre cómo funciona Velero, haz clic aquí.

Pre-requisitos:

Antes de utilizar Velero necesitamos:

  1. Por supuesto, nuestro propio clúster de Kubernetes, que para fines de prueba puedes usar Kind.
  2. Un bucket S3 para almacenar nuestras copias de seguridad. Aquí utilizaremos MinIO.
  3. El cliente de Velero. En mi opinión, es la forma más sencilla de instalar, crear y restaurar copias de seguridad con Velero.

MinIO

Este es un simple docker-compose que implementa MinIO. Copia este archivo y ejecuta docker-compose up

# docker-compose.yaml
version: '3'

services:
  minio:
    image: quay.io/minio/minio:latest
    command: server /data --console-address ":9001"
    environment:
      - MINIO_ROOT_USER=admin
      - MINIO_ROOT_PASSWORD=password
    ports:
      - "9001:9001"
      - "9000:9000"
    volumes:
      - /data
YAML

Ve a http://localhost:9001, inicia sesión con admin/password y crea un bucket llamado velero-backups.

Cliente de Velero

Descarga la última versión aquí y extráela:

tar -xvf <RELEASE-TARBALL-NAME>.tar.gz
Bash

Mueve el ejecutable de velero a la carpeta bin (/usr/local/bin) o añádelo a tu $PATH.

Instalar Velero en tu clúster

La instalación por defecto de Velero requiere una ubicación de almacenamiento. En este caso, como estamos usando MinIO, crea un archivo llamado credentials-velero con el nombre de usuario y la contraseña de MinIO

# credentials-velero
[default]
aws_access_key_id = admin
aws_secret_access_key = password
Bash

NOTA: En la nube, debes tener una accessKey y secretKey reales con los permisos adecuados para acceder a tu bucket. Además, dependiendo de la nube que estés utilizando, hay una lista de proveedores compatibles aquí. Dado que MinIO es compatible con AWS S3, estamos utilizando el complemento de Velero para AWS

Instala Velero configurando el proveedor, complemento, secretos y las configuraciones de ubicación de copia de seguridad:

velero install --provider aws --bucket velero-backups --plugins velero/velero-plugin-for-aws:v1.4.1 --secret-file ./credentials-velero --use-volume-snapshots=false --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://localhost:9000 --use-restic
Bash

Esto instalará el controlador de Velero en tu clúster con el espacio de nombres (namespaces) velero. En este ejemplo, también estamos utilizando la integración con restic, que permite hacer copias de seguridad de nuestros volúmenes.

CONSEJO: Velero también puede crear spanshots de tus volúmenes si se utiliza un proveedor de nube compatible. De esta manera, no necesitarás la integración con restic

Crear una copia de seguridad

Con el cliente de Velero puedes crear diferentes tipos de copias de seguridad. La forma más rápida de hacer una copia de seguridad es crear copias por espacio de nombres (namespaces):

velero backup create <Backup Name> --include-namespaces <namespace1,namespace2,...,namespaceN>
Bash

Esta operación no realizará una copia de seguridad de los volúmenes por defecto. Para hacerlo, asegúrate de añadir la anotación backup.velero.io/backup-volumes=<nombre-del-volumen-en-el-pod> a los Pods donde se monte un volumen.

Por ejemplo, si tenemos un Pod de RabbitMQ con un volumen:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    backup.velero.io/backup-volumes: persistence
  labels:
    app.kubernetes.io/component: rabbitmq
  name: rabbitmq-server-0
****
  volumes:
    - name: persistence
      persistentVolumeClaim:
        claimName: persistence-rabbitmq-server-0
YAML

En este caso, necesitaríamos anotar kubectl annotate pod rabbitmq-server-0 backup.velero.io/backup-volumes=persistence para que la copia de seguridad de Velero también guarde los datos del volumen.

Rutinas de copia de seguridad

También es posible configurar respaldos recurrentes utilizando rutinas. En este ejemplo, creamos un respaldo recurrente todos los sábados a las 23:00, incluyendo algunos espacios de nombres (namespaces), con una validez de respaldo de 21 días. Esto significa que los respaldos que tengan más de 21 días serán eliminados de la ubicación de almacenamiento y también de la lista de respaldos guardada en el clúster.

velero schedule create sat-23uhr --schedule="0 23 * * 6" --ttl "504h" --include-namespaces namespace1,namespace2,namespace3
Bash

Una vez que se haya configurado la rutina (schedule), puedes ver una lista de los respaldos creados haciendo:

velero backup get
Bash

Para verificar la información sobre la rutinas de respaldos creada anteriormente:

velero schedule get
Bash

Restaurar un respaldo

Para restaurar un respaldo:

velero restore create --from-backup <backup-name>
Bash

Para saber qué respaldos tienes:

velero backups get
Bash

Si deseas apoyarme, invítame un café.