-
紧急!误执行kubeadm reset后如何从etcd备份恢复K8s集群?完整避坑指南
背景说明
场景:单Master架构的K8s集群,etcd以单节点形式运行在集群内。因误操作执行kubeadm reset -f导致集群瘫痪,需基于已有的etcd备份恢复。
核心难点:
- 需同时恢复etcd数据、重建控制平面、重新加入节点
- 证书/令牌/配置文件的时序依赖关系复杂
🔍 前置检查:etcd备份有效性验证
(此步骤建议在事故前定期执行,关键时刻能救命!)
Bash
#查看备份状态及元数据
ETCDCTL_API=3 etcdctl –write-out=table snapshot status etcdbackup.db✅ 关键指标:Hash值、总Key数量、备份时间戳
🔧 Master节点恢复全流程
- 数据抢救性备份(即使已误删!),防止进一步丢失重要信息
Bash
#打包残留数据(可能含未被覆盖的文件)
timestamp=$(date +%Y%m%d%H%M%S)
tar -zcvf /tmp/k8s_rescue_${timestamp}.tar.gz \
/etc/kubernetes \
/var/lib/kubelet \
/var/lib/etcd 2>/dev/null- 重建Master控制平面
Bash
#使用原参数初始化(务必与历史参数一致!)
kubeadm init \
–pod-network-cidr=<network-cidr> \
–apiserver-advertise-address=<master-ip> \
–control-plane-endpoint=<control-plane-endpoint>⚠️ 避坑点:
- 若忘记历史参数,检查/etc/kubernetes/manifests/kube-apiserver.yaml残留
- 初始化后切勿立即加入节点!
- Etcd数据恢复实操
Bash
Step1 停止kube-apiserver等组件
mv /etc/kubernetes/manifests/ /etc/kubernetes/manifests_stop
Step2 还原etcd备份
ETCDCTL_API=3 etcdctl snapshot restore ./etcdbackup.db –skip-hash-check=true
Step3 替换数据目录
rm -rf /var/lib/etcd/member
mv ./default.etcd/member /var/lib/etcd/member
Step4 重启控制平面
mv /etc/kubernetes/manifests_stop /etc/kubernetes/manifests- 证书/令牌更新关键操作
Bash
#强制更新所有证书
kubeadm certs renew all –force
#重启核心组件Pod
for comp in apiserver controller-manager scheduler; do
kubectl -n kube-system delete pod -l component=kube-${comp}
done
#需要生成一个新的 bootstrap-token
kubeadm init phase bootstrap-token
#生成新加入令牌(原token已失效)
kubeadm token create –ttl 2h –print-join-command🖥️ Node节点重新接入指南
Bash
#所有Node执行
systemctl stop kubelet
kubeadm reset -f
rm -rf /var/lib/kubelet/pki/ /etc/kubernetes/pki/ /etc/kubernetes/kubelet.conf
rm -rf $HOME/.kube/config
#使用新token加入
kubeadm join <master-ip>:6443 –token <token> –discovery-token-ca-cert-hash sha256:<ca-cert-hash>✅ 恢复后验证清单
- 节点状态
Plain Text
kubectl get nodes -o wide- 核心Pod健康状态
Plain Text
kubectl -n kube-system get pod | grep -E ‘coredns|kube-proxy|etcd’- 跨服务通信测试
Plain Text
kubectl run test-nginx –image=nginx
kubectl expose pod test-nginx –port=80
kubectl run test-curl –image=radial/busyboxplus:curl -it –rm — \
curl -v http://test-nginx.default.svc.cluster.local- 检查集群内域名解析
- 检查pod对service的域名解析,如有问题需要重启kube-proxy或coredns服务
- 恢复 Kubernetes Dashboard 或其他工具
- 如果使用了如 Kubernetes Dashboard 、kuboard等工具,需要重新安装或重新配置它们
💡 运维建议
- 定期验证备份有效性
- 使用etcd灾备工具(etcdbrctl)
- 生产环境至少部署3节点etcd集群