
De vez en cuando vas a necesitar mover todo tu workload de Kubernetes a un nuevo clúster. Puede ser para hacer pruebas, para actualizar a una versión mayor o, en algunos casos, como parte de un plan de recuperación ante desastres.
Hace poco tuve que migrar el clúster de GKE (Google Kubernetes Engine) de uno de nuestros clientes desde una Legacy VPC Network de Google Cloud hacia una VPC Native Network y, por desgracia, no existe una ruta de actualización documentada para las redes en Google Cloud.
Tras investigar un poco, di con un par de herramientas que, en conjunto, hicieron que el proceso fuera muy sencillo.
Clonar un clúster existente
Google Kubernetes Engine (GKE) tiene la opción de "crear un nuevo clúster", que permite clonar uno ya existente:

Esto sirve para copiar las configuraciones del clúster, entre ellas:
- Zonas
- Node Pools y la configuración asociada de cada node pool
- Otros ajustes de configuración, como etiquetas de nodo, entre otros
Por supuesto, puedes editar lo que quieras antes de crear el nuevo clúster, pero esta funcionalidad de "clonar" ayuda muchísimo a dejar todos los nodos y etiquetas correctamente configurados con apenas dos clics. 🚀
Eso sí, ten en cuenta que NO copia tus recursos de Kubernetes —deployments, services, ingress, custom resource definitions— así que vas a necesitar otra herramienta para migrarlos.
Migrar los recursos de Kubernetes
Ahora que tenemos un clúster clonado, faltaba migrar todos los recursos de Kubernetes, tales como:
- Workloads
- Services
- Configs
- Secrets
- Storage
- Custom Resource Definitions
- y muchos, muchos más…
Con solo correr:
$ kubectl api-resourcesaparecen 74 tipos de recursos de Kubernetes en mi clúster de prueba 😱. ¡Ufa!
Por suerte di con Velero de Heptio (antes Heptio Ark), que me sirvió para respaldar y restaurar los recursos de mi clúster de Kubernetes, además de los volúmenes persistentes.
Velero te sirve para:
- Respaldar y restaurar tu clúster de Kubernetes.
- Copiar recursos de un clúster a otro.
- Replicar tu entorno de producción en entornos de desarrollo y pruebas. 🎸
Velero parecía un buen candidato para replicar los recursos del clúster de Kubernetes en un clúster nuevo, así que decidí probarlo.
Instalación de Velero
Velero tiene 2 componentes principales:
- velero-cli — un cliente de línea de comandos que corre localmente
- velero deployment — un servidor que corre en tu clúster
Antes de arrancar, conviene revisar el release oficial de Velero. La última versión (estable) es la v0.11.0
Como voy a instalar Velero en mi clúster de GKE, seguí las instrucciones de aquí.
El flujo básico de instalación es:
- Instalar velero-cli
brew install velero(también lo puedes descargar a mano, es un único binario)
2. Crear un bucket de Google Cloud Storage
gsutil mb gs://<gke-cluster-migrate-velero-placeholder-name>3. Crear cuenta de servicio / permisos / políticas
Mira las instrucciones en "Create service account" aquí
4. Agregar credenciales a tu clúster de GKE
Mira las instrucciones en "Credentials and configuration" aquí
no olvides reemplazar <YOUR_BUCKET> en el archivo 05-backupstoragelocation.yaml
5. Desplegar el velero-server
kubectl apply -f config/gcp/05-backupstoragelocation.yaml kubectl apply -f config/gcp/06-volumesnapshotlocation.yaml kubectl apply -f config/gcp/10-deployment.yaml¡Hora del backup!
Para respaldar todo mi clúster usé:
velero backup create <BACKUP-NAME>Cuando corres velero backup create <BACKUP-NAME>:
- El cliente de Velero hace una llamada al API server de Kubernetes para crear un objeto
Backup. - El
BackupControllerdetecta el nuevo objetoBackupy lo valida. - El
BackupControllerarranca el proceso de respaldo. Recopila los datos a respaldar consultándole los recursos al API server. - El
BackupControllerhace una llamada al servicio de almacenamiento de objetos —por ejemplo, un GCS Bucket— para subir el archivo de respaldo.
¡Genial!
Para ver el estado de tu respaldo, basta con correr:
velero get backupsHora de migrar
Ahora que tenemos un respaldo completo de nuestro clúster original (cluster 1), me tocó desplegar Velero en el nuevo clúster (cluster 2).
Hubo algunos detalles a los que tuve que prestar atención:
- En el cluster 2, tuve que añadir el flag
--restore-onlya la spec del servidor en el YAML del deployment de Velero. - Me aseguré de que el
BackupStorageLocationcoincidiera con el del cluster 1, para que la nueva instancia del servidor de Velero apuntara al mismo bucket. - Por último, verifiqué que los recursos de Velero en el cluster 2 estuvieran sincronizados con los archivos de respaldo en cloud storage. Ten presente que el intervalo de sincronización por defecto es de 1 minuto, así que conviene esperar antes de validar.
velero backup describe <BACKUP-NAME>Una vez confirmado que el respaldo correcto (<BACKUP-NAME>) ya estaba disponible, pude restaurar todo con:
velero restore create --from-backup <BACKUP-NAME>Ahora verifiquemos todo en el cluster 2:
velero restore gety usa el nombre de la restauración que arroja el comando anterior:
velero restore describe <RESTORE-NAME-FROM-GET-COMMAND>¡Y listo!
Con la función "Clone Cluster" de GKE y Heptio Velero pude migrar el clúster sin contratiempos, incluyendo tanto la configuración como los recursos.
Estas dos herramientas me ahorraron muchísimas horas y simplificaron enormemente el proceso de mapear, respaldar y restaurar los recursos de Kubernetes.
¿Quieres más historias? Pásate por nuestro blog o sigue a Eran en Twitter.