etcd的备份和还原
# etcd的备份和还原
安装客户端命令
执行:
wget https://github.com/etcd-io/etcd/releases/download/v3.6.11/etcd-v3.6.11-linux-amd64.tar.gz
tar -xf etcd-v3.6.11-linux-amd64.tar.gz
mv etcd-v3.6.11-linux-amd64/etcdctl /usr/local/bin/
1
2
3
2
3
Kubernetes etcd 备份和还原操作指南(基于官方 Kubernetes 和 etcd 文档)
etcd 是 Kubernetes 的核心数据存储,所有集群状态(Pod、Service、Deployment 等)都保存在其中。定期备份 etcd 是生产环境灾难恢复的关键。
# 1. 备份 etcd(推荐使用内置快照)
# 准备工作
- 在 Control Plane 节点(Master)上执行,通常在运行 etcd 的节点。
- 确认
etcdctl已安装(Kubernetes 集群通常已内置)。 - 获取证书路径(kubeadm 安装常见路径):
- CA:
/etc/kubernetes/pki/etcd/ca.crt - Cert:
/etc/kubernetes/pki/etcd/server.crt - Key:
/etc/kubernetes/pki/etcd/server.key
- CA:
# 备份命令(推荐)
ETCDCTL_API=3 etcdctl --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 \
snapshot save /backup/etcd-snapshot-$(date +%Y%m%d-%H%M%S).db
1
2
3
4
5
2
3
4
5
--endpoints:可改为集群中其他 etcd 成员地址。- 建议将备份文件复制到安全位置(外部存储、S3 等),并加密敏感数据。
# 验证备份
etcdutl --write-out=table snapshot status /backup/etcd-snapshot-xxx.db
# 或(旧方式,etcd v3.5+ 推荐 etcdutl)
ETCDCTL_API=3 etcdctl --write-out=table snapshot status /backup/etcd-snapshot-xxx.db
1
2
3
2
3
# 2. 还原 etcd(恢复集群状态)
重要警告:
- 先停止所有 kube-apiserver(防止数据不一致)。
- 在 HA 集群中,所有 etcd 成员都需要使用同一份快照进行还原。
- 还原会创建新的数据目录,成员 ID 和集群 ID 会被重置。
- 推荐重启相关组件(kube-scheduler、kube-controller-manager、kubelet)以刷新缓存。
# 步骤(单节点或 stacked etcd 简化版)
停止 API Server:
systemctl stop kubelet # 或手动删除 static pod mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/ # 等待 apiserver 停止1
2
3(可选)备份当前 etcd 数据(以防万一):
mv /var/lib/etcd /var/lib/etcd.bak1执行还原(推荐使用 etcdutl):
# 创建新数据目录 etcdutl snapshot restore /backup/etcd-snapshot-xxx.db \ --data-dir /var/lib/etcd-new1
2
3对于多节点 HA 集群,需指定成员信息(参考 etcd 官方文档):
etcdutl snapshot restore /backup/etcd-snapshot-xxx.db \ --name <member-name> \ --data-dir /var/lib/etcd-new \ --initial-cluster <member1>=https://<ip1>:2380,<member2>=https://<ip2>:2380,... \ --initial-cluster-token etcd-cluster-1 \ --initial-advertise-peer-urls https://<this-ip>:23801
2
3
4
5
6更新 etcd 配置(kubeadm 集群):
编辑
/etc/kubernetes/manifests/etcd.yaml,将hostPath的etcd-data路径改为新目录(如/var/lib/etcd-new)。恢复 apiserver:
mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/ systemctl start kubelet1
2
验证:
- 检查 etcd Pod 是否 Running。
kubectl get all --all-namespaces验证资源是否恢复。
注意:
- etcd v3.5+ 推荐使用
etcdutl进行 restore 和 status 操作(etcdctl相关功能已弃用)。 - 如果 revision 回退,可能导致控制器缓存问题,建议使用
--bump-revision和--mark-compacted。
# 3. 最佳实践
- 自动化备份:使用 CronJob + PVC / 对象存储(Velero、etcd-backup 工具等)。
- 测试还原:定期在测试环境中验证备份有效性。
- 生产建议:使用 3 或 5 节点 etcd 集群;备份后立即测试;结合卷快照(EBS 等)。
- 托管 Kubernetes(EKS/GKE/AKS):平台通常自动备份,无需手动操作。
- 升级前必须备份 etcd。
更多官方参考:
如果你的集群是 kubeadm 部署、多节点 HA,或使用特定存储,提供更多细节我可以给出更精确的命令。操作时务必谨慎,建议在维护窗口内进行!
脚本定时备份操作
步骤 1:创建备份脚本
cat > /usr/local/bin/etcd-backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/etcd-snapshot-${DATE}.db"
mkdir -p ${BACKUP_DIR}
echo "=== Starting etcd backup at $(date) ==="
ETCDCTL_API=3 etcdctl --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 \
snapshot save ${BACKUP_FILE}
if [ $? -eq 0 ]; then
echo "Backup successful: ${BACKUP_FILE}"
echo "Size: $(du -h ${BACKUP_FILE} | cut -f1)"
# 保留最近 7 天备份,删除更旧的
find ${BACKUP_DIR} -name "etcd-snapshot-*.db" -mtime +7 -delete
else
echo "Backup failed!"
exit 1
fi
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
步骤 2:添加执行权限并测试
chmod +x /usr/local/bin/etcd-backup.sh
/usr/local/bin/etcd-backup.sh
1
2
2
步骤 3:设置定时任务(每天凌晨 2 点执行)
crontab -e
# etcd 每日备份(每天凌晨2点)
0 2 * * * /usr/local/bin/etcd-backup.sh >> /var/log/etcd-backup.log 2>&1
1
2
3
2
3
上次更新: 2026/05/21, 21:01:23
|