因为我的k8s集群是用kubeadm装的单master集群,所以etcd只存在master节点,
备份之前需要先下载etcdctl工具
https://github.com/etcd-io/etcd/releases
[root@master ~]# wget https://github.com/etcd-io/etcd/releases/download/v3.5.1/etcd-v3.5.1-linux-amd64.tar.gz
[root@master ~]# tar -xzvf etcd-v3.5.1-linux-amd64.tar.gz
[root@master ~]# cd etcd-v3.5.1-linux-amd64/
[root@master ~/etcd-v3.5.1-linux-amd64]# cp etcdctl /usr/local/bin/
使用etcdctl
v3的版本时,需设置环境变量ETCDCTL_API=3
。
export ETCDCTL_API=3 # 或者在`/etc/profile`文件中添加环境变量 vi /etc/profile ... export ETCDCTL_API=3 ... source /etc/profile # 或者在命令执行前加 ETCDCTL_API=3 ETCDCTL_API=3 etcdctl --endpoints=$ENDPOINTS member list
查看当前etcdctl的版本信息etcdctl version
。
[root@master ~/etcd-v3.5.1-linux-amd64]# etcdctl version
etcdctl version: 3.5.1
API version: 3.5
好啦,工具下载完了,开始备份吧!!!
说明:执行etcd备份数据的恢复的机器必须和原先etcd所在机器一致
1、etcd备份(备份文件到/data 目录)
[root@master ]# ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key snapshot save /data/20211203.db
2、etcd恢复
注意
数据恢复操作,会停止全部应用状态和访问!!!
首先需要分别停掉三台Master机器的kube-apiserver,确保kube-apiserver已经停止了。
[root@master ~]# mv /etc/kubernetes/manifests /etc/kubernetes/manifests.bak
[root@master ~]# docker ps |grep k8s_ #查看etcd,api是否up,等待全部停止
[root@master ~]# mv /var/lib/etcd /var/lib/etcd.bak
etcd恢复用之前备份好的snapshot文件 (这里一定要指定data-dir,不然恢复不了)
[root@master ~]# ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key --data-dir=/var/lib/etcd snapshot restore /data/20211203.db
数据恢复之后,需要启动apiserver跟etcd
[root@master ~]# mv /etc/kubernetes/manifests.bak /etc/kubernetes/manifests
[root@master ~]# kubectl get pod -A
然后发现服务正常运行
不管是二进制还是kubeadm安装的Kubernetes,其备份主要是通过etcd的备份完成的。而恢复时,主要考虑的是整个顺序:停止kube-apiserver,停止etcd,恢复数据,启动etcd,启动kube-apiserver。