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
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!