Kubernetes backups con Velero

Hablar sobre la copia de seguridad en un clúster de Kubernetes puede sonar extraño y es posible que no sea necesario, ya que puede recrear en cualquier momento y de manera muy rápida cualquiera de sus implementaciones o recursos simplemente aplicando un archivo yaml … pero en algunos casos una copia de seguridad de sus recursos puede ser muy útil y puede ser nuestro salvavidas.

Velero es una herramienta de código abierto para realizar copias de seguridad y restaurar de forma segura, realizar recuperación ante desastres y migrar recursos de clúster de Kubernetes y volúmenes persistentes.

Dicho esto, enumeremos en qué situaciones Velero puede ayudarnos:

  • Copia de seguridad de aplicaciones con estado
  • Aplicaciones de respaldo instaladas de manera no declarativa
  • Copia de seguridad de información de PVC
  • Migraciones de clúster
  • Replicar configuraciones de clúster (por ejemplo, desde producción hasta pruebas o clústeres de desarrollo.

 

Después de la aburrida introducción, comenzaremos con la parte divertida. 🙂

Instala Velero en tu clúster de kubernetes

Para este ejemplo, utilizaremos AWS EKS como nuestro proveedor cloud.

En primer lugar, debes instalar el cliente Velero en tu estación de trabajo. Para hacerlo, simplemente ve aquí y descarga el último tarball de acuerdo con el sistema operativo de tu estación de trabajo y extrae el tarball:

tar -xvf RELEASE-TARBALL-NAME.tar.gz

Mueve el binario Velero a algún lugar de tu $ PATH. En MacOS simplemente ejecuta esto:

brew install velero
Una vez que tenemos el cliente Velero instalado en nuestro sistema, podemos proceder a instalar Velero en nuestro clúster de kubernetes. Simplemente, ejecuta esto:
velero install 
    --provider aws 
    --bucket where-to-store-velero-backups 
    --use-restic 
    --secret-file ~/.aws/credentials 
    --use-volume-snapshots=false 
    --plugins=velero/velero-plugin-for-aws:v1.0.0 
    --backup-location-config region=eu-west-1

De forma predeterminada, Velero se instala en el namespace velero, pero puedes cambiarlo agregando el indicador –namespace. Velero utiliza restic para almacenar los datos de los volúmenes adjuntos. Cuando finalices la instalación, deberías ver algo como ésto en su clúster k8s:

$ kubectl get all -n velero
NAME                          READY   STATUS    RESTARTS   AGE
pod/restic-4xr6v              1/1     Running   0          157d
pod/restic-bg58w              1/1     Running   0          157d
pod/restic-hf2fm              1/1     Running   0          157d
pod/restic-w4rvh              1/1     Running   0          157d
pod/velero-57cd659988-bd6nd   1/1     Running   0          73d

NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/restic   4         4         4       4            4                     157d

NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/velero   1/1     1            1           157d

NAME                                DESIRED   CURRENT   READY   AGE
replicaset.apps/velero-57cd659988   1         1         1       157d

En nuestro caso, tenemos 4 nodos de trabajo y restic está instalado en cada nodo que tenemos (se configurará un daemonset).

Por defecto, Velero no incluirá los volúmenes en la copia de seguridad. Para respaldarlos, debes agregar una anotación. Puedes agregarla así:

$ kubectl -n annotate pod/your_pod backup.velero.io/backup-volumes=volume_1,volume_2

(agregua volúmenes separados por comas) o simplemente agrégalo en su definición de implementación, por ejemplo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
      annotations:
        backup.velero.io/backup-volumes: myapp-logs
    spec:
      volumes:
        - name: myapp-logs
          persistentVolumeClaim:
           claimName: myapp-logs
      containers:
      - image: myapp:latest
        name: myapp
        ports:
        - containerPort: 80
        volumeMounts:
          - mountPath: "/var/log/myapp"
            name: myapp-logs
            readOnly: false

Nota: los volúmenes hostPath no son compatibles, pero sí se admite el nuevo tipo de volumen local.

Y, por último, algunos ejemplos de utilización para crear, restaurar y mostrar copias de seguridad:

Backup manual:

# Copia de seguridad de TODOS los recursos en el clúster (todo el clúster)
$ velero backup create my-backup-20200515

# Copia de seguridad de un namespace
$ velero backup create my-backup-20200515 --include-namespaces namespace_to_backup

# Copia de seguridad de TODOS los namespaces excepto los especificados
$ velero backup create my-backup-20200515 --exclude-namespaces namespace_1_to_exclude,namespace_2_to_exclude

Backup Programado:

$ velero create schedule myapp-backup-daily --schedule="0 7 * * *" --include-namespaces namespace_to_backup

Velero respaldará todos los recursos incluidos en tu selección (pods, implementaciones, servicios, …)

La retención de copia de seguridad predeterminada es de 30 días. Si deseas cambiarla, agregue la bandera –ttl. Este indicador te permite especificar el período de retención de la copia de seguridad con el valor especificado en horas, minutos y segundos en la forma –ttl 24h0m0s. Si no se especifica, se aplicará un valor TTL predeterminado de 30 días.

Restaurar Backup:

$ velero restore create --from-backup backup_name

Otros comandos que te serán muy útiles de conocer:

# Para mostrar todas las listas de copias de seguridad almacenadas (nombre, estado, fecha de creación y caducidad)
$ velero get backups

# Para mostrar detalles de una copia de seguridad específica
$ velero describe backup backup_name

Velero es bastante fácil de instalar y ejecutar y puede salvarte la vida en algunas circunstancias. 😉


Espero que hayas disfrutado de este post y te animo a que revises nuestro blog para leer otrosposts que puedan ser de tu interés. No dudes en contactarnos si deseas que te ayudemos en tus proyectos.

¡Nos vemos en la próxima entrada!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *