内置ETCD集群利用snapshot恢复数据

扩展:终端执行etcdctl命令

若当前环境不支持直接在终端执行etcdctl命令,可做如下操作

docker ps -a | grep etcd | grep -v pause

docker cp <xxx>:/usr/local/bin/etcdctl   /usr/local/bin/

etcdctl version    (测试命令)

注意:如果etcd集群做了TLS认证,使用该命令仍需指定证书位置

2.查看当前etcd集群状态

ETCDCTL_API=3 etcdctl  --endpoints=<ETCD集群的IP+端口号>(注意不要写成K8s内部的IP地址)

​--cert=/etc/kubernetes/pki/etcd/server.crt  \

--cacert=/etc/kubernetes/pki/etcd/ca.crt  \ 

--key=/etc/kubernetes/pki/etcd/server.key \

endpoint  health -w table        (确认当前etcd各节点的状态为true)

3. 停止ETCD集群和API相关服务(此步骤可做可不做,如果对ETCD集群数据有严格要求的话可停)

mv /etc/kubernetes/manifests    /etc/kubernetes/manifests.bak

注意,该步骤最好先从ETCD集群的follower节点开始停止,依次到leader节点。

原理:kubelet自动监控该目录下的yaml,如果发现则拉起。将该目录移除后各API服务和ETCD服务会停止。

4.ETCD做快照备份

ETCDCTL_API=3 etcdctl  --endpoints=https://127.0.0.1:2379  (推荐在leader节点执行)

​--cert=/etc/kubernetes/pki/etcd/server.crt  \

--cacert=/etc/kubernetes/pki/etcd/ca.crt  \ 

--key=/etc/kubernetes/pki/etcd/server.key \

snapshot save    /tmp/back.db(自定义目录,意思为备份到该目录下)

5.检查备份文件状态

ETCDCTL_API=3 etcdctl  --endpoints=<ETCD集群的IP+端口号>

​--cert=/etc/kubernetes/pki/etcd/server.crt  \

--cacert=/etc/kubernetes/pki/etcd/ca.crt  \ 

--key=/etc/kubernetes/pki/etcd/server.key \

snapshot  status  <备份文件的路径> -w table(人性化显示)

6.删除集群数据,模拟丢失情况发生

mv  /etc/kubernetes/manifests.bak  /etc/kubernetes/manifests    恢复各节点组件,从master到node依次执行

确认集群状态,随便删除一个资源对象

7.重复第二步,停止ETCD集群和API相关服务(该步骤为必做操作),可参考上方,此处省略

将刚刚备份好的文件传至各节点

scp  <备份文件路径>  <etcd各节点的IP>:<指定拷贝路径>

确认各节点的etcd停止后(netstat -tnlp | grep 2379),各节点执行:

mv  <ETCD集群数据目录>  <ETCD集群数据目录.bak> (用于备份原先的文件)

注意:因为我的etcd集群是部署在K8s内部,通过VolumeMounts的形式做持久化存储,所以此时需要.bak的是宿主机上的(即Volume)路径,而不是容器内部的路径。

从etcd的leader节点到follower节点开始执行:

ETCDCTL_API=3 etcdctl snapshot restore --data-dir <etcd的数据存储目录> <备份存放目录>

​--cert=/etc/kubernetes/pki/etcd/server.crt  \

--cacert=/etc/kubernetes/pki/etcd/ca.crt  \ 

--key=/etc/kubernetes/pki/etcd/server.key \

--endpoints=<https://当前主机IP:2379> \

--name=<你当前主机的etcd名称> \

--initial-cluster-token=<etcd的token>  \

--initial-advertise-peer-urls=<https://当前主机IP:2380>  \

--initial-cluster=<etcd集群>  \

解释:以上需要的参数大多都在ETCD的配置文件中可以找到,若不指定则使用默认配置恢复,可能会导致全体leader状态。

对数据进行回滚

查看数据是否成功回滚

可以看到出现了新的etcd目录,并且存在相关文件

8.重启ETCD集群和API服务,并重启各节点的kubelet服务,查看集群状态

先启动master节点,再启动node节点

再次查看

pod创建完毕,至此ETCD快照恢复成功。

记得再执行一次第一部的操作,以确保恢复的ETCD集群是健康的!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值