Disaster recovery: Velero para backup e restore de clusters

1. Fundamentos do Disaster Recovery em Kubernetes

1.1. Por que backup e restore são críticos em ambientes K8s

Em ambientes Kubernetes, a resiliência não é sinônimo de backup automático. Embora o control plane seja projetado para alta disponibilidade, falhas catastróficas podem ocorrer: corrupção do banco de dados etcd, falha irreversível do control plane, erro humano na exclusão de namespaces ou aplicação de configurações incorretas, ataques de ransomware ou até mesmo desastres físicos no datacenter. Sem uma estratégia de backup consistente, a recuperação pode levar horas ou dias, causando perda de dados irreparável.

1.2. Desafios específicos

O Kubernetes apresenta desafios únicos para backup e restore:

  • Estado efêmero dos pods: Pods são voláteis por natureza; o estado real está nos PersistentVolumeClaims (PVCs) e no etcd.
  • Volumes persistentes: Snapshots de disco precisam ser consistentes com o estado do banco de dados ou aplicação.
  • Recursos customizados (CRDs): Operadores e extensões do cluster criam objetos que não são nativamente gerenciados pelo backup tradicional.
  • Dependências entre recursos: Secrets, ConfigMaps e Services precisam ser restaurados na ordem correta.

1.3. Visão geral do Velero

O Velero (anteriormente Heptio Ark) é uma ferramenta open-source para backup e restore de clusters Kubernetes. Sua arquitetura é composta por:

  • Servidor Velero: Um deployment no cluster que orquestra backups, restores e schedules.
  • Plugins: Extensões para integração com provedores de nuvem (AWS S3, Google GCS, Azure Blob) e sistemas de snapshot (CSI, cloud-specific).
  • CLI: Ferramenta de linha de comando para gerenciar backups e restores.
  • Storage backend: Local remoto (bucket S3, GCS, Azure Blob) onde os dados são armazenados.

2. Instalação e Configuração do Velero

2.1. Pré-requisitos

Antes de instalar, você precisa:

  • Acesso de administrador ao cluster Kubernetes (kubeconfig).
  • Uma conta de armazenamento compatível (ex: bucket S3 na AWS, bucket GCS no GCP, container Blob no Azure).
  • Permissões para criar recursos RBAC e ServiceAccounts.

2.2. Instalação via CLI

Baixe a CLI do Velero e instale o servidor no cluster:

# Download da CLI (Linux)
wget https://github.com/vmware-tanzu/velero/releases/download/v1.14.0/velero-v1.14.0-linux-amd64.tar.gz
tar -xvf velero-v1.14.0-linux-amd64.tar.gz
sudo mv velero-v1.14.0-linux-amd64/velero /usr/local/bin/

# Instalação no cluster (exemplo com AWS S3)
velero install \
    --provider aws \
    --plugins velero/velero-plugin-for-aws:v1.10.0 \
    --bucket meu-bucket-backup \
    --backup-location-config region=us-east-1 \
    --snapshot-location-config region=us-east-1 \
    --use-volume-snapshots=true \
    --secret-file ./credentials-velero

O arquivo credentials-velero deve conter as credenciais de acesso ao bucket (access key e secret key).

2.3. Verificação da instalação

# Verificar deployment
kubectl get deployments -n velero

# Verificar logs
kubectl logs deployment/velero -n velero

# Testar conectividade com o storage
velero backup-location get

Se tudo estiver correto, você verá o backup location como Available.

3. Estratégias de Backup com Velero

3.1. Backup completo vs. seletivo

Backup completo do cluster:

velero backup create backup-completo --include-cluster-resources=true --ttl 720h

Backup seletivo por namespace:

velero backup create backup-producao --include-namespaces producao

Backup por label:

velero backup create backup-critical --selector app=critical

3.2. Schedules automáticos com retenção

Configure backups automáticos usando cron jobs:

velero schedule create diario-backup \
    --schedule="0 2 * * *" \
    --ttl 168h \
    --include-namespaces producao \
    --use-volume-snapshots=true

# Verificar schedules
velero schedule get

Política de retenção: defina --ttl (time-to-live) para cada backup. Após expirar, o Velero remove automaticamente os dados do storage.

3.3. Backup de volumes persistentes

Com plugins de snapshot (ex: CSI), o Velero pode fazer snapshot consistente de volumes:

# Backup com snapshot de PVCs
velero backup create backup-com-pvc \
    --include-namespaces app \
    --snapshot-move-data=true

Para ambientes cloud-native, utilize plugins específicos:

  • AWS: velero-plugin-for-aws (EBS snapshots)
  • GCP: velero-plugin-for-gcp (PD snapshots)
  • Azure: velero-plugin-for-microsoft-azure (Azure Disk snapshots)

4. Restauração e Recuperação de Desastres

4.1. Restore completo do cluster

Em caso de perda total do cluster, primeiro recrie o cluster Kubernetes, instale o Velero e então execute:

# Listar backups disponíveis
velero backup get

# Restaurar backup completo
velero restore create --from-backup backup-completo --restore-volumes=true

4.2. Restore seletivo

Recuperar apenas um namespace específico:

velero restore create --from-backup backup-producao \
    --include-namespaces producao

4.3. Tratamento de conflitos e remapeamento

Ao restaurar em um cluster diferente, pode haver conflitos de nomes. Use --namespace-mappings:

velero restore create --from-backup backup-producao \
    --namespace-mappings producao:producao-novo \
    --restore-volumes=true

Para remapear PVs, utilize anotações ou scripts pós-restore para ajustar StorageClasses.

5. Automação e Integração com Pipeline DevOps

5.1. Scripts de backup/restore via CI/CD

Exemplo de job para GitHub Actions:

name: Backup Kubernetes

on:
  schedule:
    - cron: '0 3 * * *'

jobs:
  backup:
    runs-on: ubuntu-latest
    steps:
      - name: Instalar Velero CLI
        run: |
          wget https://github.com/vmware-tanzu/velero/releases/download/v1.14.0/velero-v1.14.0-linux-amd64.tar.gz
          tar -xvf velero-v1.14.0-linux-amd64.tar.gz
          sudo mv velero-v1.14.0-linux-amd64/velero /usr/local/bin/
      - name: Executar backup
        run: |
          velero backup create ci-backup-$(date +%Y%m%d) \
            --include-namespaces producao \
            --ttl 168h

5.2. Notificações e alertas

Integre com Slack via webhook:

velero backup create backup-notificado \
    --include-namespaces producao \
    --labels "env=producao,team=devops"

# Script pós-backup para notificar
if [ $? -eq 0 ]; then
    curl -X POST -H 'Content-type: application/json' \
        --data '{"text":"Backup concluído com sucesso!"}' \
        https://hooks.slack.com/services/SEU_WEBHOOK
fi

5.3. Testes periódicos de restore

Automatize testes de restore em um cluster de staging:

# Script de teste de restore
velero restore create --from-backup backup-semanal \
    --namespace-mappings producao:test-restore \
    --restore-volumes=false

# Validar se pods estão rodando
kubectl get pods -n test-restore

# Limpar restore
velero restore delete restore-teste

6. Boas Práticas e Troubleshooting

6.1. Segurança

  • Criptografia: Use buckets com criptografia do lado do servidor (SSE-S3, CMEK no GCP).
  • Gerenciamento de secrets: Armazene credenciais do Velero em um Secret Kubernetes, não em arquivos planos.
  • Controle de acesso: Restrinja acesso ao bucket com IAM roles e políticas de least privilege.

6.2. Monitoramento de desempenho

Monitore métricas importantes:

# Tamanho dos backups
velero backup describe backup-producao | grep "Size"

# Tempo de restore
time velero restore create --from-backup backup-producao

# Limites de API K8s: aumente o rate limit se necessário
velero install --features=EnableAPIGroupVersions

6.3. Problemas comuns e soluções

  • Falha de snapshot de volume: Verifique se o plugin CSI está instalado e se a StorageClass suporta snapshots.
  • Timeout de restore: Aumente o timeout com --wait ou divida o restore em partes menores.
  • Incompatibilidade de versão: Sempre use versões compatíveis entre Velero, plugins e Kubernetes (consulte a matriz de compatibilidade).

Referências