Skip to content

Backup y Restore de Workloads con Velero en el Mismo Clúster RKE2

Objetivo

Al finalizar este módulo, el alumno será capaz de instalar Velero en un clúster RKE2, crear un respaldo de una aplicación desplegada en el mismo clúster, eliminar sus recursos y restaurarlos desde el backup.

Prerequisitos

  • Clúster RKE2 funcional
  • kubectl con acceso administrativo
  • velero CLI instalado en la estación de trabajo
  • Bucket S3 o almacenamiento S3-compatible, por ejemplo MinIO
  • Un StorageClass funcional para pruebas con PVC

Contexto

Velero permite respaldar y restaurar recursos de Kubernetes y volúmenes persistentes. En RKE2, esta herramienta complementa los snapshots de etcd: Velero protege aplicaciones, namespaces, manifiestos y datos asociados a PVCs, mientras que RKE2 usa snapshots de etcd para proteger el estado del control plane.

Diferencia entre Velero y etcd snapshots

Herramienta Protege Uso recomendado
Velero Namespaces, Deployments, Services, ConfigMaps, Secrets, PVCs y datos de la app Recuperación de aplicaciones y namespaces
rke2 etcd-snapshot Estado del datastore etcd del clúster Recuperación del control plane y estado del clúster

Agenda

  1. Instalar Velero en el clúster RKE2
  2. Desplegar una aplicación de prueba con PVC
  3. Crear un backup del namespace
  4. Verificar el backup
  5. Eliminar la aplicación
  6. Restaurar la aplicación desde Velero
  7. Validar recursos y persistencia de datos

Laboratorio

1. Instalar Velero en RKE2

Crear archivo de credenciales:

cat > credentials-velero <<EOF
[default]
aws_access_key_id=admin
aws_secret_access_key=SuperSecretKey
EOF

Descargar la versión deseada desde GitHub y copiar el binario al sistema:

VERSION="v1.16.2"
wget https://github.com/vmware-tanzu/velero/releases/download/${VERSION}/velero-${VERSION}-linux-amd64.tar.gz
tar -xzf velero-${VERSION}-linux-amd64.tar.gz
sudo mv velero-${VERSION}-linux-amd64/velero /usr/local/bin/
velero version --client-only

Instalar Velero apuntando a MinIO o a tu backend S3:

velero install   --provider aws   --plugins velero/velero-plugin-for-aws:v1.10.0   --bucket velero-backups   --secret-file ./credentials-velero   --backup-location-config region=minio,s3ForcePathStyle=true,s3Url=https://minio.minio.svc   --use-node-agent   --default-volumes-to-fs-backup

Verificar instalación:

kubectl get pods -n velero
velero backup-location get

Editar el recurso de backup de y agregar la siguiente linea

kubectl edit BackupStorageLocation -n velero
insecureSkipTLSVerify: "true"
Dentro de config

2. Crear namespace y aplicación de prueba

kubectl create namespace velero-lab

Crear manifiesto de prueba:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-data
  namespace: velero-lab
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
  namespace: velero-lab
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-demo
  template:
    metadata:
      labels:
        app: nginx-demo
    spec:
      containers:
      - name: nginx
        image: nginx:1.27
        ports:
        - containerPort: 80
        volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: nginx-data
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-demo
  namespace: velero-lab
spec:
  selector:
    app: nginx-demo
  ports:
  - port: 80
    targetPort: 80
EOF

Verificar despliegue:

kubectl get all -n velero-lab
kubectl get pvc -n velero-lab

3. Escribir datos en el volumen

Obtener el pod:

kubectl get pod -n velero-lab

Escribir un archivo de prueba:

kubectl exec -n velero-lab $POD -- /bin/sh -c 'echo "Backup Velero OK" > /usr/share/nginx/html/index.html'
kubectl exec -n velero-lab $POD -- cat /usr/share/nginx/html/index.html

4. Crear el backup con Velero

velero backup create velero-lab-backup \
  --include-namespaces velero-lab \
  --default-volumes-to-fs-backup

Verificar estado:

velero backup get
velero backup describe velero-lab-backup --details
velero backup logs velero-lab-backup

5. Simular pérdida de la aplicación

Eliminar el namespace completo:

kubectl delete namespace velero-lab

Esperar a que desaparezca:

kubectl get ns velero-lab

6. Restaurar desde el backup

velero restore create --from-backup velero-lab-backup

Verificar restauración:

velero restore get
kubectl get all -n velero-lab
kubectl get pvc -n velero-lab

7. Validar recuperación del contenido

Obtener nuevamente el pod:

kubectl get pod -n velero-lab

Validar archivo restaurado:

kubectl exec -n velero-lab $POD -- cat /usr/share/nginx/html/index.html

Resultado esperado:

  • El namespace velero-lab vuelve a existir
  • El Deployment y el Service son restaurados
  • El PVC vuelve a estar enlazado
  • El archivo index.html mantiene el contenido escrito antes del backup

Buenas prácticas

  • Usar namespaces dedicados para respaldos de laboratorio
  • Validar siempre el backup con velero backup describe
  • Probar restauraciones periódicamente, no solo crear backups
  • Combinar Velero para aplicaciones con snapshots de etcd para recuperación del clúster completo

Referencias