etcd 恢复

3节点master(master1、master2、master3),备份文件路径为脚本默认备份目录,按节点分别复制对应命令执行,严格遵循顺序,零业务中断。

第一步:所有 master 节点统一执行(停止组件+备份旧数据)

# 1. 配置etcdctl环境变量
export ETCDCTL_API=3
export ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt
export ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crt
export ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.key
export ETCDCTL_ENDPOINTS=https://127.0.0.1:2379

# 2. 停止kube-apiserver(必须执行)
crictl ps | grep kube-apiserver | awk '{print $1}' | xargs crictl stop

# 3. 停止etcd
crictl ps | grep etcd | awk '{print $1}' | xargs crictl stop

# 4. 停止kubelet(防止自动拉起组件)
systemctl stop kubelet

# 5. 备份原有etcd数据目录(防止恢复失败)
mv /var/lib/etcd /var/lib/etcd.bak.$(date +%Y%m%d)
mkdir -p /var/lib/etcd

第二步:仅 master1 执行(执行快照恢复,关键步骤)

# 3.5以下执行恢复,3.5以上使用etcdutl
etcdctl snapshot restore /data/etcd/backup/snapshot-20260330-160000.db \
  --data-dir=/var/lib/etcd \
  --name=master1 \
  --initial-cluster-token=etcd-cluster-1 \
  --initial-cluster=master1=https://192.168.80.121:2380,master2=https://192.168.80.122:2380,master3=https://192.168.80.123:2380 \
  --initial-advertise-peer-urls=https://192.168.80.121:2380

第三步:master2、master3 不执行恢复,仅执行权限修复

# 修改etcd数据目录权限(确保kubelet能正常拉起)
chown -R root:root /var/lib/etcd
chmod 700 /var/lib/etcd

第四步:所有 master 节点统一执行(启动组件,完成恢复)

# 启动kubelet,自动拉起etcd和kube-apiserver
systemctl start kubelet

# 等待15-20秒,检查etcd集群健康(验证恢复成功)

etcdctl endpoint health --cluster -w table
etcdctl member list -w table

# 验证k8s集群恢复正常
kubectl get nodes
kubectl get pods -A

恢复注意

  • 若备份文件不在默认路径,将第二步命令中的 /data/etcd/backup/snapshot-20260330-153000.db 替换为实际备份文件路径即可。
  • 恢复期间无需操作worker节点,业务Pod正常运行,无感知。
  • 执行完成后,若所有节点显示 healthy,且kubectl能正常查询,即为恢复成功。

 

posted @ 2026-03-30 17:49  一窗明月半帘风  阅读(14)  评论(0)    收藏  举报