关于rancher-ha集群备份恢复试验
虽然有集群高可用所在,但是仍旧可能会有整个集群覆灭的情况,所以这里试验一下集群的备份问题。
现在,在已有集群当中,跑了两个应用如下:
接下来,开始进入备份的配置。因为 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
2
3
4
其中的test.db
是备份后的文件名,可以自定义。
如果看到屏幕输出Finished saving snapshot [test.db] on all etcd hosts
,则说明备份已经正常完成了,如果有报错,则根据报错进行解决。
备份完成后,RKE 会获取每个 etcd 节点的快照,并保存在每个 etcd 节点的
/opt/rke/etcd-snapshots
目录下。
# 2,恢复。
# 1,恢复准备
恢复有两种情况:在原集群中恢复和在新机器中恢复。
- 原集群中恢复:需要清除 Kubernetes 和 Rancher 配置,详情了解点击,恢复出厂设置。 (opens new window)
- 新机器中恢复:需要先准备与原来集群相匹配的环境,以及集群安装的一些基础环境。
这里为了验证数据的迁移可用,因此使用在新机器中恢复的方式来进行恢复的操作。
# 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
2
3
4
然后定义如下脚本并执行。
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
脚本内容完成了服务器的初始化,并安装了 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
2
3
4
5
完成如上步骤,基本上就可以进入正式的恢复操作了。
# 3,准备恢复文件。
恢复所要的除了上边准备的基础环境之外,还需要之前备份的数据以及部署集群的原配置文件。
1,先在三台新机器上都创建备份默认目录。
mkdir -p /opt/rke/etcd-snapshots
12,去原来的部署主机
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/
1
2
3
4因为 etcd 多副本,几个节点备份的都一样,所以可以把原来的 1 个拷贝给新的集群。
3,拷贝部署集群的原配置文件
$ su - rancher $ scp rancher-cluster.yml rancher@192.168.111.4:/home/rancher/
1
2拷贝完成之后,就能进入真正的恢复操作了。
# 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
<
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 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
2
3
4
5
6
7
8
# 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
2
3
4
# 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 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 # 快照有效期,此时间后快照将被删除;
1
2
3
4
5根据实际需求更改相应参数。
3,运行 up 进行加载。
rke up --config rancher-cluster.yml
1
# 4,备份的核心。
核心当然是异地备份啦,刚刚执行的备份,都是将快照文件放在了集群本地的/opt/rke/etcd-snapshots
目录,所以应该把这个目录进行异地备份即可。