Rancher-HA集群备份和恢复实验
之前 安装的Rancher-HA虽然已经是高可用的集群,一个绕不开的话题是:对于它的数据,我们还是要进行定时的备份,并且在灾难情况下还要对数据进行恢复。先来看看之前在集群中创建的应用:因为rancher集群是跑在k8s里的,而k8s的所有数据又都存储在etcd里面,所以针对etcd来做备份就可以了。因为官网中给出的备份和恢复步骤中rke 0.2之前版本和rke 0.2以及以后版本有些许的区别...
之前 安装的Rancher-HA
虽然已经是高可用的集群,一个绕不开的话题是:对于它的数据,我们还是要进行定时的备份,并且在灾难情况下还要对数据进行恢复。
先来看看之前在集群中创建的应用:
因为rancher集群是跑在k8s里的,而k8s的所有数据又都存储在etcd里面,所以针对etcd来做备份就可以了。
因为官网中给出的备份和恢复步骤中rke 0.2之前版本
和rke 0.2以及以后版本
有些许的区别。所以在开始之前,有必要说明下我集群的rke
和rancher
的版本:
软件 | 版本 |
---|---|
rke | v1.0.4 |
rancher | v2.3.5 |
一、备份
1、前提条件
-
Rancher Kubernetes Engine v0.1.7或更高版本
RKE v0.1.7以及更高版本才支持etcd快照功能
-
rancher-cluster.yml
需要使用到安装Rancher的RKE配置文件rancher-cluster.yml
2、备份方案
rancher有两种备份etcd
方案:
-
方案A:定时自动创建快照(这里只做介绍)
定时自动创建快照是RKE附带的服务,默认没有开启。可以在安装rancher-ha时,通过在
rancher-cluster.yml
中添加配置来启用自动创建快照的功能。自动备份的功能已经被rancher官方集成,其配置方式就是在一开始的启动文件
rancher-cluster.yml
中。1)编辑
rancher-cluster.yml
配置文件2)
rancher-cluster.yml
配置文件中添加一下代码:rke版本小于0.2.x或rancher版本小于v2.2.0时使用
services: etcd: snapshot: true # 设置true启用ETCD自动备份,设置false禁用; creation: 6h0s # 快照创建间隔时间,不加此参数,默认5分钟; retention: 24h # 快照有效期,此时间后快照将被删除;
rke版本大于等于0.2.x或rancher版本大于等于v2.2.0时使用
services: etcd: backup_config: enabled: true # 设置true启用ETCD自动备份,设置false禁用; interval_hours: 12 # 快照创建间隔时间,不加此参数,默认5分钟; retention: 6 # etcd备份保留份数;
3)根据实际情况修改以上参数
4)运行up进行加载
rke up --config rancher-cluster.yml
-
方案B:手动创建快照(本次实验采取的方式)
在升级或者恢复其他快照等事件之前创建一次快照。
本次实验采用手动备份的方式进行备份,详细接下来的步骤3。
3、手动备份
上面介绍了自动备份的实现方式,本次试验采用手动备份的方式。
备份前需要确保部署rancher集群时的配置文件的还在(这个在部署的时候有强调过,需要保管好)。
[root@node1 ~]# su - rancher
[rancher@node1 ~]$ rke etcd snapshot-save --name test.db --config rancher-cluster.yml
[rancher@node1 ~]$ ls /opt/rke/etcd-snapshots
test.db.zip
命令中的test.db
是设置的快照名称,可以自定义。
看到最后出现Finished saving/uploading snapshot [test.db] on all etcd hosts
,就说明备份已经成功完成了。
备份完成后,RKE会获取每个etcd
节点快照,并保存在每个etcd节点的/opt/rke/etcd-snapshots
目录下。
二、恢复
1、恢复准备
恢复有两种情况:在原集群中恢复和在新集群中恢复。
- 在原集群中恢复:使用现有的节点,需要清除Kubernetes和Rancher配置,这将破坏这些节点上的数据,请做好备份。
- 在新机器中恢复:需要先准备和原来集群匹配的环境和集群安装的基础环境。
2、新服务器初始化
在进行正式的恢复初始化之前,需要对新机器进行初始化。我之前安装的老集群是三台服务器,所以现在也准备三台新机器进行对接。
服务器情况如下表:
原服务器 | 新服务器 |
---|---|
192.168.0.51 | 192.168.0.61 |
192.168.0.52 | 192.168.0.62 |
192.168.0.53 | 192.168.0.63 |
1)服务器初始化
如果是全新的服务器,那可以在每台服务器上用这个系统初始化脚本进行初始化,做一些必要的配置。然后再进行下面的操作。
以下操作仅在192.168.0.61
上进行。
在进行初始化之前,先保证本机能够免密码登录其他机器。
ssh-keygen
ssh-copy-id root@192.168.0.61
ssh-copy-id root@192.168.0.62
ssh-copy-id root@192.168.0.63
然后定义如下脚本并执行
NODE_IPS=(192.168.0.61 192.168.0.62 192.168.0.63)
cat > rancher.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
vm.max_map_count = 655360
EOF
cat > daemon.json << EOF
{
"oom-score-adjust": -1000,
"registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com/","https://kw88y6eh.mirror.aliyuncs.com"],
"insecure-registries":["192.168.0.153"],
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab"
scp rancher.conf root@${node_ip}:/etc/sysctl.d/rancher.conf
ssh root@${node_ip} "modprobe br_netfilter && modprobe ip_vs"
ssh root@${node_ip} "sysctl -p /etc/sysctl.d/rancher.conf"
ssh root@${node_ip} 'groupadd docker && useradd rancher -G docker && echo "123456" | passwd --stdin rancher'
ssh root@${node_ip} 'yum install -y yum-utils device-mapper-persistent-data lvm2'
ssh root@${node_ip} 'yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo'
ssh root@${node_ip} 'yum remove -y docker docker-client docker-client-latest docker-common docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine container*'
ssh root@${node_ip} 'yum -y install docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7'
ssh root@${node_ip} 'systemctl enable docker'
ssh root@${node_ip} 'systemctl start docker'
ssh root@${node_ip} 'systemctl status docker'
scp daemon.json root@${node_ip}:/etc/docker/daemon.json
ssh root@${node_ip} 'systemctl daemon-reload'
ssh root@${node_ip} 'systemctl restart docker'
done
上面这个脚本完成了服务器的初始化,并安装了docker。
还需要进行rke
,kubectl
,helm
的安装:
安装的过程详见Rancher-v2.3.5的HA部署中第五部分-Rancher集群部署中的第1小步分:安装必备工具。
2)配置rancher用户
还需要配置rancher用户的免密码登录其他节点,在后面的恢复操作中会用到。
仍然是在192.168.0.61
上进行操作。
su - rancher
ssh-keygen
ssh-copy-id rancher@192.168.0.61
ssh-copy-id rancher@192.168.0.62
ssh-copy-id rancher@192.168.0.63
上面的步骤完成之后,就可以进入正式的恢复操作了。
3、准备恢复文件
恢复的环境上面已经准备好了,还需要之前备份的数据和部署原集群的原配置文件。
1)在三台新服务器上创建快照目录
mkdir -p /opt/rke/etcd-snapshots/
2)在原主机192.168.0.51
上将需要的数据拷贝到新服务器中
cd /opt/rke/etcd-snapshots/
scp test.db.zip root@192.168.0.61:/opt/rke/etcd-snapshots/
scp test.db.zip root@192.168.0.62:/opt/rke/etcd-snapshots/
scp test.db.zip root@192.168.0.63:/opt/rke/etcd-snapshots/
3)拷贝原主机192.168.0.51
上的源集群配置文件到新服务器上。
su - rancher
scp rancher-cluster.yml rancher-cluster.rkestate rancher@192.168.0.61:/home/rancher/
拷贝完成之后,恢复所需要的文件就准备好了。
4、修改rke配置文件
现在来到新服务器192.168.0.61
上。
对副本文件进行修改,只需要把原集群主机的IP地址改成现在集群的IP地址,然后注释掉services
部分,因为Rancher部署和设置配置已在etcd数据库中,恢复不再需要。
修改后的rancher-cluster.yml
文件如下:
nodes:
- address: 192.168.0.61
user: rancher
role: [controlplane,worker,etcd]
- address: 192.168.0.62
user: rancher
role: [controlplane,worker,etcd]
- address: 192.168.0.63
user: rancher
role: [controlplane,worker,etcd]
5、恢复ETCD数据
执行下面的命令进行etcd数据的恢复
rke etcd snapshot-restore --name test.db --config rancher-cluster.yml
如果成功,则在最后会输出:Finished restoring snapshot [test.db] on all etcd hosts
.
6、恢复集群
使用RKE在新服务器(192.168.0.61)
上启动集群。
rke up --config ./rancher-cluster.yml
如果成功,则在最后会输出:Finished building Kubernetes cluster successfully
。
7、查看节点状态
RKE运行完成之后会创建kubectl的配置文件kube_config_rancher-cluster.yml
,可以通过这个配置文件查询K8S集群的节点状态:
kubectl --kubeconfig=kube_config_rancher-cluster.yml get nodes
NAME STATUS ROLES AGE VERSION
192.168.0.61 Ready controlplane,etcd,worker 12m v1.17.2
192.168.0.62 Ready controlplane,etcd,worker 12m v1.17.2
192.168.0.63 Ready controlplane,etcd,worker 12m v1.17.2
8、清理旧节点
通过上面的节点信息可以看到,我的节点信息里面没有旧的节点。
如果存在旧节点信息的话,可以通过kubectl --kubeconfig=kube_config_rancher-cluster-restore.yml delete node 18.217.82.189 18.222.22.56 18.191.222.99
命令清理旧节点。
9、检查Kubernetes Pods的状态
耐心等待一段时间,等待pods的启动,然后查看一下Kubernetes Pods
的状态。
kubectl --kubeconfig=kube_config_rancher-cluster.yml get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
cattle-system cattle-cluster-agent-74484cb88c-psv8k 1/1 Running 0 24m
cattle-system cattle-node-agent-9bf6c 1/1 Running 0 25m
cattle-system cattle-node-agent-jw9lr 1/1 Running 0 25m
cattle-system cattle-node-agent-lnldk 1/1 Running 0 24m
cattle-system rancher-58b6b8cfd-hsd98 1/1 Running 1 23m
cattle-system rancher-58b6b8cfd-j9d4n 1/1 Running 0 23m
cattle-system rancher-58b6b8cfd-k2mjh 1/1 Running 0 23m
default nginxhpa-5cdf795596-65lrf 1/1 Running 0 23m
demo demo-555c7f9bd6-nh7xk 1/1 Running 0 23m
demo demo-555c7f9bd6-sndq8 1/1 Running 0 23m
ingress-nginx default-http-backend-67cf578fc4-4xwrf 1/1 Running 0 23m
ingress-nginx nginx-ingress-controller-2xdr9 1/1 Running 0 24m
ingress-nginx nginx-ingress-controller-cc9gc 1/1 Running 0 24m
ingress-nginx nginx-ingress-controller-vz7fb 1/1 Running 0 24m
kube-system canal-6drvz 2/2 Running 0 24m
kube-system canal-f6rj9 2/2 Running 0 24m
kube-system canal-xqdmg 2/2 Running 0 24m
kube-system coredns-7c5566588d-2x7jk 1/1 Running 0 24m
kube-system coredns-7c5566588d-d2hx7 1/1 Running 0 24m
kube-system coredns-autoscaler-65bfc8d47d-n7d9k 1/1 Running 0 24m
kube-system metrics-server-6b55c64f86-x4nvd 1/1 Running 0 24m
10、配置域名解析
可以直接修改之前集群的nginx,将后端服务的原来三台主机的IP地址改为现集群的三台主机的IP地址,然后重启nginx。当然,重新搭建一个nginx也是可以的。
我这里是直接在原来的nginx中修改的。
然后在新集群中的/etc/hosts
中添加域名解析。
echo "192.168.0.41 my.rancher.com" >> /etc/hosts
如果是新部署的nginx,还需要修改下windows的hosts解析,将域名指到新的nginx地址中。
现在可以用浏览器去访问Rancher UI
了。
先看一下集群中主机:
没问题,是新的三台主机。
然后看一下工作负载:
和原先集群中的服务是一致的。这样就完成了一个集群的备份和恢复的实验。
参考文章:
https://docs.rancher.cn/rancher2x/backups-and-restoration/backups/rke.html
https://docs.rancher.cn/rancher2x/backups-and-restoration/restorations/rke-ha.html
http://www.eryajf.net/2684.html
更多推荐
所有评论(0)