ETCD集群的备份与还原

概述:

etcd做为一个分布式键值数据库,在Kubernetes集群中是一个非常重要的组件,用于保存Kubernetes的网络配置信息和Kubernetes对象的状态信息,一旦etcd挂了,那么也就意味着整个集群就不可用了,所以在实际情况生产环境中我们会部署多个etcd节点,组成etcd高可用集群,在etcd高可用集群中可挂节点数为(n-1)/2个,比如你有3个节点做etcd-ha那么最多可以挂掉(3-1)/2个节点,虽然有HA集群可以保证一定的高可用,但在实际生产环境中还是建议将etcd数据进行备份,方便在出现问题时进行还原。

环境信息:
OS:ubuntu16.04
docker:17.03-2
Kubernetes:v1.11.6
etcd:v3.2.18
Rancher:v2.1.5

节点信息与角色:
172.31.164.58 control worker etcd
172.31.164.59 control worker etcd
172.31.164.139 control worker etcd

操作:
以Rancher2.0部署的Kubernetes集群为例,其他部署工具部署的也是一样。

etcd备份

备份步骤
1、 如果是使用Rancher部署的Kubernetes集群可以直接使用rancher自动备份

Rancherv2.1.5 在部署集群的高级选项内是可以配置etcd的自动备份的,按照配置的备份策略会进行自动备份,默认的备份策略是每12小时备份一次,备份文件的轮转周期是72小时,避免因备份文件过多占用磁盘空间.也可以根据自己实际需求进行调整。

备份的文件放置在master节点宿主机的/opt/rke/etcd-snapshots目录下以etcd结尾的就是etcd就是备份文件,pki.bundle.tar.gz文件是对应的集群证书的备份。

Rancher部署的Kubernetes集群etcd是以容器化的方式运行要使用etcdctl命令有两种方式
1、etcd容器内执行etcdctl;docker exec -it etcd sh
2、或直接在宿主机上安装一个etcd不用启动,只是使用它的etcdctl命令,那可以通过https://github.com/etcd-io/etcd/releases下载对应的etcd版本。

推荐使用方式二在宿主机上安装etcd使用etcdctl执行,因为在还原时需要将etcd关闭,还是需要准备etcdctl命令
执行以下命令

1
2
export ETCDCTL_API=3
etcdctl --endpoints=https://172.31.164.58:2379 --cert=/etc/kubernetes/ssl/kube-etcd-172-31-164-58.pem --key=/etc/kubernetes/ssl/kube-etcd-172-31-164-58-key.pem --cacert=/etc/kubernetes/ssl/kube-ca.pem snapshot save /var/lib/rancher/etcd/etcd_2019_1_31.db

1、/var/lib/rancher/etcd这个目录是根宿主机的/var/lib/etcd/目录相映射的,所以备份在这个目录在对应的宿主机上也是能看见的。
2、这些证书对应文件可以直接在etcd容器内通过ps aux|more看见

其中–cert-file对应–cert,–key对应–key-file –cacert对应–trusted-ca-file

集群方式备份根上述一样

etcd还原

单节点还原

1、将kube-api-server关闭
2、将etcd关闭
在宿主机上执行
将现有的etcd目录移除

1
mv /var/lib/etcd /var/lib/etcd.bak

执行还原

1
2
3
4
5
6
7
8
9
10
11
export ETCDCTL_API=3
etcdctl snapshot restore etcd_2019_1_31.db \
--endpoints=172.31.164.58:2379 \
--name=etcd-rke-node2 \
--cert=/etc/kubernetes/ssl/kube-etcd-172-31-164-58.pem \
--key=/etc/kubernetes/ssl/kube-etcd-172-31-164-58-key.pem \
--cacert=/etc/kubernetes/ssl/kube-ca.pem \
--initial-advertise-peer-urls=https://172.31.164.58:2380 \
--initial-cluster-token=etcd-cluster-1 \
--initial-cluster=etcd-rke-node2=https://172.31.164.58:2380 \
--data-dir=/var/lib/etcd

3、启动etcd

1
docker start etcd

4、启动kube-apiserver

1
docker start kube-apiserver

5、检查数据是否还原
使用kubectl查看资源对象是否已恢复或直接get all

1
kubectl get all --all-namespace

HA环境下还原(多个etcd节点)

将一个节点上的备份数据可以拷贝到其他全部节点,所有节点可以使用同一份数据进行恢复。

1、查看etcd集群信息

1
2
3
4
5
6
7
export ETCDCTL_API=3
etcdctl --endpoints=https://172.31.164.58:2379 --cert=/etc/kubernetes/ssl/kube-etcd-172-31-164-58.pem --key=/etc/kubernetes/ssl/kube-etcd-172-31-164-58-key.pem --cacert=/etc/kubernetes/ssl/kube-ca.pem member list

2019-01-31 17:34:55.080375 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
abfc00bfbb85856d, started, etcd-rke-node3, https://172.31.164.59:2380, https://172.31.164.59:2379,https://172.31.164.59:4001
cb7997809d89fa30, started, etcd-rke-node2, https://172.31.164.58:2380, https://172.31.164.58:2379,https://172.31.164.58:4001
d3f1ec5a741e4dd1, started, etcd-rke-node4, https://172.31.164.139:2380, https://172.31.164.139:2379,https://172.31.164.139:4001

2、关闭集群的全部api-server和etcd

1
docker stop etcd && docker stop kube-apiserver

3、将集群内宿主机现有的etcd目录移除

1
mv /var/lib/etcd /var/lib/etcd.bak

4、恢复数据
在172.31.164.58上执行

1
2
3
4
5
6
7
8
9
10
11
export ETCDCTL_API=3
etcdctl snapshot restore etcd_2019_1_31.db \
--endpoints=172.31.164.58:2379 \
--name=etcd-rke-node2 \
--cert=/etc/kubernetes/ssl/kube-etcd-172-31-164-58.pem \
--key=/etc/kubernetes/ssl/kube-etcd-172-31-164-58-key.pem \
--cacert=/etc/kubernetes/ssl/kube-ca.pem \
--initial-advertise-peer-urls=https://172.31.164.58:2380 \
--initial-cluster-token=etcd-cluster-1 \
--initial-cluster=etcd-rke-node4=https://172.31.164.139:2380,etcd-rke-node3=https://172.31.164.59:2380,etcd-rke-node2=https://172.31.164.58:2380 \
--data-dir=/var/lib/etcd

在172.31.164.59上执行

1
2
3
4
5
6
7
8
9
10
11
export ETCDCTL_API=3
etcdctl snapshot restore etcd_2019_1_31.db \
--endpoints=172.31.164.59:2379 \
--name=etcd-rke-node3 \
--cert=/etc/kubernetes/ssl/kube-etcd-172-31-164-58.pem \
--key=/etc/kubernetes/ssl/kube-etcd-172-31-164-58-key.pem \
--cacert=/etc/kubernetes/ssl/kube-ca.pem \
--initial-advertise-peer-urls=https://172.31.164.59:2380 \
--initial-cluster-token=etcd-cluster-1 \
--initial-cluster=etcd-rke-node4=https://172.31.164.139:2380,etcd-rke-node3=https://172.31.164.59:2380,etcd-rke-node2=https://172.31.164.58:2380 \
--data-dir=/var/lib/etcd

在172.31.164.139上执行

1
2
3
4
5
6
7
8
9
10
11
export ETCDCTL_API=3
etcdctl snapshot restore etcd_2019_1_31.db \
--endpoints=172.31.164.139:2379 \
--name=etcd-rke-node4 \
--cert=/etc/kubernetes/ssl/kube-etcd-172-31-164-58.pem \
--key=/etc/kubernetes/ssl/kube-etcd-172-31-164-58-key.pem \
--cacert=/etc/kubernetes/ssl/kube-ca.pem \
--initial-advertise-peer-urls=https://172.31.164.139:2380 \
--initial-cluster-token=etcd-cluster-1 \
--initial-cluster=etcd-rke-node4=https://172.31.164.139:2380,etcd-rke-node3=https://172.31.164.59:2380,etcd-rke-node2=https://172.31.164.58:2380 \
--data-dir=/var/lib/etcd

5、检查数据是否恢复

使用kubectl查看资源对象是否已恢复或直接get all

1
kubectl get all --all-namespace

以上操作也可以写成一个自动化备份的脚本,但若使用Rancher部署的集群有自动定时备份更方便。