扩展:终端执行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集群是健康的!