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
kubectlcon acceso administrativoveleroCLI 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
- Instalar Velero en el clúster RKE2
- Desplegar una aplicación de prueba con PVC
- Crear un backup del namespace
- Verificar el backup
- Eliminar la aplicación
- Restaurar la aplicación desde Velero
- 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"
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-labvuelve a existir - El Deployment y el Service son restaurados
- El PVC vuelve a estar enlazado
- El archivo
index.htmlmantiene 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