专业的编程技术博客社区

网站首页 > 博客文章 正文

使用Sealos 部署的K8S v1.21 集群如何对ETCD集群进行还原

baijin 2024-11-16 17:04:49 博客文章 2 ℃ 0 评论

背景

最近由于项目需求使用Sealos工具部署了5套三节点K8S 集群,但是由于客户使用的是虚拟机环境,并且部署的机房经常出现断电的情况,所以其中有几个集群K8S etcd出现了故障,无法对集群进行管理


具体现象

K8S 使用kubectl 命令查看pod 或者Service 状态的时候无法连接到api server

etcd 一直重启,无法成功启动


环境描述

其中一套环境的K8S 信息如下,三个都是Master节点和控制节点,我们环境是对K8S的etcd 30分钟备份一次

K8节点名称

IP地址

master-01

192.168.10.100

master-02

192.168.10.101

master-03

192.168.10.102


ETCD数据还原

  1. 因为使用sealos安装每台机器上并未安装etcdctl工具,所以需要先安装etcdctl工具,需要根据etcd使用的pod版本选择对应的etcdctl工具,我们使用的是etcd3.4 所以我使用的etdctl也是3.4
  2. 首先停止etcd 静态pod,进入目录 /etc/kubernetes/manifests ,将etcd.yaml进行改名,三个节点都需要操作
mv etcd.yaml etcd.yamlbak
  1. 备份三个节点的etcd目录
cp -rfp /var/lib/etcd /root/etcdbak


  1. 确认etcd pod 和api pod 已经停止,如果没有停止需要stop一下
docker ps | egrep 'etcd|api'
  1. 还原备份数据
//master-01 节点执行,如果不执行后面还原数据无法操作
rm -rf /var/lib/etcd

//master-01 节点执行还原镜像数据
ETCDCTL_API=3 etcdctl snapshot restore /root/etcsnapshot_20240115.db \
--name master-01 \
--initial-cluster "master-01=https://192.168.10.100:2380,master-02=https://192.168.10.101:2380,master-03=https://192.168.10.102:2380" \
--initial-advertise-peer-urls https://192.168.10.100:2380 \
--data-dir /var/lib/etcd/


  
  

//master-02 节点执行,如果不执行后面还原数据无法操作
rm -rf /var/lib/etcd

//master-02 节点执行还原镜像数据
ETCDCTL_API=3 etcdctl snapshot restore /root/etcsnapshot_20240115.db \
--name master-02 \
--initial-cluster "master-01=https://192.168.10.100:2380,master-02=https://192.168.10.101:2380,master-03=https://192.168.10.102:2380" \
--initial-advertise-peer-urls https://192.168.10.101:2380 \
--data-dir /var/lib/etcd/



  
  
//master-03 节点执行,如果不执行后面还原数据无法操作
rm -rf /var/lib/etcd

//master-03 节点执行还原镜像数据
ETCDCTL_API=3 etcdctl snapshot restore /root/etcsnapshot_20240115.db \
--name master-03 \
--initial-cluster "master-01=https://192.168.10.100:2380,master-02=https://192.168.10.101:2380,master-03=https://192.168.10.102:2380" \
--initial-advertise-peer-urls https://192.168.10.102:2380 \
--data-dir /var/lib/etcd/
  


ETCD配置文件还原

cd /etc/kubernetes/manifests 
mv etcd.yamlbak etcd.yaml 

查看ETCD pod状态

  //master-01 确认etcd是否正常运行,需要能正常运行并且不能存在自动重启现象,如果出现需要检查IP和名称是否配置错误
  docker ps | grep etcd 
  
   //master-02 确认etcd是否正常运行,需要能正常运行并且不能存在自动重启现象,如果出现需要检查IP和名称是否配置错误
  docker ps | grep etcd 
  
  //master-03确认etcd是否正常运行,需要能正常运行并且不能存在自动重启现象,如果出现需要检查IP和名称是否配置错误
  docker ps | grep etcd 


查看集群状态

//master-01节点执行查看集群状态,集群所有节点需要为started
ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key --endpoints=https://192.168.10.100:2379,https://192.168.10.101:2379,https://192.168.10.102:2379 member list

//可以看到有主节点
ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key --endpoints=https://192.168.10.100:2379,https://192.168.10.101:2379,https://192.168.10.102:2379 endpoint status

//使用kubectl工具确认集群是否正常,如果集群没有恢复需要继续执行以上步骤
kubectl get node 
kubectl get pod 


遇到的问题

etcd报错集群id不匹配,可能是因为IP地址和name地址错误导致

etcd.yaml 文件需要包含 --initial-cluster-state=existing


etcd流程图



Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表