k8s之etcd的备份与回恢复

 

etcd是 Kubernetes的关键组件,因为它存储了集群的整个状态:其配置,规格以及运行中的工作负载的状态,因此需要对etcd进行定期备份,出现故障时候可快速恢复

一、容器方式安装的etcd

环境:kubeadm安装的k8s集群只有一个master和一个etcd,都是容器运行

1、查看etcd资源文件,数据目录位置如图:

进入目录/var/lib/etcd下可以看到存在两个文件夹:

  • snap:存放快照数据,etcd防止WAL文件过多而设置的快照,存储etcd数据状态
  • wal:存放预写式日志,最大的作用是记录了整个数据变化的全部历程。在etcd中,所有数据的修改在提交前,都要先写入到WAL中

2、下载备份工具或者直接从etcd容器内将工具复制出来,如下:

1、wget https://github.com/etcd-io/etcd/releases/download/v3.5.1/etcd-v3.5.1-linux-amd64.tar.gz
    tar -xzvf etcd-v3.5.1-linux-amd64.tar.gz
    cd etcd-v3.5.1-linux-amd64/
    cp etcdctl /usr/local/bin/
2、 docker cp 容器名:/usr/local/bin/etcdctl   /usr/bin

3、执行命令,备份etcd数据,如下:

ETCDCTL_API=3 etcdctl --endpoints="https://127.0.0.1:2379"  --cert="/etc/kubernetes/pki/etcd/server.crt"  --key="/etc/kubernetes/pki/etcd/server.key"  --cacert="/etc/kubernetes/pki/etcd/ca.crt"   snapshot save backup.db
  • ETCDCTL_API=3,使用 Etcd 的 v3 版本的 API,从 k8s 1.13 开始,k8s不再支持 v2 版本的 etcd
  • endponits可以通过命令查找,一般会有两个IP:kubectl describe pod etcd-k8s-master1 -n kube-system | grep listen-client-urls
  • backup.db #备份完成后的数据

4、恢复etcd数据,恢复之前需要先停止kube-apiserver,etcd,如下:

#将manifests和etcd目录先改个名字,apiserver和etcd自然就停止了
mv /etc/kubernetes/manifests   /etc/kubernetes/manifests.bak
mv /var/lib/etcd  /var/lib/etcd.bak
mkdir /var/lib/etcd   #创建一个空的etcd目录

执行如下命令恢复数据:

ETCDCTL_API=3 etcdctl --endpoints="https://127.0.0.1:2379"  --cert="/etc/kubernetes/pki/etcd/server.crt"  --key="/etc/kubernetes/pki/etcd/server.key"  --cacert="/etc/kubernetes/pki/etcd/ca.crt"   snapshot restore backup.db --data-dir=/var/lib/etcd

恢复完成后,将manifests.bak修改回来即可自动启动apiserver,命令如下:

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

查看pod,如图:

二、二进制安装的etcd

集群安装的etcd,备份的时候,只需要备份一个节点的数据就可以

1、执行命令,备份etcd数据,如下:

#每一行都是双横杠-
ETCDCTL_API=3 etcdctl snapshot save  backup.db \
--cacert=/opt/etcd/ssl/etcd-ca.pem \
--cert=/opt/etcd/ssl/server.pem \
--key=/opt/etcd/ssl/server-key.pem \
--endpoints="https://192.168.15.215:2379

2、将备份后的文件复制到其他etcd节点,如下:

#下面这条命令需要配置hosts,如果不配置用scp命令也可以
for i etcd2,etcd3;do scp backup.db root@i:/root ;done

3、恢复etcd数据

etcd集群备份操作只需要在其中的一个etcd节点上完成,然后将备份文件拷贝到其他节点,但etcd集群恢复操作必须要所有的etcd节点上完成

恢复之前需要先关闭apiserver和etcd,删除etcd数据文件,命令如下:

systemctl stop kube-apiserver  #停止apiserver
systemctl stop etcd            #停止etcd
rm -rf opt/etcd/data/*         #删除数据目录文件,不一定非要这个目录,根据自己实际情况

在节点1执行恢复命令,如下:

ETCDCTL_API=3 etcdctl snapshot restore backup.db \
--name etcd-1 \
--initial-cluster="etcd-1=https://192.168.15.215:2380,etcd-2=https://192.168.15.216:2380,etcd-3=https://192.168.15.217:2380" \
--initial-cluster-token=etcd-cluster \
--initial-advertise-peer-urls=https://192.168.15.215:2380 \
--data-dir=/opt/etcd/data

在节点2执行恢复命令,如下:

ETCDCTL_API=3 etcdctl snapshot restore backup.db \
--name etcd-2 \
--initial-cluster="etcd-1=https://192.168.15.215:2380,etcd-2=https://192.168.15.216:2380,etcd-3=https://192.168.15.217:2380" \
--initial-cluster-token=etcd-cluster \
--initial-advertise-peer-urls=https://192.168.15.216:2380 \
--data-dir=/opt/etcd/data

在节点3执行恢复命令,如下:

ETCDCTL_API=3 etcdctl snapshot restore backup.db \
--name etcd-3 \
--initial-cluster="etcd-1=https://192.168.15.215:2380,etcd-2=https://192.168.15.216:2380,etcd-3=https://192.168.15.217:2380" \
--initial-cluster-token=etcd-cluster \
--initial-advertise-peer-urls=https://192.168.15.217:2380 \
--data-dir=/opt/etcd/data

恢复完成后,重启kube-apiserver和etcd,如下:

systemctl start kube-apiserver
systemctl start etcd

4、查看集群状态:

ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/etcd-ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.15.215:2379,https://192.168.15.216:2379,https://192.168.15.217:2379" endpoint health --write-out=table

总结:

  • 备份ETCD集群时,只需要备份一个ETCD数据,然后同步到其他节点上
  • 恢复ETCD数据时,每个节点都要执行恢复命令

恢复顺序:停止kube-apiserver –> 停止ETCD –> 恢复数据 –> 启动ETCD –> 启动kube-apiserve

posted @ 2023-02-22 16:18  技术颜良  阅读(1804)  评论(0编辑  收藏  举报