k8s之etcd的备份与回恢复
etcd是 Kubernetes的关键组件,因为它存储了集群的整个状态:其配置,规格以及运行中的工作负载的状态,因此需要对etcd进行定期备份,出现故障时候可快速恢复
一、容器方式安装的etcd
环境:kubeadm安装的k8s集群只有一个master和一个etcd,都是容器运行
1、查看etcd资源文件,数据目录位置如图:
![](https://www.ywdevops.cn/wp-content/uploads/2023/02/1-3.png)
进入目录/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 #备份完成后的数据
![](https://www.ywdevops.cn/wp-content/uploads/2023/02/2-3.png)
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,如图:
![](https://www.ywdevops.cn/wp-content/uploads/2023/02/3-3.png)
二、二进制安装的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