11

关于rancher-ha集群备份恢复试验 |坐而言不如起而行! 二丫讲梵

 3 years ago
source link: http://www.eryajf.net/2684.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
本文预计阅读时间 25 分钟

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

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

d05e2699f8c9a529.jpg

接下来,开始进入备份的配置。因为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或将其恢复到以前的快照时,应该对数据手动创建快照,以便数据异常时可供恢复。

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

  1. $ su - rancher
  2. $ rke etcd snapshot-save --name test.db --config rancher-cluster.yml
  3. $ ls /opt/rke/etcd-snapshots
  4. 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上边进行。

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

  1. ssh-keygen
  2. ssh-copy-id [email protected]
  3. ssh-copy-id [email protected]
  4. ssh-copy-id [email protected]

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

  1. NODE_IPS=(192.168.111.4 192.168.111.5 192.168.111.6)
  2. cat > kubernetes.conf <<EOF
  3. net.bridge.bridge-nf-call-iptables=1
  4. net.bridge.bridge-nf-call-ip6tables=1
  5. net.ipv4.ip_forward=1
  6. net.ipv4.tcp_tw_recycle=0
  7. vm.swappiness=0
  8. vm.overcommit_memory=1
  9. vm.panic_on_oom=0
  10. fs.inotify.max_user_watches=89100
  11. fs.file-max=52706963
  12. fs.nr_open=52706963
  13. net.ipv6.conf.all.disable_ipv6=1
  14. net.netfilter.nf_conntrack_max=2310720
  15. EOF
  16. cat > daemon.json << EOF
  17. {
  18. "registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com/","https://kw88y6eh.mirror.aliyuncs.com"],
  19. "insecure-registries":["192.168.112.69"],
  20. "storage-driver": "overlay2",
  21. "storage-opts": [
  22. "overlay2.override_kernel_check=true"
  23. ]
  24. }
  25. EOF
  26. for node_ip in ${NODE_IPS[@]}
  27. do
  28. echo ">>> ${node_ip}"
  29. ssh root@${node_ip} "yum install -y wget ntpdate lrzsz curl yum-utils device-mapper-persistent-data lvm2 bash-completion"
  30. ssh root@${node_ip} "iptables -F && sudo iptables -X && sudo iptables -F -t nat && sudo iptables -X -t nat && iptables -P FORWARD ACCEPT"
  31. ssh root@${node_ip} "swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab"
  32. scp kubernetes.conf root@${node_ip}:/etc/sysctl.d/kubernetes.conf
  33. ssh root@${node_ip} "modprobe br_netfilter && modprobe ip_vs"
  34. ssh root@${node_ip} "sysctl -p /etc/sysctl.d/kubernetes.conf"
  35. ssh root@${node_ip} 'yum -y update openssh'
  36. 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'
  37. ssh root@${node_ip} 'sed -i "s#4096#65535#g" /etc/security/limits.d/20-nproc.conf'
  38. ssh root@${node_ip} 'groupadd docker && useradd rancher -G docker && echo "123456" | passwd --stdin rancher'
  39. 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'
  40. ssh root@${node_ip} 'yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo'
  41. 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*'
  42. 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'
  43. ssh root@${node_ip} 'systemctl enable docker'
  44. ssh root@${node_ip} 'systemctl start docker'
  45. ssh root@${node_ip} 'systemctl status docker'
  46. scp daemon.json root@${node_ip}:/etc/docker/daemon.json
  47. ssh root@${node_ip} 'systemctl daemon-reload'
  48. ssh root@${node_ip} 'systemctl restart docker'
  49. done

脚本内容完成了服务器的初始化,并安装了docker配置了加速器。

然后安装一些集群依赖组件:rke,kubectl,helm等。

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

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

2,配置rancher用户。

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

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

  1. su - rancher
  2. ssh-keygen
  3. ssh-copy-id [email protected]
  4. ssh-copy-id [email protected]
  5. ssh-copy-id [email protected]

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

3,准备恢复文件。

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

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

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

  • 3,拷贝部署集群的原配置文件
  1. $ su - rancher
  2. $ scp rancher-cluster.yml [email protected]:/home/rancher/

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

4,更改RKE配置文件。

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

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

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

文件更改前后对比如下:

  1. $ diff rancher-cluster.yml rancher-cluster-restore.yml
  2. 2c2
  3. < - address: 192.168.106.3
  4. ---
  5. > - address: 192.168.111.4
  6. 5c5
  7. < - address: 192.168.106.4
  8. ---
  9. > - address: 192.168.111.5
  10. 8c8
  11. < - address: 192.168.106.5
  12. ---
  13. > - address: 192.168.111.6
  14. 11d10
  15. <

5,恢复ETCD数据。

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

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

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

6,恢复集群。

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

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

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

7,测试集群。

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

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

8,清理旧节点。

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

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

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

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

10,域名解析问题。

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

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

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

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

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

e19c647a6ae9db2c.jpg

看一眼服务:

a686140f519d5bfd.jpg

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

3,说说自动备份。

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

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

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

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

4,备份的核心。

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


weinxin

二丫讲梵 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明<五>关于rancher-ha集群备份恢复试验

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK