
Vez ou outra, você precisa mover todos os seus workloads do Kubernetes para um novo cluster. Pode ser para testes, para subir uma versão major ou até como parte de um plano de disaster recovery.
Recentemente, precisei migrar o cluster GKE (Google Kubernetes Engine) de um dos nossos clientes da rede Legacy VPC do Google Cloud para uma rede VPC Native — e, infelizmente, o Google Cloud não documenta nenhum caminho de upgrade para redes.
Depois de pesquisar um pouco, achei algumas ferramentas que, juntas, deixaram esse trabalho extremamente simples.
Clonando um cluster existente
O Google Kubernetes Engine (GKE) tem o recurso "create a new cluster", que permite clonar um cluster existente:

Isso ajuda a copiar as configurações do cluster, incluindo:
- Zonas
- Node Pools e a configuração de cada um
- Configurações adicionais, como node labels, entre outras
Claro, você pode editar tudo antes de criar o novo cluster, mas, no geral, essa funcionalidade de "clone" ajuda muito a garantir que todos os nodes e labels fiquem configurados corretamente — em apenas dois cliques. 🚀
Só não esqueça que ela NÃO copia seus recursos do Kubernetes, como deployments, services, ingress, custom resource definitions etc. Para migrar tudo isso, você vai precisar de outra ferramenta.
Migrando recursos do Kubernetes
Com o cluster clonado em mãos, eu precisei migrar todos os recursos do Kubernetes, como:
- Workloads
- Services
- Configs
- Secrets
- Storage
- Custom Resource Definitions
- e muito, muito mais…
Uma rodada rápida de:
$ kubectl api-resourcesjá mostra 74 tipos de recursos do Kubernetes no meu cluster de teste 😱. Eita!
Por sorte, achei o Velero, da Heptio (antigo Heptio Ark), que ajuda a fazer backup e restore tanto dos recursos do cluster Kubernetes quanto dos persistent volumes.
O Velero serve para:
- Backup e restore do seu cluster Kubernetes.
- Copiar recursos de um cluster para outro.
- Replicar seu ambiente de produção em ambientes de desenvolvimento e teste. 🎸
O Velero parecia um ótimo candidato para replicar os recursos do cluster Kubernetes em um novo cluster, então resolvi testar.
Instalação do Velero
O Velero tem 2 componentes principais:
- velero-cli — um cliente de linha de comando que roda localmente
- velero deployment — um servidor que roda no seu cluster
antes de começar, é sempre bom dar uma olhada na release oficial do Velero. A versão (estável) mais recente é a v0.11.0
Como estou instalando o Velero no meu cluster GKE, segui as instruções aqui.
O fluxo básico de instalação é:
- Instale o velero-cli
brew install velero(também dá para baixar manualmente, é só um binário)
2. Crie um bucket no Google Cloud Storage
gsutil mb gs://<gke-cluster-migrate-velero-placeholder-name>3. Crie a service account / permissões / policies
Veja as instruções em "Create service account" aqui
4. Adicione as credenciais ao seu cluster GKE
Veja as instruções em "Credentials and configuration" aqui
não esqueça de substituir <YOUR_BUCKET> no arquivo 05-backupstoragelocation.yaml
5. Faça o deploy do 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.yamlHora do backup!
Para fazer backup do cluster inteiro, usei:
velero backup create <BACKUP-NAME>Quando você executa velero backup create <BACKUP-NAME>:
- O cliente Velero faz uma chamada ao API server do Kubernetes para criar um objeto
Backup. - O
BackupControllerdetecta o novo objetoBackupe faz a validação. - O
BackupControllerinicia o processo de backup, coletando os dados a partir de consultas ao API server pelos recursos. - O
BackupControllerchama o serviço de object storage — por exemplo, o GCS Bucket — para fazer o upload do arquivo de backup.
Show!
Para acompanhar o status do backup, basta executar:
velero get backupsHora da migração
Com um backup completo do nosso cluster original (cluster 1) em mãos, precisei fazer o deploy do Velero no novo cluster (cluster 2).
Alguns pontos exigiram atenção:
- No cluster 2, precisei adicionar a flag
--restore-onlyà spec do servidor no YAML de deployment do Velero. - Precisei garantir que o
BackupStorageLocationbatesse com o do cluster 1, para que a nova instância do servidor Velero apontasse para o mesmo bucket. - Por fim, conferi que os recursos do Velero no cluster 2 estavam sincronizados com os arquivos de backup no cloud storage. Vale lembrar que o intervalo de sincronização padrão é de 1 minuto, então espere um pouco antes de verificar.
velero backup describe <BACKUP-NAME>Depois de confirmar que o backup correto (<BACKUP-NAME>) já estava lá, pude restaurar tudo com:
velero restore create --from-backup <BACKUP-NAME>Agora vamos conferir tudo no cluster 2:
velero restore gete use o nome do restore retornado pelo comando anterior:
velero restore describe <RESTORE-NAME-FROM-GET-COMMAND>É isso!
Com o "Clone Cluster" do GKE e o Heptio Velero, consegui migrar o cluster com sucesso, incluindo a configuração e os recursos.
Essas duas ferramentas me pouparam um monte de horas e simplificaram bastante todo o processo de mapear, fazer backup e restaurar recursos do Kubernetes.
Quer mais histórias como essa? Confira nosso blog ou siga o Eran no Twitter.