etcd 数据库的备份和恢复
在K8s中,很多etcd服务都是以容器的方式运行,比如使用 ranche r和 kubeadm 部署管理的容器等。
由于kubeadm部署的etcd没有etcdctl命令,需要下载etcd二进制包。通过在宿主机上使用etcdctl操作容器中的etcd。
1、etcdctl安装
# wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz # tar zxvf etcd-v3.4.13-linux-amd64.tar.gz # cp -rp etcd-v3.4.13-linux-amd64/etcdctl /usr/bin
2、k8s中,etcd集群以pod方式运行
查看etcd pod运行状态 # kubectl -n kube-system get pod |grep etcd etcd-10.0.8.105 1/1 Running 0 42d etcd-10.0.8.116 1/1 Running 0 42d etcd-10.0.8.117 1/1 Running 0 42d 查看ETCD的详细信息,包括证书、文件存储位置等信息. # kubectl -n kube-system describe pod etcd-10.0.8.105 查看ETCD的运行: # ps -ef | grep etcd
3、基础命令检查
# ECTD_API=3 etcdctl \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ --endpoints=https://10.0.8.105:2379 endpoint health 执行结果如下: https://10.0.8.105:2379 is healthy: successfully committed proposal: took = 19.038298ms
# 查看所有的key
# ECTD_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ --endpoints=https://10.0.8.105:2379 \ get / --prefix --keys-only
# 查看某一个key
#ECTD_API=3 ECTD_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ --endpoints=https://10.0.8.105:2379 \ get /registry/namespaces/default
4、备份,备份命令如下:
创建备份目录 # mkdir -p /opt/etcd_backup/ 备份etcd数据 ETCDCTL_API=3 etcdctl \ snapshot save /opt/etcd_backup/snap-etcd-$(date +%F-%H-%M-%S).db \ --endpoints=https://10.0.8.105:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key 注: 会生成一个路径为"/opt/etcd_backup/snap-etcd-2021-11-12-15-09-38.db" 的etcd备份文件。
5、ETCD恢复测试:
(1)为了方便测试,先删除pod,或者创建某个namespace.
# kubectl delete pod rabbitmq-d78d7ff5f-zn9jt
(2) 恢复etcd备份
1) 停掉kube-apiserver和etcd容器 # mv /etc/kubernetes/manifests/ /etc/kubernetes/manifests-backup/ 2) 对现在的etcd数据进行备份 # mv /var/lib/etcd/ /var/lib/etcd-$(date +%F-%H-%M-%S)-backup/ 3) 恢复之前备份的etcd数据 # ETCDCTL_API=3 etcdctl \ snapshot restore /opt/etcd_backup/snap-etcd-2021-11-12-13-34-15.db \ --data-dir=/var/lib/etcd/
注: /var/lib/etcd/目录不存在时,还原时会自动创建
4) 启动kube-apiserver和etcd容器 # mv /etc/kubernetes/manifests-backup/ /etc/kubernetes/manifests/ 注: 容器启动需要一定时间,请耐心等待还原完成 5) 然后重启所有节的kube-proxy容器和kubelet服务,否则pod无法正常进行访问 # kubectl delete pod/<kube-proxy容器名> -n kube-system # system restart kubelet.service 6) 再次查看,发现之前删除的pod恢复回来了 # kubectl get pod -o wide
参考文档:https://www.cnblogs.com/LiuChang-blog/p/15352764.html
https://zhuanlan.zhihu.com/p/281742226