O etcd é o banco de dados chave-valor que armazena todo o estado do cluster Kubernetes. Fazer backup regular é crítico para disaster recovery.

Conceito Geral

  • etcd armazena todos os objetos do cluster (pods, services, configmaps, secrets, etc)
  • Backup deve ser feito de forma consistente (snapshot)
  • Restore recria o cluster no estado exato do snapshot
  • Em HA, apenas um membro do etcd precisa fazer backup
Cluster K8s
   ↓
etcd (state database)
   ↓
Snapshot (backup point-in-time)
   ↓
Armazenamento seguro
   ↓
Restore (em caso de desastre)
   ↓
Cluster restaurado

Backup do etcd

ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot.db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

Verificar Snapshot

ETCDCTL_API=3 etcdctl snapshot status /backup/etcd-snapshot.db --write-out=table

Restore do etcd

# Parar kube-apiserver
mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/

# Restore
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-snapshot.db \
  --data-dir=/var/lib/etcd-restore \
  --initial-cluster=master=https://10.0.0.1:2380 \
  --initial-advertise-peer-urls=https://10.0.0.1:2380

# Atualizar etcd.yaml para apontar para novo data-dir
vim /etc/kubernetes/manifests/etcd.yaml
# Alterar: --data-dir=/var/lib/etcd-restore

# Restaurar kube-apiserver
mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/

Backup Automatizado (Cron)

# /etc/cron.d/etcd-backup
0 2 * * * root /usr/local/bin/etcd-backup.sh

# /usr/local/bin/etcd-backup.sh
#!/bin/bash
DATE=$(date +\%Y\%m\%d-\%H\%M)
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-${DATE}.db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

# Manter apenas últimos 7 dias
find /backup -name "etcd-*.db" -mtime +7 -delete