Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Migração de cluster do Google Kubernetes Engine com Heptio Velero

By Eran ChetzroniApr 22, 20194 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

1 yyq8hwire9b5wgawnxivhq

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:

1 nkdwsv7pbf4pv6bavvnbw

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

já 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:

  1. velero-cli — um cliente de linha de comando que roda localmente
  2. 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 é:

  1. 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.yaml

Hora do backup!

Para fazer backup do cluster inteiro, usei:

velero backup create <BACKUP-NAME>

Quando você executa velero backup create <BACKUP-NAME>:

  1. O cliente Velero faz uma chamada ao API server do Kubernetes para criar um objeto Backup.
  2. O BackupController detecta o novo objeto Backup e faz a validação.
  3. O BackupController inicia o processo de backup, coletando os dados a partir de consultas ao API server pelos recursos.
  4. O BackupController chama 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 backups

Hora 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 BackupStorageLocation batesse 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 get

e 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.