如何使用Heptio Ark在DigitalOcean上备份和恢复Kubernetes集群

Heptio Ark是Kubernetes集群的便捷备份工具,可将Kubernetes对象压缩并备份到对象存储。它还使用云提供商的块存储快照拍摄群集的持久卷的快照...

介绍

Heptio Ark是Kubernetes集群的便捷备份工具,可将Kubernetes对象压缩并备份到对象存储。 它还使用云提供程序的块存储快照功能拍摄群集的持久卷的快照,然后可以将群集的对象和持久卷恢复到以前的状态。

StackPointCloud的DigitalOcean Ark插件允许您使用DigitalOcean块存储来快照您的Persistent Volumes和Spaces来备份您的Kubernetes对象。 在DigitalOcean上运行Kubernetes群集时,这可以让您快速备份群集的状态,并在灾难发生时恢复它。

在本教程中,我们将在本地计算机上设置和配置Ark客户端,并将Ark服务器部署到我们的Kubernetes集群中。 然后,我们将部署一个使用持久卷进行日志记录的示例Nginx应用程序,并模拟灾难恢复方案。

先决条件

在开始本教程之前,您应该可以使用以下内容:

在您的本地计算机上:

在您的DigitalOcean帐户中:

完成所有这些设置后,您就可以开始使用本指南了。

第1步 - 安装方舟客户端

Heptio Ark备份工具包括安装在本地计算机上的客户端和在Kubernetes集群中运行的服务器。 首先,我们将安装本地Ark客户端。

在Web浏览器中,导航到Ark GitHub repo 版本页面 ,找到与您的操作系统和系统体系结构相对应的最新版本,然后复制链接地址。 出于本指南的目的,我们将在x86-64(或AMD64)处理器上使用Ubuntu 18.04服务器作为本地计算机。

然后,从本地计算机上的命令行导航到临时/tmp目录并将其cd入其中:

cd /tmp

使用wget和您之前复制的链接下载发行版tarball:

wget https://link_copied_from_release_page

下载完成后,使用tar解压缩tarball(注意文件名可能因当前版本和操作系统而异):

tar -xvzf ark-v0.9.6-linux-amd64.tar.gz

/tmp目录现在应该包含提取的ark二进制文件以及刚刚下载的tarball。

验证您是否可以通过执行二进制文件来运行ark客户端:

./ark --help

您应该看到以下帮助输出:

Heptio Ark is a tool for managing disaster recovery, specifically for Kubernetes
cluster resources. It provides a simple, configurable, and operationally robust
way to back up your application state and associated data.

If you're familiar with kubectl, Ark supports a similar model, allowing you to
execute commands such as 'ark get backup' and 'ark create schedule'. The same
operations can also be performed as 'ark backup get' and 'ark schedule create'.

Usage:
  ark [command]

Available Commands:
  backup      Work with backups
  client      Ark client related commands
  completion  Output shell completion code for the specified shell (bash or zsh)
  create      Create ark resources
  delete      Delete ark resources
  describe    Describe ark resources
  get         Get ark resources
  help        Help about any command
  plugin      Work with plugins
  restic      Work with restic
  restore     Work with restores
  schedule    Work with schedules
  server      Run the ark server
  version     Print the ark version and associated image

. . .

此时,您应该将ark可执行文件移出临时/tmp目录并将其添加到PATH 要在Ubuntu系统上将其添加到PATH ,只需将其复制到/usr/local/bin

sudo mv ark /usr/local/bin/ark

您现在已准备好配置Ark服务器并将其部署到Kubernetes集群。

第2步 - 安装和配置Ark服务器

在我们将Ark部署到Kubernetes集群之前,我们首先要创建Ark的先决条件对象。 方舟的先决条件包括:

  • 一个heptio-ark命名空间

  • ark服务帐户

  • 基于角色的访问控制(RBAC)规则,用于授予ark服务帐户的权限

  • 特定于Ark的资源的自定义资源(CRD): BackupScheduleRestoreConfig

包含上述Kubernetes对象规范的YAML文件可以在官方Ark Git存储库中找到 在仍然在/tmp目录中时,使用git下载Ark repo:

git clone https://github.com/heptio/ark.git

下载后,导航到ark目录:

cd ark

上面列出的先决条件资源可以在examples/common/00-prereqs.yaml YAML文件中找到。 我们将通过使用kubectl apply并传入文件在Kubernetes集群中创建这些资源:

kubectl apply -f examples/common/00-prereqs.yaml

您应该看到以下输出:

customresourcedefinition.apiextensions.k8s.io/backups.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/schedules.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/restores.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/configs.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/downloadrequests.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/deletebackuprequests.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/podvolumebackups.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/podvolumerestores.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/resticrepositories.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/backupstoragelocations.ark.heptio.com created
namespace/heptio-ark created
serviceaccount/ark created
clusterrolebinding.rbac.authorization.k8s.io/ark created

现在我们已经在我们的集群中创建了必要的Ark Kubernetes对象,我们可以下载并安装Ark DigitalOcean插件 ,这将允许我们将DigitalOcean Spaces用作backupStorageProvider (用于Kubernetes对象),并将DigitalOcean Block Storage用作persistentVolumeProvider (对于持久卷备份)。

退回ark目录并使用git从StackPointCloud的repo中获取插件:

cd ..
git clone https://github.com/StackPointCloud/ark-plugin-digitalocean.git

进入插件目录:

cd ark-plugin-digitalocean

我们现在将我们的DigitalOcean Space的访问密钥保存为Kubernetes Secret 首先,使用您喜欢的编辑器打开examples/credentials-ark文件:

nano examples/credentials-ark

使用您的Spaces访问密钥和密钥替换<AWS_ACCESS_KEY_ID><AWS_SECRET_ACCESS_KEY>

实例/凭证-柜
[default]
aws_access_key_id=your_spaces_access_key_here
aws_secret_access_key=your_spaces_secret_key_here

保存并关闭文件。

现在,使用kubectl创建cloud-credentials Secret,使用digitalocean_token数据项插入您的个人访问令牌:

kubectl create secret generic cloud-credentials \
    --namespace heptio-ark \
    --from-file cloud=examples/credentials-ark \
    --from-literal digitalocean_token=your_personal_access_token

您应该看到以下输出:

secret/cloud-credentials created

要确认已成功创建cloud-credentials Secret,您可以使用kubectl对其进行kubectl

kubectl describe secrets/cloud-credentials --namespace heptio-ark

您应该看到以下描述cloud-credentials密码的输出:

Name:         cloud-credentials
Namespace:    heptio-ark
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
cloud:               115 bytes
digitalocean_token:  64 bytes

我们现在可以继续创建名为default的Ark Config对象。 为此,我们将编辑YAML配置文件,然后在Kubernetes集群中创建对象。

在您喜欢的编辑器中打开examples/10-ark-config.yaml

nano examples/10-ark-config.yaml

在突出显示的字段中插入您的Space的名称和区域:

实例/ 10-ARK-config.yaml
---
apiVersion: ark.heptio.com/v1
kind: Config
metadata:
  namespace: heptio-ark
  name: default
persistentVolumeProvider:
  name: digitalocean
backupStorageProvider:
  name: aws
  bucket: space_name_here
  config:
    region: space_region_here
    s3ForcePathStyle: "true"
    s3Url: https://space_region_here.digitaloceanspaces.com
backupSyncPeriod: 30m
gcSyncPeriod: 30m
scheduleSyncPeriod: 1m
restoreOnlyMode: false

persistentVolumeProvider将DigitalOcean Block Storage设置为持久卷备份的提供程序。 这些将是Block Storage Volume Snapshots。

backupStorageProvider将DigitalOcean Spaces设置为Kubernetes对象备份的提供程序。 Ark将创建所有Kubernetes对象的tarball(或者一些,取决于你如何执行它),并将此tarball上传到Spaces。

完成后,保存并关闭文件。

使用kubectl apply在集群中创建对象:

kubectl apply -f examples/10-ark-config.yaml

您应该看到以下输出:

config.ark.heptio.com/default created

此时,我们已完成配置Ark服务器并可以创建其Kubernetes部署,可在examples/20-deployment.yaml配置文件中找到。 我们快速浏览一下这个文件:

cat examples/20-deployment.yaml

您应该看到以下文本:

实例/ 20-deployment.yaml
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  namespace: heptio-ark
  name: ark
spec:
  replicas: 1
  template:
    metadata:
      labels:
        component: ark
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "8085"
        prometheus.io/path: "/metrics"
    spec:
      restartPolicy: Always
      serviceAccountName: ark
      containers:
        - name: ark
          image: gcr.io/heptio-images/ark:latest
          command:
            - /ark
          args:
            - server
          volumeMounts:
            - name: cloud-credentials
              mountPath: /credentials
            - name: plugins
              mountPath: /plugins
            - name: scratch
              mountPath: /scratch
          env:
            - name: AWS_SHARED_CREDENTIALS_FILE
              value: /credentials/cloud
            - name: ARK_SCRATCH_DIR
              value: /scratch
            - name: DIGITALOCEAN_TOKEN
              valueFrom:
                secretKeyRef:
                  key: digitalocean_token
                  name: cloud-credentials
      volumes:
        - name: cloud-credentials
          secret:
            secretName: cloud-credentials
        - name: plugins
          emptyDir: {}
        - name: scratch
          emptyDir: {}

我们在这里观察到我们正在创建一个名为ark的部署,它由gcr.io/heptio-images/ark:latest容器的单个副本组成。 使用我们之前创建的cloud-credentials秘密配置Pod。

使用kubectl apply创建部署:

kubectl apply -f examples/20-deployment.yaml

您应该看到以下输出:

deployment.apps/ark created

我们可以使用kubectl getheptio-ark命名空间上仔细检查是否已成功创建部署:

kubectl get deployments --namespace=heptio-ark

您应该看到以下输出:

NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
ark       1         1         1            0           8m

在安装Ark DigitalOcean插件之前,Ark服务器Pod可能无法正常启动。 要安装ark-blockstore-digitalocean插件,请使用我们之前安装的ark客户端:

ark plugin add quay.io/stackpoint/ark-blockstore-digitalocean:latest

您可以指定要与--kubeconfig标志一起使用的--kubeconfig 如果你不使用这个标志, ark将检查KUBECONFIG环境变量,然后回kubectl默认值( ~/.kube/config )。

此时Ark正在运行并完全配置,并准备备份并将Kubernetes集群对象和Persistent Volumes恢复到DigitalOcean Spaces和Block Storage。

在下一节中,我们将进行快速测试,以确保备份和还原功能按预期工作。

第3步 - 测试备份和还原过程

现在我们已经成功安装并配置了Ark,我们可以创建一个测试Nginx部署和持久卷,并运行备份和恢复钻取以确保一切正常。

ark-plugin-digitalocean存储库包含一个名为nginx-pv.yaml的示例Nginx部署。

我们来看看:

cat examples/nginx-pv.yaml

您应该看到以下文本:

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-logs
  namespace: nginx-example
  labels:
    app: nginx
spec:
  storageClassName: do-block-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: nginx-example
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
        - name: nginx-logs
          persistentVolumeClaim:
           claimName: nginx-logs
      containers:
      - image: nginx:1.7.9
        name: nginx
        ports:
        - containerPort: 80
        volumeMounts:
          - mountPath: "/var/log/nginx"
            name: nginx-logs
            readOnly: false

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: my-nginx
  namespace: nginx-example
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

在此文件中,我们遵守以下规范:

  • Nginx部署由nginx:1.7.9容器映像的单个副本组成
  • 使用do-block-storage StorageClass的5Gi持久卷声明(称为nginx-logs
  • 一个公开端口80 LoadBalancer服务

使用kubectl apply创建部署:

kubectl apply -f examples/nginx-pv.yml

您应该看到以下输出:

namespace/nginx-example created
persistentvolumeclaim/nginx-logs created
deployment.apps/nginx-deployment created
service/my-nginx created

检查部署是否成功:

kubectl get deployments --namespace=nginx-example

您应该看到以下输出:

NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   1         1         1            1           1h

一旦Available达到1,使用kubectl get获取Nginx负载均衡器的外部IP:

kubectl get services --namespace=nginx-example

您应该看到my-nginx服务的内部CLUSTER-IPEXTERNAL-IP

NAME       TYPE           CLUSTER-IP     EXTERNAL-IP       PORT(S)        AGE
my-nginx   LoadBalancer   10.32.27.0      203.0.113.0   80:30754/TCP   3m

记下EXTERNAL-IP并使用您的Web浏览器导航到它。

您应该看到以下NGINX欢迎页面:

Nginx欢迎页面

这表明您的Nginx部署和服务已启动并正在运行。

在我们模拟灾难场景之前,让我们首先检查Nginx访问日志(存储在连接到Nginx Pod的持久卷上):

使用kubectl get获取Pod的名称:

kubectl get pods --namespace nginx-example
NAME                                READY     STATUS    RESTARTS   AGE
nginx-deployment-77d8f78fcb-zt4wr   1/1       Running   0          29m

现在, exec到正在运行的Nginx容器中以获取其中的shell:

kubectl exec -it nginx-deployment-77d8f78fcb-zt4wr --namespace nginx-example -- /bin/bash

进入Nginx容器后,请使用Nginx访问日志:

cat /var/log/nginx/access.log

你应该看到一些Nginx访问条目:

10.244.17.1 - - [01/Oct/2018:21:47:01 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/203.0.113.11 Safari/537.36" "-"
10.244.17.1 - - [01/Oct/2018:21:47:01 +0000] "GET /favicon.ico HTTP/1.1" 404 570 "http://203.0.113.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/203.0.113.11 Safari/537.36" "-"

请注意这些(特别是时间戳),因为我们将使用它们来确认还原过程是否成功。

我们现在可以执行备份过程,将所有nginx Kubernetes对象复制到Spaces,并获取我们在部署Nginx时创建的持久卷的快照。

我们将使用ark客户端创建一个名为nginx-backup

ark backup create nginx-backup --selector app=nginx

--selector app=nginx指示Ark服务器仅使用app=nginx标签选择器备份Kubernetes对象。

您应该看到以下输出:

Backup request "nginx-backup" submitted successfully.
Run `ark backup describe nginx-backup` for more details.

运行ark backup describe nginx-backup应在短暂延迟后提供以下输出:

Name:         nginx-backup
Namespace:    heptio-ark
Labels:       <none>
Annotations:  <none>

Phase:  Completed

Namespaces:
  Included:  *
  Excluded:  <none>

Resources:
  Included:        *
  Excluded:        <none>
  Cluster-scoped:  auto

Label selector:  app=nginx

Snapshot PVs:  auto

TTL:  720h0m0s

Hooks:  <none>

Backup Format Version:  1

Started:    2018-09-26 00:14:30 -0400 EDT
Completed:  2018-09-26 00:14:34 -0400 EDT

Expiration:  2018-10-26 00:14:30 -0400 EDT

Validation errors:  <none>

Persistent Volumes:
  pvc-e4862eac-c2d2-11e8-920b-92c754237aeb:
    Snapshot ID:        2eb66366-c2d3-11e8-963b-0a58ac14428b
    Type:               ext4
    Availability Zone:
    IOPS:               <N/A>

此输出表明nginx-backup已成功完成。

从DigitalOcean云控制面板,导航到包含Kubernetes备份文件的Space。

您应该看到一个名为nginx-backup的新目录,其中包含Ark备份文件。

使用左侧导航栏,转到图像 ,然后转到快照 在“ 快照”中 ,导航到“ 卷” 您应该看到与上面输出中列出的PVC对应的快照。

我们现在可以测试恢复过程。

让我们先删除nginx-example命名空间。 这将删除命名空间中的所有内容,包括Load Balancer和Persistent Volume:

kubectl delete namespace nginx-example

验证您是否无法再在Load Balancer端点访问Nginx,并且nginx-example部署不再运行:

kubectl get deployments --namespace=nginx-example
No resources found.

我们现在可以再次使用ark客户端执行还原过程:

ark restore create --from-backup nginx-backup

这里我们使用createnginx-backup对象创建Ark Restore对象。

您应该看到以下输出:

Restore request "nginx-backup-20180926143828" submitted successfully.
Run `ark restore describe nginx-backup-20180926143828` for more details.

检查已还原部署的状态:

kubectl get deployments --namespace=nginx-example
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   1         1         1            1           1m

检查是否创建了持久卷:

 kubectl get pvc --namespace=nginx-example
NAME         STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
nginx-logs   Bound     pvc-e4862eac-c2d2-11e8-920b-92c754237aeb   5Gi        RWO            do-block-storage   3m

再次导航到Nginx服务的外部IP,以确认Nginx已启动并正在运行。

最后,检查还原的持久卷上的日志以确认还原后是否保留了日志历史记录。

为此,再次使用kubectl get获取Pod的名称:

kubectl get pods --namespace nginx-example
NAME                                READY     STATUS    RESTARTS   AGE
nginx-deployment-77d8f78fcb-zt4wr   1/1       Running   0          29m

然后exec

kubectl exec -it nginx-deployment-77d8f78fcb-zt4wr --namespace nginx-example -- /bin/bash

进入Nginx容器后,请使用Nginx访问日志:

cat /var/log/nginx/access.log
10.244.17.1 - - [01/Oct/2018:21:47:01 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/203.0.113.11 Safari/537.36" "-"
10.244.17.1 - - [01/Oct/2018:21:47:01 +0000] "GET /favicon.ico HTTP/1.1" 404 570 "http://203.0.113.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/203.0.113.11 Safari/537.36" "-"

您应该看到相同的备份前访问尝试(请注意时间戳),确认持久卷还原成功。 请注意,如果您在执行还原后访问了Nginx登录页面,则可能会在日志中进行其他尝试。

此时,我们已成功将我们的Kubernetes对象备份到DigitalOcean Spaces,并使用块存储卷快照将我们的持久卷备份。 我们模拟了灾难情景,并将服务恢复到测试Nginx应用程序。

结论

在本指南中,我们在基于DigitalOcean的Kubernetes集群上安装并配置了Ark Kubernetes备份工具。 我们将工具配置为将Kubernetes对象备份到DigitalOcean Spaces,并使用Block Storage Volume Snapshot备份Persistent Volumes。

Ark还可用于安排Kubernetes集群的定期备份。 为此,您可以使用ark schedule命令。 它还可用于将资源从一个群集迁移到另一个群集。 要了解有关这两个用例的更多信息,请参阅Ark官方文档

要了解有关DigitalOcean Spaces的更多信息,请参阅官方Spaces文档 要了解有关Block Storage Volumes的更多信息,请参阅Block Storage Volume文档

本教程以StackPointCloud的ark-plugin-digitalocean GitHub repo中的README为基础。


分享按钮