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