• 对于注定会优秀的人来说,他所需要的,只是时间----博主
  • 手懒得,必受贫穷,手勤的,必得富足----《圣经》
  • 帮助别人,成就自己。愿君在本站能真正有所收获!
  • 如果你在本站中发现任何问题,欢迎留言指正!
  • 宝剑锋从磨砺出,梅花香自苦寒来!
  • 本站开启了防爆破关小黑屋机制,如果您是正常登录但被关进小黑屋,请联系站长解除!

<五>关于rancher-ha集群备份恢复试验

rancher eryajf 4个月前 (03-11) 415°C 已收录 0个评论
本文预计阅读时间 25 分钟

虽然有集群高可用所在,但是仍旧可能会有整个集群覆灭的情况,所以这里试验一下集群的备份问题。

现在,在已有集群当中,跑了两个应用如下:

接下来,开始进入备份的配置。因为rancher整个集群跑在k8s里边,而k8s的所有数据又都存储在etcd里边,所以针对etcd来做备份就可以了。

1,备份。

1,环境说明。

  • Rancher Kubernetes Engine v0.1.7或更高版本
    RKE v0.1.7以及更高版本才支持etcd快照功能
  • rancher-cluster.yml
    需要使用到安装Rancher的RKE配置文件rancher-cluster.yml。

2,备份方案。

rancher有两种备份方式:

  • 方案 A: 定时自动创建快照

在Rancher HA安装时,通过更改配置信息以实现自动创建快照的功能。

  • 方案 B: 手动创建快照

手动创建适用于集群升级或者变更之前的操作。

这里为了验证备份以及恢复的功能可用性,暂时采取手动备份的方式,自动的方式等到最后再介绍。

3,手动备份。

当我们需要升级Rancher或将其恢复到以前的快照时,应该对数据手动创建快照,以便数据异常时可供恢复。

备份前要确保部署的时候使用的集群部署配置文件还在。

$ su - rancher
$ rke etcd snapshot-save --name test.db --config rancher-cluster.yml
$ ls /opt/rke/etcd-snapshots
pki.bundle.tar.gz  test.db

其中的test.db是备份后的文件名,可以自定义。
如果看到屏幕输出Finished saving snapshot [test.db] on all etcd hosts,则说明备份已经正常完成了,如果有报错,则根据报错进行解决。

[success]备份完成后,RKE会获取每个etcd节点的快照,并保存在每个etcd节点的/opt/rke/etcd-snapshots目录下。

2,恢复。

1,恢复准备

恢复有两种情况:在原集群中恢复和在新机器中恢复。

  • 原集群中恢复:需要清除Kubernetes和Rancher配置,详情了解点击,恢复出厂设置。
  • 新机器中恢复:需要先准备与原来集群相匹配的环境,以及集群安装的一些基础环境。

这里为了验证数据的迁移可用,因此使用在新机器中恢复的方式来进行恢复的操作。

2,新机器初始化。

在进行正式的恢复初始化之前,需要先对新机器进行初始化。因为老集群是三台服务器,所以这里也准备三台新机器进行对接。

服务器准备情况,大致如下:

老机器 新机器
192.168.106.3 192.168.111.4
192.168.106.4 192.168.111.5
192.168.106.5 192.168.111.6

1,初始化及安装docker。

以下操作在192.168.111.4上边进行。

在进行初始化之前,先保证本机能够免密码登陆被操作机器。

ssh-keygen
ssh-copy-id root@192.168.111.4
ssh-copy-id root@192.168.111.5
ssh-copy-id root@192.168.111.6

然后定义如下脚本并执行。

NODE_IPS=(192.168.111.4 192.168.111.5 192.168.111.6)

cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

cat > daemon.json << EOF
{
  "registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com/","https://kw88y6eh.mirror.aliyuncs.com"],
  "insecure-registries":["192.168.112.69"],
    "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} "yum install -y wget ntpdate lrzsz curl yum-utils device-mapper-persistent-data lvm2 bash-completion"
    ssh root@${node_ip} "iptables -F && sudo iptables -X && sudo iptables -F -t nat && sudo iptables -X -t nat && iptables -P FORWARD ACCEPT"
    ssh root@${node_ip} "swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab"
    scp kubernetes.conf root@${node_ip}:/etc/sysctl.d/kubernetes.conf
    ssh root@${node_ip} "modprobe br_netfilter && modprobe ip_vs"
    ssh root@${node_ip} "sysctl -p /etc/sysctl.d/kubernetes.conf"
    ssh root@${node_ip} 'yum -y update openssh'
    ssh root@${node_ip} 'echo -e  "root soft nofile 65535\nroot hard nofile 65535\n* soft nofile 65535\n* hard nofile 65535\n"     >> /etc/security/limits.conf'
    ssh root@${node_ip} 'sed -i "s#4096#65535#g" /etc/security/limits.d/20-nproc.conf'
    ssh root@${node_ip} 'groupadd docker && useradd rancher -G docker && echo "123456" | passwd --stdin rancher'
    ssh root@${node_ip} 'yum -y install ntpdate && ntpdate -u cn.pool.ntp.org && echo "* * * * * /usr/sbin/ntpdate -u cn.pool.ntp.org &> /dev/null" > /var/spool/cron/root'
    ssh root@${node_ip} 'yum-config-manager --add-repo http://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 --setopt=obsoletes=0 docker-ce-17.03.2.ce-1.el7.centos docker-ce-selinux-17.03.2.ce-1.el7.centos'
    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等。

wget http://192.168.106.10/pack/rancher.tar

通过如上命令下载并部署,过程略。

2,配置rancher用户。

这个时候还需要一步,那就是配置rancher用户的免密码登陆其他节点,否则后边的恢复等操作将进行不下去。

仍旧是在192.168.111.4这台主机上进行。

su - rancher
ssh-keygen
ssh-copy-id rancher@192.168.111.4
ssh-copy-id rancher@192.168.111.5
ssh-copy-id rancher@192.168.111.6

完成如上步骤,基本上就可以进入正式的恢复操作了。

3,准备恢复文件。

恢复所要的除了上边准备的基础环境之外,还需要之前备份的数据以及部署集群的原配置文件。

  • 1,先在三台新机器上都创建备份默认目录。
mkdir -p /opt/rke/etcd-snapshots
  • 2,去原来的部署主机192.168.106.3将数据拷贝过来。
$ cd /opt/rke/etcd-snapshots
$ scp pki.bundle.tar.gz test.db root@192.168.111.4:/opt/rke/etcd-snapshots/
$ scp pki.bundle.tar.gz test.db root@192.168.111.5:/opt/rke/etcd-snapshots/
$ scp pki.bundle.tar.gz test.db root@192.168.111.6:/opt/rke/etcd-snapshots/

因为etcd多副本,几个节点备份的都一样,所以可以把原来的1个拷贝给新的集群。

  • 3,拷贝部署集群的原配置文件
$ su - rancher
$ scp rancher-cluster.yml rancher@192.168.111.4:/home/rancher/

拷贝完成之后,就能进入真正的恢复操作了。

4,更改RKE配置文件。

现在目光再次聚焦到192.168.111.4这台主机,制作原始rancher-cluster.yml文件的副本。

$ cp rancher-cluster.yml rancher-cluster-restore.yml

对副本配置文件进行修改,基本上其他地方不用更改,只需把原来文件当中的几个主机IP地址更改为现在集群的即可。

文件更改前后对比如下:

$ diff rancher-cluster.yml rancher-cluster-restore.yml
2c2
<   - address: 192.168.106.3
---
>   - address: 192.168.111.4
5c5
<   - address: 192.168.106.4
---
>   - address: 192.168.111.5
8c8
<   - address: 192.168.106.5
---
>   - address: 192.168.111.6
11d10
<

5,恢复ETCD数据。

执行如下命令,从而恢复etcd的数据。

$ rke etcd snapshot-restore --name test.db --config ./rancher-cluster-restore.yml

如果正常完成,则将会在最后输出Finished restoring snapshot [test.db] on all etcd hosts

6,恢复集群。

使用RKE在新ETCD节点上启动集群。

$ rke up --config ./rancher-cluster-restore.yml

如果正常完成,则将会在最后输出Finished building Kubernetes cluster successfully

7,测试集群。

RKE运行完成后会创建kubectl的配置文件kube_config_rancher-cluster-restore.yml,可通过这个配置文件查询K8S集群节点状态:

$ kubectl  --kubeconfig=kube_config_rancher-cluster-restore.yml  get nodes
NAME            STATUS     ROLES                      AGE   VERSION
192.168.106.3   Ready      controlplane,etcd,worker   48m   v1.11.6
192.168.106.4   Ready      controlplane,etcd,worker   48m   v1.11.6
192.168.106.5   Ready      controlplane,etcd,worker   48m   v1.11.6
192.168.111.4   Ready      controlplane,etcd,worker   47m   v1.11.6
192.168.111.5   Ready      controlplane,etcd,worker   47m   v1.11.6
192.168.111.6   Ready      controlplane,etcd,worker   47m   v1.11.6

8,清理旧节点。

通过kubectl从集群中删除旧节点。

$ kubectl --kubeconfig=kube_config_rancher-cluster-restore.yml  delete node 192.168.106.3 192.168.106.4 192.168.106.5
node "192.168.106.3" deleted
node "192.168.106.4" deleted
node "192.168.106.5" deleted

9,耐心等待新集群各功能启动。

$ kubectl --kubeconfig=kube_config_rancher-cluster-restore.yml  get pods --all-namespaces
NAMESPACE       NAME                                        READY   STATUS    RESTARTS   AGE
cattle-system   cattle-cluster-agent-d8b957b79-8hglr        1/1     Running   0          42m
cattle-system   cattle-node-agent-cjm72                     1/1     Running   0          48m
cattle-system   cattle-node-agent-fsfzc                     1/1     Running   0          48m
cattle-system   cattle-node-agent-mdwf6                     1/1     Running   0          48m
cattle-system   rancher-7c5cf9945b-8xgjb                    1/1     Running   0          41m
cattle-system   rancher-7c5cf9945b-bzt8k                    1/1     Running   0          42m
cattle-system   rancher-7c5cf9945b-tpr9m                    1/1     Running   0          42m
default         admin-79dccb46f-945nr                       1/1     Running   0          42m
default         api-68d656fbf9-jzx6r                        1/1     Running   0          41m
ingress-nginx   default-http-backend-797c5bc547-xw85p       1/1     Running   0          42m
ingress-nginx   nginx-ingress-controller-8t2p2              1/1     Running   0          48m
ingress-nginx   nginx-ingress-controller-dhj7h              1/1     Running   0          48m
ingress-nginx   nginx-ingress-controller-wfffk              1/1     Running   0          48m
kube-system     canal-8vt7t                                 3/3     Running   0          48m
kube-system     canal-kqbrw                                 3/3     Running   0          48m
kube-system     canal-ssnsj                                 3/3     Running   0          48m
kube-system     cert-manager-cert-manager-8f55cc84b-5pt58   2/2     Running   0          41m
kube-system     kube-dns-7588d5b5f5-dnthk                   3/3     Running   0          42m
kube-system     kube-dns-autoscaler-5db9bbb766-mh9rs        1/1     Running   0          42m
kube-system     metrics-server-97bc649d5-fpwx2              1/1     Running   0          42m
kube-system     tiller-deploy-8cb5b5f5c-dzj2c               1/1     Running   0          42m

10,域名解析问题。

如果原来集群的nginx还没有问题,那么接下来的操作可以直接在原来的nginx当中进行。

我这里重新部署了一个nginx进行配置,配置过程略。

代理完成之后,分别在新集群当中将域名指向nginx的地址。

echo "192.168.111.3 hi.rancher.cn" >> /etc/hosts

然后更改一些本地Windows的hosts解析,接着去浏览器中访问,发现集群起来了,而且,之前跑在集群当中的服务,也还在。

看一眼服务:

如此以来,整个集群的备份以及恢复试验,也就完成了。

3,说说自动备份。

事实上自动备份的功能已经被rancher官方集成,其配置方式就在一开始的启动文件rancher-cluster.yml中。

  • 1,编辑rancher-cluster.yml配置文件
  • 2,在rancher-cluster.yml配置文件中添加以下代码:
services:
  etcd:
    snapshot: true  # 是否启用快照功能,默认false;
    creation: 6h0s  # 快照创建间隔时间,不加此参数,默认5分钟;
    retention: 24h  # 快照有效期,此时间后快照将被删除;

根据实际需求更改相应参数。

  • 3,运行up进行加载。
rke up --config rancher-cluster.yml

4,备份的核心。

核心当然是异地备份啦,刚刚执行的备份,都是将快照文件放在了集群本地的/opt/rke/etcd-snapshots目录,所以应该把这个目录进行异地备份即可。


weinxin
扫码订阅本站,第一时间获得更新
微信扫描二维码,订阅我们网站的动态,另外不定时发送WordPress小技巧,你可以随时退订,欢迎订阅哦~

二丫讲梵 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明<五>关于rancher-ha集群备份恢复试验
喜欢 (2)
[如果想支持本站,可支付宝赞助]
分享 (0)
eryajf
关于作者:
学无止境,我愿意无止境学。书山有路,我愿意举身投火,淬炼成金!

您必须 登录 才能发表评论!