备份kubernetes 备份etcd数据
1.练习目标
先在环境里准备一个pod1,然后备份etcd数据,然后删除pod1。备份数据里有pod1的,所以通过恢复etcd数据之后,仍然能看到pod1。
2.练习环境
本实验共2台机器,分别是vms71和vms72。
[root@vms71 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vms71.rhce.cc Ready control-plane,master 2d6h v1.23.2
vms72.rhce.cc Ready <none> 2d6h v1.23.2
[root@vms71 ~]#
3.在vms71上安装etcd软件包
[root@vms71 ~]# yum install etcd -y
...输出...
完毕!
[root@vms71 ~]#
4.实验前的准备
现在当前环境里有一个名字叫做的pod1的pod正在运行。
[root@vms71 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod1 1/1 Running 0 42h
[root@vms71 ~]#
为了减少备份和恢复时命令的长度,这里先定义一些变量。
[root@vms71 ~]# export ETCDCTL_API=3
[root@vms71 ~]# cert=/etc/kubernetes/pki/etcd/server.crt
[root@vms71 ~]# key=/etc/kubernetes/pki/etcd/server.key
[root@vms71 ~]# cacert=/etc/kubernetes/pki/etcd/ca.crt
[root@vms71 ~]#
5.备份数据
按照如下命令备份数据。
[root@vms71 ~]# etcdctl --endpoints=https://192.168.26.71:2379 --cacert=$cacert --cert=$cert --key=$key snapshot save snap1.data
*Snapshot saved at snap1.data*
[root@vms71 ~]#
此时在备份数据里是包括pod1这个pod的。
备份之后删除pod1。
[root@vms71 ~]# kubectl delete pod pod1
pod "pod1" deleted
[root@vms71 ~]# kubectl get pods
No resources found in default namespace.
[root@vms71 ~]#
当前命名空间里不存在pod了,但是备份数据里有。
6.恢复数据
1.关闭kubernetes的核心组件包括etcd。
因为它们是以静态pod的方式运行的,且静态目录是 /etc/kubernetes/manifests/,所以只要把此目录剪切到其他位置即可,这里剪切到/下。
[root@vms71 ~]# mv /etc/kubernetes/manifests/ /
[root@vms71 ~]#
2.删除原有数据。
[root@vms71 ~]# rm -rf /var/lib/etcd/
[root@vms71 ~]#
3.恢复数据。
[root@vms71 ~]# etcdctl --endpoints=https://192.168.26.71:2379 --cacert=$cacert --cert=$cert --key=$key snapshot restore snap1.data --data-dir=/var/lib/etcd/ --name=vms71.rhce.cc --initial-cluster=vms71.rhce.cc=https://192.168.26.71:2380 --initial-advertise-peer-urls https://192.168.26.71:2380
*2022-02-28 16:58:25.518748 I | mvcc: restore compact to 67960
2022-02-28 16:58:25.526988 I | etcdserver/membership: added member ec884fe58e76ba1a [https://192.168.26.71:2380] to cluster 6ba0775b22f7fb90*
[root@vms71 ~]#
这样数据就恢复完成了,这条命令的大部分参数可以到原/etc/kubernetes/manifests/etcd.yaml现在的/manifests/etcd.yaml里找到。
修改所有者和所属组
[root@vms71 ~]# chown -R etcd.etcd /var/lib/etcd/
[root@vms71 ~]#
4.重启kubelet。
[root@vms71 ~]# systemctl restart kubelet
[root@vms71 ~]#
5.验证pod是否被恢复了。
[root@vms71 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod1 0/1 ContainerCreating 1 42h
[root@vms71 ~]#
[root@vms71 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod1 1/1 Running 0 42h
[root@vms71 ~]#