[译] 两条命令,轻松备份和恢复 Etcd

微信扫一扫,分享到朋友圈

[译] 两条命令,轻松备份和恢复 Etcd

Etcd是一个开源的分布式键值存储,它是Kubernetes集群的重要组成部分。在Kubernetes中etcd可以通过Raft分布式共识算法交换信息,并且可以为分布式系统安全存储关键数据。

在本文中,我们将使用Rancher的RKE集群作为示例来了解我们如何从一个集群中备份etcd并将其恢复到另一个集群中。

本文的主要内容包括以下几点:

  • Rancher RKE的简单介绍

  • 创建两个Kubernetes集群

  • 在第一个集群中备份etcd

  • 在第二个集群中恢复etcd

关于Rancher RKE

RKE是一款由Rancher Labs推出的Kubernetes发行版,它经过CNCF认证,可以在Docker容器中完整运行。在本文中,我们将使用RKE来设置和管理Kubernetes集群,在这方面RKE是一个特别棒的工具。RKE中文文档现已推出,如果使用过程中有任何问题,欢迎查阅:

https://docs.rancher.cn/rke/

使用RKE二进制文件可以将其轻松安装在MacOS、Linux或Windows上安装,具体步骤可以参考以下链接:

https://docs.rancher.cn/docs/rke/installation/_index

安装完成后,我们可以列出所有可以使用的命令和选项。

接下来,我们将demo用于创建集群的命令,以及用于备份和恢复集群底层etcd的命令。

设置Kubernetes集群

首先,我们使用RKE创建两个Kubernetes集群。

创建第一个集群

1、 在云提供程序上启动一个VM

我比较喜欢DigitalOcean、Civo和Scaleway,你也可以选择你喜欢的,现在市场的选择十分丰富。同时,我们需要用ssh密钥设置对这台机器的ssh访问。

2、 安装Docker

由于RKE需要在Docker容器内创建一个Kubernetes集群,因此安装Docker是前提条件。可以通过以下命令轻松完成:

$ curl -sSL https://get.docker.com | sh 

3、 创建RKE集群的配置文件

在一个名为kube1的专用文件夹中,我们运行 RKE config
命令,以便准备给一个包含我们即将创建的集群的配置文件。这个命令要求几个参数来配置集群在单个虚拟机上设置的方式,其中包括:

  • 虚拟机的IP

  • 运行在虚拟机上的组件(控制平面、etcd等)

  • 需要安装的网络插件(Flannel/Calico/Weaver/Canal)

  • 一些网络相关的参数(IP地址的范围等)

$ rke config
[+] Cluster Level SSH Private Key Path [~/.ssh/id_rsa]:
[+] Number of Hosts [1]:
[+] SSH Address of host (1) [none]: 209.97.129.73
[+] SSH Port of host (1) [22]:
[+] SSH Private Key Path of host (209.97.129.73) [none]:
[-] You have entered empty SSH key path, trying fetch from SSH key parameter
[+] SSH Private Key of host (209.97.129.73) [none]:
[-] You have entered empty SSH key, defaulting to cluster level SSH key: ~/.ssh/id_rsa
[+] SSH User of host (209.97.129.73) [ubuntu]: root
[+] Is host (209.97.129.73) a Control Plane host (y/n)? [y]:
[+] Is host (209.97.129.73) a Worker host (y/n)? [n]: y
[+] Is host (209.97.129.73) an etcd host (y/n)? [n]: y
[+] Override Hostname of host (209.97.129.73) [none]:
[+] Internal IP of host (209.97.129.73) [none]:
[+] Docker socket path on host (209.97.129.73) [/var/run/docker.sock]:
[+] Network Plugin Type (flannel, calico, weave, canal) [canal]:
[+] Authentication Strategy [x509]:
[+] Authorization Mode (rbac, none) [rbac]:
[+] Kubernetes Docker image [rancher/hyperkube:v1.17.6-rancher2]:
[+] Cluster domain [cluster.local]:
[+] Service Cluster IP Range [10.43.0.0/16]:
[+] Enable PodSecurityPolicy [n]:
[+] Cluster Network CIDR [10.42.0.0/16]:
[+] Cluster DNS Service IP [10.43.0.10]:
[+] Add addon manifest URLs or YAML files [no]:

请注意:在本例中,我们仅设置单节点集群,不过使用RKE可以轻松创建HA集群。

4、 创建Kubernetes集群

现在可以使用RKE二进制文件来安装Kubernetes,RKE将会读取上一步生成的cluster.yml文件。

$ rke up
INFO[0000] Running RKE version: v1.1.2
INFO[0000] Initiating Kubernetes cluster
...
INFO[0135] Finished building Kubernetes cluster successfully

启动和运行单节点Kubernetes集群大约需要花费1分钟的时间,RKE会创建2个文件:

  • kube_config_cluster.yml
    :一个kubeconfig文件,我们将通过kubectl与集群的API server通信。

  • cluster.rkestate
    :该文件包括了所有集群的配置选项

我们现在可以使用kubeconfig文件并验证集群是否启动并运行:

~/kube1 $ export KUBECONFIG=$PWD/kube_config_cluster.yml
~/kube1 $ kubectl get nodes
kubectl get nodes
NAME STATUS ROLES AGE VERSION
209.97.129.73 Ready controlplane,etcd,worker 4m26s v1.17.6

集群仅包括一个节点,显然不是生产级的集群,但对于本文的目的来说,单节点集群已经足够。

5、 部署workload

现在,在我们新创建的集群上启动一些Pod。这里我们会使用一些命令式(imperative)命令,这些命令十分方便,避免了使用yaml规范。

# Create a MongoDB Deployment and expose it with a ClusterIP service
$ kubectl create deploy db --image=mongo:4.2
$ kubectl expose deploy/db --port 27017 --target-port=27017
# Create 10 replicas of a simple nginx Pod
$ kubectl create deploy/www --image=nginx:1.16-alpine
$ kubectl scale deploy/www --replicas=10

然后,我们确保一切都正常运行:

$ kubectl get deploy,svc
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/db 1/1 1 1 89s
deployment.apps/www 10/10 10 10 13s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/db ClusterIP 10.43.248.161 <none> 27017/TCP 83s
service/kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 7m42s

第一个集群运行良好。同时,我们能够在里面运行一些workload。

创建第二个集群

我们将遵循和创建第一个集群相同的步骤来创建一个新的集群:

  • 在云提供程序上运行一个VM

  • 在VM上安装Docker

  • 运行 RKE config
    来创建一个集群配置文件(确保使用新的文件夹以覆盖用于第一个集群的文件夹)

  • 运行 RKE up
    来设置集群

流程结束之后,我们获得一个新的kubeconfig文件。然后我们可以验证第二个集群是否启动并运行,并且目前还没有工作负载在上面运行。

~/kube2 $ export KUBECONFIG=$PWD/kube_config_cluster.yml
~/kube2 $ kubectl get pod
No resources found in default namespace.

现在,我们拥有了两个集群,让我们分别称其为kube1和kube2:

  • 每个集群包含一个节点,同时承担控制平面、etcd以及worker节点的角色

  • 在kube1集群中我们部署了一些虚拟的工作负载,而在kube2中没有

在下一步中,我们将在第一个集群中备份etcd。

备份Etcd

RKE让备份etcd变得简单。 rke etcd snapshot-save
命令可以帮助我们完成整个过程,并在集群的每个etcd节点上创建一个备份(这是一个zip文件)。

我们从包含第一个集群的kubeconfig文件的文件夹中运行这个命令。

$ rke etcd snapshot-save --name snapshot
INFO[0000] Running RKE version: v1.1.2
INFO[0000] Starting saving snapshot on etcd hosts
INFO[0000] [dialer] Setup tunnel for host [209.97.129.73]
INFO[0001] [etcd] Running snapshot save once on host [209.97.129.73]
INFO[0001] Image [rancher/rke-tools:v0.1.56] exists on host [209.97.129.73]
INFO[0001] Starting container [etcd-snapshot-once] on host [209.97.129.73], try #1
INFO[0002] [etcd] Successfully started [etcd-snapshot-once] container on host [209.97.129.73]
INFO[0002] Waiting for [etcd-snapshot-once] container to exit on host [209.97.129.73]
INFO[0002] Container [etcd-snapshot-once] is still running on host [209.97.129.73]
INFO[0003] Waiting for [etcd-snapshot-once] container to exit on host [209.97.129.73]
INFO[0003] Removing container [etcd-snapshot-once] on host [209.97.129.73], try #1
INFO[0003] Finished saving/uploading snapshot [snapshot] on all etcd hosts

请注意:在本例中我们为snapshot起了一个简单的名字,但是在生产环境中,需要选择一个更有意义的名字。

我们确保snapshot存在于我们集群的节点上(RKE将其存储在/opt/rke/etcd-snapshots中):

$ ssh root@kube1 -- ls /opt/rke/etcd-snapshots
snapshot.zip

然后,我们在本地机器上复制备份(备份不应该保存在节点上):

$ scp root@kube1:/opt/rke/etcd-snapshots/snapshot.zip .

现在,我们拥有了第一个集群的备份。接下来,我们将了解如何在另一个集群中恢复这一备份。

恢复Etcd

首先,我们将备份文件复制到第二个集群的节点上(在/opt/rke/etcd-snapshots/文件夹中):

$ scp ./snapshot.zip root@kube2:/opt/rke/etcd-snapshots/

然后,我们使用 RKE etcd snapshot-restore
命令来恢复snapshot.zip。从snapshot中恢复新的集群大约需要1分钟的时间(由于我们只创建了几个资源,所以这里恢复的不多)。

$ rke etcd snapshot-restore --name snapshot
INFO[0000] Running RKE version: v1.1.2
INFO[0000] Restoring etcd snapshot snapshot
...
INFO[0095] Finished building Kubernetes cluster successfully
INFO[0095] Restarting network, ingress, and metrics pods
INFO[0097] Finished restoring snapshot [snapshot] on all etcd hosts

现在我们可以检查在第二个集群上正在运行着什么了:

$ kubectl get deploy,po,svc
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/db 1/1 1 1 4h1m
deployment.apps/www 10/10 10 10 3h59m
NAME READY STATUS RESTARTS AGE
pod/db-d76859d75-gstkf 1/1 Running 0 2m34s
pod/www-5fd6c8cc68-2zm5d 1/1 Running 0 2m34s
pod/www-5fd6c8cc68-4f8hh 1/1 Running 0 2m34s
pod/www-5fd6c8cc68-brjpn 1/1 Running 0 2m34s
pod/www-5fd6c8cc68-c2wvw 1/1 Running 0 2m34s
pod/www-5fd6c8cc68-j89tc 1/1 Running 0 2m34s
pod/www-5fd6c8cc68-jxq6r 1/1 Running 0 2m33s
pod/www-5fd6c8cc68-m8kk5 1/1 Running 0 2m34s
pod/www-5fd6c8cc68-n4dbd 1/1 Running 0 2m34s
pod/www-5fd6c8cc68-r5f55 1/1 Running 0 2m34s
pod/www-5fd6c8cc68-tx49m 1/1 Running 0 2m34s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/db ClusterIP 10.43.248.161 <none> 27017/TCP 4h1m
service/kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 4h7m

所有在第一个集群上运行的工作负载现在都已经在第二个集群上正常运行了。 rke etcd snapshot-save
rke etcd snapshot-restore
,我们只需要这两个命令就可以完成备份和恢复,So easy!

总  结

Etcd可以说是Kubernetes集群的大脑,因为它包含了关于集群中现有资源的所有信息。为了备份Kubernetes,我们需要对etcd进行快照,并将生成的文件移动到一个安全的地方(万一以后需要恢复)。当然,这个过程应该定期进行,这个时间表取决于集群的使用情况。

此外,我们还需要格外小心,因为在 etcd 级别完成的备份并没有考虑到所有在应用程序级别管理的数据。备份/恢复过程也应该在应用层进行。Longhorn(由Rancher推出的一款分布式块存储)是一个很好的选择。

作者:

Luc Juggery,Docker和Kubernetes的培训师

原文链接:

https://medium.com/better-programming/kubernetes-tips-backup-and-restore-etcd-97fe12e56c57

推荐阅读

十分钟,创建一个Helm chart

无需kubectl!快速使用Prometheus监控Etcd

使用Longhorn优雅地恢复运行中的容器应用

About Rancher Labs

Rancher Labs由CloudStack之父梁胜创建。旗舰产品Rancher是一个开源的企业级Kubernetes管理平台,实现了Kubernetes集群在混合云+本地数据中心的集中部署与管理。Rancher一向因操作体验的直观、极简备受用户青睐,被Forrester评为“2020年多云容器开发平台领导厂商”以及“2018年全球容器管理平台领导厂商”,被Gartner评为“2017年全球最酷的云基础设施供应商”。

目前Rancher在全球拥有超过三亿的核心镜像下载量,并拥有包括中国联通、中国平安、中国人寿、上汽集团、三星、施耐德电气、西门子、育碧游戏、LINE、WWK保险集团、澳电讯公司、德国铁路、厦门航空、新东方等全球著名企业在内的共40000家企业客户。

微信扫一扫,分享到朋友圈

[译] 两条命令,轻松备份和恢复 Etcd

美CDC警告民众:不要食用Kikurage蘑菇,可能会感染沙门氏菌

上一篇

日本治愈系女演员竹内结子离世,终年40岁

下一篇

你也可能喜欢

[译] 两条命令,轻松备份和恢复 Etcd

长按储存图像,分享给朋友