etcd 灾备演练
下面给你一套生产级、可直接落地的 etcd 灾备演练手册,适配 Kubernetes(kubeadm 部署的静态 Pod etcd),覆盖备份、单节点故障、全集群灾难恢复、验证全流程,是运维标准演练方案。
一、演练核心目标
- 掌握 etcd 一致性快照备份/校验
- 掌握 单 etcd 节点故障自愈
- 掌握 整个 etcd 集群崩溃后从快照完整恢复
- 验证 Kubernetes 控制平面 & 业务可用性
- 形成可固化的灾备 SOP
二、前置条件(必须满足)
- etcd 版本:v3.4+(使用 v3 API)
- 集群:3 节点 etcd(奇数节点,生产标准)
- 证书路径(kubeadm 默认):
- CA:
/etc/kubernetes/pki/etcd/ca.crt - 服务端证书/密钥:
server.crt/server.key
- CA:
- 演练环境:优先测试集群;生产必须选业务低峰窗口期
- 工具:
etcdctl、kubectl、root 权限、外部备份存储(对象存储/异地服务器)
所有命令统一使用:
ETCDCTL_API=3+ TLS 证书参数
三、步骤0:演练前检查(基线)
在 任意 Master 节点 执行:
# 1. 检查 etcd 集群健康
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 \
endpoint health
# 2. 查看集群成员
ETCDCTL_API=3 etcdctl member list
# 3. 查看 Kubernetes 状态(记录基线)
kubectl get nodes
kubectl get pods --all-namespaces | grep -v Running | wc -l
四、核心操作:etcd 一致性快照备份(灾备基础)
必须先会备份,再谈恢复
4.1 执行快照备份
# 创建备份目录
mkdir -p /backup/etcd
# 备份(文件名带时间戳)
SNAP_FILE="/backup/etcd/etcd-snapshot-$(date +%Y%m%d-%H%M%S).db"
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 "${SNAP_FILE}"
4.2 校验快照(关键!避免备份损坏)
ETCDCTL_API=3 etcdctl snapshot status "${SNAP_FILE}" -w table
看到 HASH、VERSION、SIZE 正常即有效。
4.3 异地归档(生产强制)
- 拷贝到对象存储(S3/MinIO)
- 或异地服务器:
scp $SNAP_FILE backup-server:/backup/ - 保留策略:每日全量 + 保留 7~30 天
五、演练场景1:单 etcd 节点故障(最常见)
模拟:某一台 etcd 节点宕机/数据损坏
5.1 制造故障(演练用)
# 在故障节点上,临时移走 etcd 静态 Pod 定义(kubeadm 方式)
mv /etc/kubernetes/manifests/etcd.yaml /tmp/
# etcd 会自动停止
5.2 观察现象
etcdctl endpoint health出现不健康节点- k8s 仍可用(只要多数节点正常)
5.3 恢复单节点
5.3.1 从集群移除坏节点
在健康 Master 执行:
# 先获取坏节点 member ID(从 member list)
ETCDCTL_API=3 etcdctl member remove <MEMBER_ID>
5.3.2 清理故障节点数据
# 在故障节点
systemctl stop kubelet
rm -rf /var/lib/etcd/*
mv /tmp/etcd.yaml /etc/kubernetes/manifests/
5.3.3 将节点重新加入 etcd 集群
在健康节点生成加入命令,在故障节点执行:
# 示例(替换为你的 IP/名称)
ETCDCTL_API=3 etcdctl member add etcd-node2 \
--peer-urls=https://192.168.1.22:2380
5.4 验证
etcdctl endpoint health
etcdctl member list
kubectl get nodes
六、演练场景2:全集群灾难恢复(核心演练)
场景:所有 etcd 节点数据损坏/集群不可用 → 从快照恢复
6.0 前提
- 有有效快照
- 所有 Master 节点都能访问同一份快照
- 先停止所有 kube-apiserver(避免写入)
6.1 冻结写入(关键)
在所有 Master 节点执行:
mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/
# 等待 apiserver 停止
6.2 停止所有 etcd、清理数据
所有 Master:
mv /etc/kubernetes/manifests/etcd.yaml /tmp/
rm -rf /var/lib/etcd/*
6.3 分发快照到所有 Master
# 把备份文件拷贝到每台 Master 的 /backup/etcd/
scp /backup/etcd/etcd-snapshot-xxx.db node2:/backup/etcd/
scp /backup/etcd/etcd-snapshot-xxx.db node3:/backup/etcd/
6.4 在所有节点执行快照恢复(同一条命令!)
所有 Master 节点执行完全相同的 restore 命令(仅 --name 不同)
节点1(etcd-node1)
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd/etcd-snapshot-xxx.db \
--name etcd-node1 \
--initial-cluster etcd-node1=https://192.168.1.21:2380,etcd-node2=https://192.168.1.22:2380,etcd-node3=https://192.168.1.23:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-advertise-peer-urls https://192.168.1.21:2380 \
--data-dir=/var/lib/etcd
节点2 只改 --name 和 --initial-advertise-peer-urls,其余完全一样
必须保证:
initial-cluster、cluster-token、快照文件 全部一致
6.5 重启 etcd
所有 Master:
mv /tmp/etcd.yaml /etc/kubernetes/manifests/
6.6 重启 apiserver
所有 Master:
mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/
七、统一验证清单(演练必过)
7.1 etcd 层
etcdctl endpoint health --cluster
etcdctl member list
etcdctl get / --prefix --keys-only | head -10
7.2 Kubernetes 控制平面
kubectl get nodes
kubectl get cs # 1.24+ 废弃,改用 pod 检查
kubectl get pods -n kube-system
7.3 业务读写验证
# 创建测试资源
kubectl create ns test-dr
kubectl run nginx-test --image=nginx -n test-dr
# 检查
kubectl get pods -n test-dr
# 删除测试(清理)
kubectl delete ns test-dr
7.4 最终确认
- 所有节点 Ready
- 所有控制面 Pod Running
- 可创建/删除/查询资源
- 历史 Deployment/Service/ConfigMap 全部存在
八、演练后收尾
- 恢复所有变更(如移动的 manifest)
- 清理测试命名空间
- 重新开启日常自动备份
- 记录:演练时间、执行人、耗时、问题、改进点
- 生产建议:每季度至少一次全流程灾备演练
九、高频坑点(必须避坑)
- 恢复必须用同一份快照,多节点用不同快照 → 数据分裂/脑裂
- 不停止 apiserver 直接恢复 → 写入冲突,集群损坏
- 不校验快照 → 恢复失败却找不到原因
- 节点名称、IP、initial-cluster 写错 → etcd 起不来
- 权限/目录问题:
/var/lib/etcd必须可写、属主正确 - 生产演练不通知、无窗口 → 业务中断
十、极简速记 SOP(运维贴屏用)
- 健康检查 → 快照备份 → 校验 → 异地归档
- 单节点故障:移除成员 → 清数据 → 重新加入
- 全集群故障:停 apiserver → 停 etcd → 清数据 → 全节点同快照恢复 → 启 etcd → 启 apiserver
- 验证:etcd健康 → k8s组件 → 业务读写
浙公网安备 33010602011771号