因為我的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。