发生故障后,您可能不得不重建Kubernetes集群。 您有不需要数天耕种的智能备份策略吗? 是的,您可以备份到etcd集群,但是如果集群中只有一部分掉线或者您使用诸如AWS EBS之类的持久卷怎么办?
在这种情况下,最简单的方法是使用Heptio Ark实用程序。
使用Heptio,您可以备份整个群集,单个名称空间或资源类型,并按计划进行备份。 对我来说,Heptio Ark的主要优点是它与各种云服务提供商(例如AWS,Azure,Google Cloud等)的集成。因此,在备份时,它将为使用的永久卷拍摄快照。
让我们看看如何安装此实用程序,以及如何进行简单的计划备份以及如何还原它们。
将会有单独的帖子介绍永久卷的备份。
安装方式
您可以在此处找到安装说明: 示例/ README.md。 此过程将创建一些自定义资源定义,允许Heptio备份和部署的RBAC(基于角色的访问控制)规则。 默认情况下,它们位于heptio-ark命名空间中。
重要! 成功安装后,您需要配置heptio-ark来告知服务器要使用哪个云服务提供商以及将备份存储在何处。 这是此配置的样子:
apiVersion: ark.heptio.com/v1 kind: Config metadata: namespace: heptio-ark name: default backupStorageProvider: name: aws bucket: heptio-backup-bucket config: region: eu-central-1 backupSyncPeriod: 30m gcSyncPeriod: 30m scheduleSyncPeriod: 1m restoreOnlyMode: false
您可以使用以下命令应用它
kubectl apply -f heptio.yaml
现在,Heptio知道要备份哪个存储桶。 必须可以从heptio服务器炉膛访问备份存储位置,因此您可以将实例配置文件使用对此存储区或Kube2IAM的访问权限,以用于基于动态炉灶的实例配置文件。
最后,对于备份,计划和恢复,您需要从GitHub下载Heptio Ark CLI。
几乎所有命令都可以通过YAML或JSON作为自定义资源定义执行。
后备
在这个小示例中,我创建了一个简单的部署NGINX,然后在Webserver命名空间中创建了一个服务:
$ kubectl get all NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deploy/nginx 1 1 1 1 28s NAME DESIRED CURRENT READY AGE rs/nginx-66f5756f9b 1 1 1 28s NAME READY STATUS RESTARTS AGE po/nginx-66f5756f9b-c88ck 1/1 Running 0 28s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/nginx ClusterIP 10.32.0.183 <none> 80/TCP 28s
让我们从Heptio Ark CLI进行备份:
$ ark backup create nginx-simple --include-namespaces webserver
此命令仅备份Web服务器名称空间。 如果没有此参数,Heptio Ark将创建Kubernetes集群中所有资源的完整备份。 备份将需要一些时间。 副本将保存到S3中的指定存储桶( heptio-backup-bucket )中。 要查看所有备份的状态和列表,请在CLI中输入以下命令:
$ ark backup get NAME STATUS CREATED EXPIRES SELECTOR nginx-simple Completed 2018-07-08 17:35:09 +0200 CEST 29d <none>
如您所见,备份已完成。
备份恢复
让我们删除网络服务器名称空间(内联):
$ kubectl delete ns heptio-test
现在,在“随机”删除之后,再从Heptio Ark CLI恢复名称空间:
$ ark restore create --from-backup nginx-simple Restore request "nginx-simple-20180708173924" submitted successfully. Run `ark restore describe nginx-simple-20180708173924` for more details.
您应该看到名称空间和所有资源(部署,副本集,子和服务)都已还原:
$ kubectl get all NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deploy/nginx 1 1 1 1 20s NAME DESIRED CURRENT READY AGE rs/nginx-66f5756f9b 1 1 1 20s NAME READY STATUS RESTARTS AGE po/nginx-66f5756f9b-9mjvg 1/1 Running 0 20s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/nginx ClusterIP 10.32.0.77 <none> 80/TCP 20s
备份结构
要查看备份结构,只需将其从存储桶中加载到S3或输入Heptio Ark命令:
$ ark backup download nginx-simple Backup nginx-simple has been successfully downloaded to $PWD/nginx-simple-data.tar.gz

在名称空间的webserver.json文件中,我们看到了常规的名称空间资源。
{ "apiVersion":"v1", "kind":"Namespace", "metadata": { "annotations": { "kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"webserver\",\"namespace\":\"\"}}\n" }, "creationTimestamp":"2018-07-08T15:26:44Z", "name":"webserver", "resourceVersion":"3364", "selfLink":"/api/v1/namespaces/webserver", "uid":"52698ae7-82c3-11e8-8529-0645eb60c3f4" }, "spec": { "finalizers":["kubernetes"] }, "status": { "phase":"Active" } }
如果不需要完全恢复,则可以使用Heptio Ark命令仅还原一部分,或者直接转到备份并通过kubectl还原该部分。
$ ark schedule create nginx-schedule --schedule="* 10 * * *" --include-namespaces webserver Schedule "nginx-schedule" created successfully.
预定备份
Heptio Ark可以执行计划的任务。 我们指出哪些资源和名称空间应包含在备份中或从备份中排除,以及何时备份:
$ ark schedule create nginx-schedule --schedule="* 10 * * *" --include-namespaces webserver Schedule "nginx-schedule" created successfully.
在这种情况下,每天10点都会创建一个备份,其中仅包含网络服务器名称空间。 在Heptio Ark CLI中,我们看到一个时间表已出现,并且Heptio Ark已经创建了第一个备份:
$ ark schedule get NAME STATUS CREATED SCHEDULE BACKUP TTL LAST BACKUP SELECTOR nginx-schedule Enabled 2018-07-08 17:49:00 +0200 CEST * 10 * * * 720h0m0s 25s ago <none> $ ~/Downloads/ark backup get NAME STATUS CREATED EXPIRES SELECTOR nginx-schedule-20180708154900 Completed 2018-07-08 17:49:00 +0200 CEST 29d <none> nginx-simple Completed 2018-07-08 17:35:09 +0200 CEST 29d <none>
此处表明计划备份在720小时(即30天后)之后被删除。 创建备份或计划时,可以指定副本的生存期-TTL。 在此期间之后,将从存储库(在我们的示例中为AWS)中删除备份。