使用Heptio Ark备份和还原Kubernetes资源

发生故障后,您可能不得不重建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)中删除备份。

Source: https://habr.com/ru/post/zh-CN423559/


All Articles