之前 安装的Rancher-HA虽然已经是高可用的集群,一个绕不开的话题是:对于它的数据,我们还是要进行定时的备份,并且在灾难情况下还要对数据进行恢复。

先来看看之前在集群中创建的应用:
在这里插入图片描述因为rancher集群是跑在k8s里的,而k8s的所有数据又都存储在etcd里面,所以针对etcd来做备份就可以了。

因为官网中给出的备份和恢复步骤中rke 0.2之前版本rke 0.2以及以后版本有些许的区别。所以在开始之前,有必要说明下我集群的rkerancher的版本:

软件版本
rkev1.0.4
rancherv2.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.51192.168.0.61
192.168.0.52192.168.0.62
192.168.0.53192.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。

还需要进行rkekubectlhelm的安装:
安装的过程详见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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐