Faça backup de Kubernetes de verdade: snapshots do etcd do k3s enviados para S3, Velero para namespaces e volumes, e como testar a restauração.
Para que serve
Um backup de Kubernetes completo tem duas partes: o estado do cluster (todos os objetos guardados no etcd: deployments, secrets, certificados, configurações) e os dados dos volumes (bancos, uploads). Este artigo mostra como proteger as duas no k3s: snapshots do etcd, automáticos e enviados para um armazenamento S3, e o Velero, que faz backup e restauração por namespace, inclusive do conteúdo dos PVCs. Lembre-se: sem o serviço de Gerenciamento contratado, o backup do que roda no servidor é responsabilidade sua.
Para a política geral (regra 3-2-1, retenção e testes), veja Como montar a política de backup do seu servidor dedicado. Se o cluster roda em VMs no Proxmox, o backup das VMs (veja Backup das VMs no Proxmox com vzdump e Proxmox Backup Server) é uma camada extra, mas não substitui o que está aqui: restaurar uma única VM de um cluster etcd pode trazê-la com dados divergentes das outras.
Pré-requisitos
- Cluster k3s com etcd embutido (instalado com
cluster-init; veja Como instalar o k3s em servidor dedicado). - Um bucket S3 fora deste servidor: outro servidor com MinIO/Garage ou um provedor compatível com S3. Tenha endpoint, bucket, access key e secret key.
- Cópia do token do cluster:
/var/lib/rancher/k3s/server/token. Sem ele, um snapshot não pode ser restaurado em máquinas novas. Guarde-o no seu cofre de senhas.
cluster-init, o banco é SQLite e os comandos de etcd-snapshot não se aplicam. Nesse caso, copie /var/lib/rancher/k3s/server/db/ e o token com o k3s parado, ou migre para etcd reiniciando o servidor com cluster-init: true no config.yaml.Etapa 1: snapshots automáticos do etcd para S3
Por padrão o k3s já tira snapshots às 00h e 12h e mantém 5 por servidor, em /var/lib/rancher/k3s/server/db/snapshots. O problema: ficam no mesmo disco. Acrescente ao /etc/rancher/k3s/config.yaml de cada servidor:
etcd-snapshot-schedule-cron: "0 */6 * * *"
etcd-snapshot-retention: 12
etcd-s3: true
etcd-s3-endpoint: s3.seuprovedor.com
etcd-s3-bucket: k3s-backup
etcd-s3-folder: cluster-producao
etcd-s3-access-key: SUA_ACCESS_KEY
etcd-s3-secret-key: SUA_SECRET_KEY
Reinicie um servidor por vez (systemctl restart k3s). Proteja o arquivo com chmod 600, pois ele tem credenciais. Tire um snapshot manual para validar:
k3s etcd-snapshot save --name antes-da-mudanca
k3s etcd-snapshot ls
A lista deve mostrar o snapshot local e a cópia no S3. Faça um snapshot manual antes de cada atualização do k3s.
Etapa 2: restaurar o etcd (desastre ou erro grave)
- Pare o k3s em todos os servidores:
systemctl stop k3s. - No primeiro servidor, restaure (com o token original, se for uma máquina nova):
Para baixar direto do S3, acrescente as mesmas opçõesk3s server --cluster-reset \ --cluster-reset-restore-path=/var/lib/rancher/k3s/server/db/snapshots/NOME-DO-SNAPSHOT \ --token=TOKEN_ORIGINAL--etcd-s3...e informe só o nome do snapshot. Quando o comando terminar, inicie:systemctl start k3s. - Nos demais servidores, apague o banco antigo e inicie, para que entrem de novo no cluster restaurado:
rm -rf /var/lib/rancher/k3s/server/db/ systemctl start k3s
Etapa 3: instalar o Velero
O Velero 1.18 usa o plugin AWS 1.14 para qualquer armazenamento compatível com S3. Na máquina de administração:
# CLI (confira a versão mais recente em github.com/velero-io/velero/releases)
wget https://github.com/velero-io/velero/releases/download/v1.18.2/velero-v1.18.2-linux-amd64.tar.gz
tar xzf velero-v1.18.2-linux-amd64.tar.gz
install velero-v1.18.2-linux-amd64/velero /usr/local/bin/
cat > credentials-velero <<'EOF'
[default]
aws_access_key_id=SUA_ACCESS_KEY
aws_secret_access_key=SUA_SECRET_KEY
EOF
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.14.4 \
--bucket velero-backup \
--secret-file ./credentials-velero \
--backup-location-config region=us-east-1,s3ForcePathStyle="true",s3Url=https://s3.seuprovedor.com \
--use-volume-snapshots=false \
--use-node-agent \
--default-volumes-to-fs-backup
rm credentials-velero
O --use-node-agent com --default-volumes-to-fs-backup faz o Velero copiar o conteúdo de todos os volumes montados nos pods, com o Kopia (deduplicado e incremental). Alguns provedores S3 exigem também checksumAlgorithm="" na lista de --backup-location-config.
Volumes do local-path: por padrão o local-path do k3s cria volumes do tipo hostPath, que o backup de sistema de arquivos do Velero ignora. Para PVCs novos, adicione a anotação volumeType: local no PVC; volumes do Longhorn são suportados normalmente. Confirme sempre no relatório do backup que os volumes foram incluídos.
Etapa 4: criar backups e agendamentos
# backup avulso de um namespace
velero backup create site-manual --include-namespaces site --wait
# agendamento diário às 3h, guardando por 14 dias, de todos os namespaces
velero schedule create diario --schedule="0 3 * * *" --ttl 336h0m0s \
--exclude-namespaces kube-system,velero
velero backup get
Bancos de dados gravando durante a cópia podem gerar backup inconsistente. Para eles, use também o dump nativo (pg_dump, mysqldump) ou os hooks de pré-backup do Velero para congelar a escrita.
Como saber se funcionou
Backup só vale se a restauração foi testada. Restaure em outro namespace, sem afetar o original:
velero backup describe site-manual --details
velero restore create teste-restore --from-backup site-manual \
--namespace-mappings site:site-teste --wait
kubectl -n site-teste get pods,pvc
O describe deve mostrar Phase: Completed e a lista de volumes copiados; no namespace site-teste, os pods devem subir com os dados. Apague depois com kubectl delete ns site-teste. Repita o teste periodicamente e anote o tempo que leva.
Problemas comuns
Backup em PartiallyFailed
Veja velero backup logs NOME | grep -i error. Causas comuns: pod sem node-agent no nó (confira kubectl -n velero get pods -o wide) ou volume em estado inválido.
BackupStorageLocation Unavailable
Credenciais, endpoint ou bucket errados, ou o servidor não alcança o S3. Teste com velero backup-location get e revise o s3Url e o s3ForcePathStyle.
Snapshot do etcd não aparece no S3
Confira journalctl -u k3s | grep -i s3. Relógio fora de sincronia também causa erro de assinatura no S3.
Perguntas frequentes
Preciso do Velero se já tenho snapshot do etcd?
Sim, para os dados. O snapshot do etcd guarda apenas os objetos do Kubernetes, não o conteúdo dos volumes, e só restaura o cluster inteiro.
Posso usar o Velero para migrar para outro cluster?
Pode. Instale o Velero no cluster novo apontando para o mesmo bucket e rode o restore. É uma forma comum de migrar entre versões ou provedores.
Onde deixar o bucket S3?
Fora do servidor e, de preferência, em outro datacenter ou provedor, com versionamento ou bloqueio de objetos para resistir a ransomware.
Leitura complementar
Precisa de ajuda?
Se precisar de acesso ao console IPMI/iLO para uma restauração de emergência, abra um ticket ou chame o suporte 24/7.
