etcd 灾备演练

下面给你一套生产级、可直接落地的 etcd 灾备演练手册,适配 Kubernetes(kubeadm 部署的静态 Pod etcd),覆盖备份、单节点故障、全集群灾难恢复、验证全流程,是运维标准演练方案。

一、演练核心目标

  1. 掌握 etcd 一致性快照备份/校验
  2. 掌握 单 etcd 节点故障自愈
  3. 掌握 整个 etcd 集群崩溃后从快照完整恢复
  4. 验证 Kubernetes 控制平面 & 业务可用性
  5. 形成可固化的灾备 SOP

二、前置条件(必须满足)

  1. etcd 版本:v3.4+(使用 v3 API)
  2. 集群:3 节点 etcd(奇数节点,生产标准)
  3. 证书路径(kubeadm 默认):
    • CA:/etc/kubernetes/pki/etcd/ca.crt
    • 服务端证书/密钥:server.crt / server.key
  4. 演练环境:优先测试集群;生产必须选业务低峰窗口期
  5. 工具:etcdctlkubectl、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

看到 HASHVERSIONSIZE 正常即有效。

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-clustercluster-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 全部存在

八、演练后收尾

  1. 恢复所有变更(如移动的 manifest)
  2. 清理测试命名空间
  3. 重新开启日常自动备份
  4. 记录:演练时间、执行人、耗时、问题、改进点
  5. 生产建议:每季度至少一次全流程灾备演练

九、高频坑点(必须避坑)

  1. 恢复必须用同一份快照,多节点用不同快照 → 数据分裂/脑裂
  2. 不停止 apiserver 直接恢复 → 写入冲突,集群损坏
  3. 不校验快照 → 恢复失败却找不到原因
  4. 节点名称、IP、initial-cluster 写错 → etcd 起不来
  5. 权限/目录问题:/var/lib/etcd 必须可写、属主正确
  6. 生产演练不通知、无窗口 → 业务中断

十、极简速记 SOP(运维贴屏用)

  1. 健康检查 → 快照备份 → 校验 → 异地归档
  2. 单节点故障:移除成员 → 清数据 → 重新加入
  3. 全集群故障:停 apiserver → 停 etcd → 清数据 → 全节点同快照恢复 → 启 etcd → 启 apiserver
  4. 验证:etcd健康 → k8s组件 → 业务读写
posted @ 2026-02-09 14:02  wuyingchun1987  阅读(3)  评论(0)    收藏  举报