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

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

DigitalOcean Velero 插件 允许您使用 DigitalOcean 块存储来为您的持久卷创建快照,并使用空间来备份您的 Kubernetes 对象。 在 DigitalOcean 上运行 Kubernetes 集群时,这使您可以快速备份集群的状态并在灾难发生时恢复它。

在本教程中,我们将在本地机器上设置和配置 velero 命令行工具,并将服务器组件部署到我们的 Kubernetes 集群中。 然后,我们将部署一个使用持久卷进行日志记录的示例 Nginx 应用程序,然后模拟灾难恢复场景。

先决条件

在开始本教程之前,您应该准备好以下内容:

在您的本地计算机上:

  • kubectl 命令行工具,配置为连接到您的集群。 您可以在 Kubernetes 官方文档 中阅读有关安装和配置 kubectl 的更多信息。
  • git 命令行实用程序。 您可以在Git入门中了解如何安装git

在您的 DigitalOcean 帐户中:

  • DigitalOcean Droplets 上的 DigitalOcean Kubernetes 集群或 Kubernetes 集群(版本 1.7.5 或更高版本)。
  • 在集群内部运行的 DNS 服务器。 如果您使用的是 DigitalOcean Kubernetes,则默认情况下正在运行。 要了解有关配置 Kubernetes DNS 服务的更多信息,请参阅 Kuberentes 官方文档中的 自定义 DNS 服务
  • 一个 DigitalOcean 空间,将存储您备份的 Kubernetes 对象。 要了解如何创建 Space,请参阅 Spaces 产品文档
  • 您的 DigitalOcean Space 的访问密钥对。 要了解如何创建一组访问密钥,请参阅 如何管理对空间的管理访问
  • 用于 DigitalOcean API 的个人访问令牌。 要了解如何创建个人访问令牌,请参阅 如何创建个人访问令牌。 确保您创建或使用的令牌具有 Read/Write 权限,否则快照将不起作用。

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

第 1 步 — 安装 Velero 客户端

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

在您的网络浏览器中,导航到 Velero GitHub 存储库 发布页面 ,找到与您的操作系统和系统架构对应的版本,然后复制链接地址。 出于本指南的目的,我们将使用 x86-64(或 AMD64)处理器上的 Ubuntu 18.04 服务器作为我们的本地计算机,并使用 Velero v1.2.0 版本。

注意: 要遵循本指南,您应该下载并安装 Velero 客户端的 v1.2.0


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

cd /tmp

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

wget https://link_copied_from_release_page

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

tar -xvzf velero-v1.2.0-linux-amd64.tar.gz

/tmp 目录现在应该包含解压缩的 velero-v1.2.0-linux-amd64 目录以及您刚刚下载的 tarball。

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

./velero-v1.2.0-linux-amd64/velero help

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

OutputVelero 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, Velero supports a similar model, allowing you to
execute commands such as 'velero get backup' and 'velero create schedule'. The same
operations can also be performed as 'velero backup get' and 'velero schedule create'.

Usage:
  velero [command]

Available Commands:
  backup            Work with backups
  backup-location   Work with backup storage locations
  bug               Report a Velero bug
  client            Velero client related commands
  completion        Output shell completion code for the specified shell (bash or zsh)
  create            Create velero resources
  delete            Delete velero resources
  describe          Describe velero resources
  get               Get velero resources
  help              Help about any command
  install           Install Velero
  plugin            Work with plugins
  restic            Work with restic
  restore           Work with restores
  schedule          Work with schedules
  snapshot-location Work with snapshot locations
  version           Print the velero version and associated image
. . .

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

sudo mv velero-v1.2.0-linux-amd64/velero /usr/local/bin/velero

您现在已准备好为 Velero 服务器配置机密,然后将其部署到您的 Kubernetes 集群。

第 2 步 — 配置机密

在设置 Velero 的服务器组件之前,您需要准备 DigitalOcean Spaces 密钥和 API 令牌。 再次使用 cd 命令导航到临时目录 /tmp

cd /tmp

现在我们将为 DigitalOcean 下载 Velero 插件的副本。 访问 插件的 Github 发布页面 并将链接复制到以 .tar.gz 结尾的文件。

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

wget https://link_copied_from_release_page

下载完成后,使用 tar 解压缩 tarball(再次注意,文件名可能因发行版本而异):

tar -xvzf v1.0.0.tar.gz

/tmp 目录现在应该包含解压缩的 velero-plugin-1.0.0 目录以及您刚刚下载的 tarball。

接下来我们将 cd 放入 velero-plugin-1.0.0 目录:

cd velero-plugin-1.0.0

现在我们可以保存我们的 DigitalOcean Space 和 API 令牌的访问密钥,以用作 Kubernetes Secret。 首先,使用您喜欢的编辑器打开 examples/cloud-credentials 文件。

nano examples/cloud-credentials

该文件将如下所示:

/tmp/velero-plugin-1.0.0/examples/cloud-credentials

[default]
aws_access_key_id=<AWS_ACCESS_KEY_ID>
aws_secret_access_key=<AWS_SECRET_ACCESS_KEY>

编辑 <AWS_ACCESS_KEY_ID><AWS_SECRET_ACCESS_KEY> 占位符以使用您的 DigitalOcean Spaces 密钥。 请务必删除 <> 字符。

下一步是编辑 01-velero-secret.patch.yaml 文件,使其包含您的 DigitalOcean API 令牌。 在您喜欢的编辑器中打开文件:

nano examples/01-velero-secret.patch.yaml

它应该如下所示:

---
apiVersion: v1
kind: Secret
stringData:
digitalocean_token: <DIGITALOCEAN_API_TOKEN>
type: Opaque

更改整个 <DIGITALOCEAN_API_TOKEN> 占位符以使用您的 DigitalOcean 个人 API 令牌。 该行应该类似于 digitalocean_token: 18a0d730c0e0....。 同样,确保删除 <> 字符。

第 3 步 — 安装 Velero 服务器

Velero 安装由许多 Kubernetes 对象组成,它们共同创建、调度和管理备份。 您刚刚下载的 velero 可执行文件可以为您生成和安装这些对象。 velero install 命令将执行初步设置步骤,让您的集群做好备份准备。 具体来说,它将:

  • 创建一个 velero 命名空间。
  • 添加 velero 服务帐号。
  • 配置基于角色的访问控制 (RBAC) 规则以向 velero 服务帐户授予权限。
  • 为 Velero 特定资源安装自定义资源定义 (CRD):BackupScheduleRestoreConfig
  • 注册 Velero Plugins 来管理块快照和空间存储。

我们将使用一些非默认配置选项运行 velero install 命令。 具体来说,您需要在实际调用命令时编辑以下每个设置以匹配您的 Spaces 配置:

  • --bucket velero-backups:更改 velero-backups 值以匹配您的 DigitalOcean Space 的名称。 例如,如果您将 Space 称为“backup-bucket”,则选项将如下所示:--bucket backup-bucket
  • --backup-location-config s3Url=https://nyc3.digitaloceanspaces.com,region=nyc3:更改 URL 和区域以匹配您的空间设置。 具体来说,编辑两个 nyc3 部分以匹配托管空间的区域。 例如,如果您的空间托管在 fra1 区域,则该行将如下所示:--backup-location-config s3Url=https://fra1.digitaloceanspaces.com,region=fra1。 区域标识符为:nyc3sfo2sgp1fra1

准备好适当的存储桶和备份位置设置后,就可以安装 Velero。 运行以下命令,在需要时替换您的值:

velero install \
  --provider velero.io/aws \
  --bucket velero-backups \
  --plugins velero/velero-plugin-for-aws:v1.0.0,digitalocean/velero-plugin:v1.0.0 \
  --backup-location-config s3Url=https://nyc3.digitaloceanspaces.com,region=nyc3 \
  --use-volume-snapshots=false \
  --secret-file ./examples/cloud-credentials

您应该看到以下输出:

OutputCustomResourceDefinition/backups.velero.io: attempting to create resource
CustomResourceDefinition/backups.velero.io: created
CustomResourceDefinition/backupstoragelocations.velero.io: attempting to create resource
CustomResourceDefinition/backupstoragelocations.velero.io: created
CustomResourceDefinition/deletebackuprequests.velero.io: attempting to create resource
CustomResourceDefinition/deletebackuprequests.velero.io: created
CustomResourceDefinition/downloadrequests.velero.io: attempting to create resource
CustomResourceDefinition/downloadrequests.velero.io: created
CustomResourceDefinition/podvolumebackups.velero.io: attempting to create resource
CustomResourceDefinition/podvolumebackups.velero.io: created
CustomResourceDefinition/podvolumerestores.velero.io: attempting to create resource
CustomResourceDefinition/podvolumerestores.velero.io: created
CustomResourceDefinition/resticrepositories.velero.io: attempting to create resource
CustomResourceDefinition/resticrepositories.velero.io: created
CustomResourceDefinition/restores.velero.io: attempting to create resource
CustomResourceDefinition/restores.velero.io: created
CustomResourceDefinition/schedules.velero.io: attempting to create resource
CustomResourceDefinition/schedules.velero.io: created
CustomResourceDefinition/serverstatusrequests.velero.io: attempting to create resource
CustomResourceDefinition/serverstatusrequests.velero.io: created
CustomResourceDefinition/volumesnapshotlocations.velero.io: attempting to create resource
CustomResourceDefinition/volumesnapshotlocations.velero.io: created
Waiting for resources to be ready in cluster...
Namespace/velero: attempting to create resource
Namespace/velero: created
ClusterRoleBinding/velero: attempting to create resource
ClusterRoleBinding/velero: created
ServiceAccount/velero: attempting to create resource
ServiceAccount/velero: created
Secret/cloud-credentials: attempting to create resource
Secret/cloud-credentials: created
BackupStorageLocation/default: attempting to create resource
BackupStorageLocation/default: created
Deployment/velero: attempting to create resource
Deployment/velero: created
Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.

您可以使用输出中的 kubectl 命令查看部署日志。 一旦您的部署准备就绪,您可以继续下一步,即配置服务器。 成功的部署将如下所示(使用不同的 AGE 列):

kubectl get deployment/velero --namespace velero
OutputNAME     READY   UP-TO-DATE   AVAILABLE   AGE
velero   1/1     1            1           2m

此时,您已将 Velero 的服务器组件作为部署安装到您的 Kubernetes 集群中。 您还使用 Kubernetes Secret 向 Velero 注册了 Spaces 密钥。

注意: 您可以通过 --kubeconfig 标志指定 velero 命令行工具应使用的 kubeconfig。 如果您不使用此标志,velero 将检查 KUBECONFIG 环境变量,然后回退到 kubectl 默认值 (~/.kube/config)。


第 4 步 — 配置快照

当我们安装 Velero 服务器时,选项 --use-volume-snapshots=false 是命令的一部分。 由于我们想要对 Kubernetes 集群中的底层块存储设备进行快照,我们需要告诉 Velero 使用正确的插件进行 DigitalOcean 块存储。

运行以下命令以启用插件并将其注册为默认快照提供程序:

velero snapshot-location create default --provider digitalocean.com/velero

您将看到以下输出:

OutputSnapshot volume location "default" configured successfully.

第 5 步 — 添加 API 令牌

在上一步中,我们在 Velero 服务器中创建了块存储和对象存储对象。 我们已经在服务器上注册了 digitalocean/velero-plugin:v1.0.0 插件,并将我们的 Spaces 密钥安装到集群中。

最后一步是修补我们之前创建的 cloud-credentials Secret 以使用我们的 DigitalOcean API 令牌。 如果没有此令牌,快照插件将无法使用 DigitalOcean API 进行身份验证。

我们可以使用 kubectl edit 命令通过引用 API 令牌来修改 Velero 部署对象。 但是,手动编辑复杂的 YAML 对象可能很乏味且容易出错。 相反,我们将使用 kubectl patch 命令,因为 Kubernetes 支持 修补对象 。 让我们快速浏览一下我们将应用的补丁文件的内容。

第一个补丁文件是您之前编辑的 examples/01-velero-secret.patch.yaml 文件。 它旨在将您的 API 令牌添加到已包含您的 Spaces 密钥的 secrets/cloud-credentials 密钥中。 cat 文件:

cat examples/01-velero-secret.patch.yaml

它应该看起来像这样(用您的令牌代替 <DIGITALOCEAN_API_TOKEN> 占位符):

示例/01-velero-secret.patch.yaml

. . .
---
apiVersion: v1
kind: Secret
stringData:
  digitalocean_token: <DIGITALOCEAN_API_TOKEN>
type: Opaque

现在让我们看一下 Deployment 的补丁文件:

cat examples/02-velero-deployment.patch.yaml

您应该看到以下 YAML:

示例/02-velero-deployment.patch.yaml

. . .
---
apiVersion: v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - args:
        - server
        command:
        - /velero
        env:
        - name: DIGITALOCEAN_TOKEN
          valueFrom:
            secretKeyRef:
              key: digitalocean_token
              name: cloud-credentials
        name: velero

此文件表明我们正在修补名为 velero 的 Deployment 的 Pod 规范。 由于这是一个补丁,我们不需要指定整个 Kubernetes 对象规范或元数据。 在这种情况下,Velero 部署已经使用 cloud-credentials 密钥进行配置,因为 velero install 命令为我们创建了它。 所以这个补丁需要做的就是将 digitalocean_token 注册为已经部署的 Velero Pod 的环境变量。

让我们使用 kubectl patch 命令应用第一个 Secret 补丁:

kubectl patch secret/cloud-credentials -p "$(cat examples/01-velero-secret.patch.yaml)" --namespace velero

您应该看到以下输出:

Outputsecret/cloud-credentials patched

最后,我们将修补部署。 运行以下命令:

kubectl patch deployment/velero -p "$(cat examples/02-velero-deployment.patch.yaml)" --namespace velero

如果补丁成功,您将看到以下内容:

Outputdeployment.apps/velero patched

让我们使用 velero 命名空间上的 kubectl get 验证修补的部署是否正常工作:

kubectl get deployment/velero --namespace velero

您应该看到以下输出:

OutputNAME     READY   UP-TO-DATE   AVAILABLE   AGE
velero   1/1     1            1           12s

此时 Velero 正在运行并已完全配置,并准备好备份和恢复您的 Kubernetes 集群对象和持久卷到 DigitalOcean 空间和块存储。

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

第 6 步 — 测试备份和恢复程序

现在我们已经成功安装和配置 Velero,我们可以创建一个测试 Nginx 部署,具有持久卷和服务。 部署运行后,我们将进行备份和恢复练习,以确保 Velero 已配置并正常工作。

确保您仍在 /tmp/velero-plugin-1.0.0 目录中工作。 examples 目录包含一个名为 nginx-example.yaml 的示例 Nginx 清单。

使用您选择的编辑器打开此文件:

nano examples/nginx-example.yaml

您应该看到以下文本:

Output. . .
---
apiVersion: v1
kind: Namespace
metadata:
  name: nginx-example
  labels:
    app: nginx

---
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/v1
kind: Deployment
metadata:
  name: nginx-deploy
  namespace: nginx-example
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
        - name: nginx-logs
          persistentVolumeClaim:
           claimName: nginx-logs
      containers:
      - image: nginx:stable
        name: nginx
        ports:
        - containerPort: 80
        volumeMounts:
          - mountPath: "/var/log/nginx"
            name: nginx-logs
            readOnly: false

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

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

  • 一个名为 nginx-example 的 Nginx 命名空间
  • nginx:stable 容器镜像的单个副本组成的 Nginx 部署
  • 使用 do-block-storage StorageClass 的 5Gi 持久卷声明(称为 nginx-logs
  • 暴露端口 80LoadBalancer 服务

使用 kubectl apply 创建对象:

kubectl apply -f examples/nginx-example.yaml

您应该看到以下输出:

Outputnamespace/nginx-example created
persistentvolumeclaim/nginx-logs created
deployment.apps/nginx-deploy created
service/nginx-svc created

检查部署是否成功:

kubectl get deployments --namespace=nginx-example

您应该看到以下输出:

OutputNAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   1/1     1            1           1m23s

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

kubectl get services --namespace=nginx-example

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

OutputNAME        TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
nginx-svc   LoadBalancer   10.245.147.61   159.203.48.191   80:30232/TCP   3m1s

注意 EXTERNAL-IP 并使用您的网络浏览器导航到它。

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

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

在我们模拟我们的灾难场景之前,让我们首先检查 Nginx 访问日志(存储在附加到 Nginx Pod 的 Persistent Volume 上):

使用 kubectl get 获取 Pod 的名称:

kubectl get pods --namespace nginx-example
OutputNAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-694c85cdc8-vknsk   1/1     Running   0          4m14s

现在,将 exec 放入正在运行的 Nginx 容器中以获取其中的外壳:

kubectl exec -it nginx-deploy-694c85cdc8-vknsk --namespace nginx-example -- /bin/bash

一旦进入 Nginx 容器,cat Nginx 访问日志:

cat /var/log/nginx/access.log

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

Output10.244.0.119 - - [03/Jan/2020:04:43:04 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
10.244.0.119 - - [03/Jan/2020:04:43:04 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"

记下这些(尤其是时间戳),因为我们将使用它们来确认恢复过程是否成功。 退出吊舱:

exit

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

我们将使用 velero 命令行客户端创建一个名为 nginx-backup 的备份:

velero backup create nginx-backup --selector app=nginx

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

您应该看到以下输出:

OutputBackup request "nginx-backup" submitted successfully.
Run `velero backup describe nginx-backup` or `velero backup logs nginx-backup` for more details.

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

OutputName:         nginx-backup
Namespace:    velero
Labels:       velero.io/backup=nginx-backup
              velero.io/pv=pvc-6b7f63d7-752b-4537-9bb0-003bed9129ca
              velero.io/storage-location=default
Annotations:  <none>

Phase:  Completed

Namespaces:
  Included:  *
  Excluded:  <none>

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

Label selector:  app=nginx

Storage Location:  default

Snapshot PVs:  auto

TTL:  720h0m0s

Hooks:  <none>

Backup Format Version:  1

Started:    2020-01-02 23:45:30 -0500 EST
Completed:  2020-01-02 23:45:34 -0500 EST

Expiration:  2020-02-01 23:45:30 -0500 EST

Resource List:
  apps/v1/Deployment:
    - nginx-example/nginx-deploy
  apps/v1/ReplicaSet:
    - nginx-example/nginx-deploy-694c85cdc8
  v1/Endpoints:
    - nginx-example/nginx-svc
  v1/Namespace:
    - nginx-example
  v1/PersistentVolume:
    - pvc-6b7f63d7-752b-4537-9bb0-003bed9129ca
  v1/PersistentVolumeClaim:
    - nginx-example/nginx-logs
  v1/Pod:
    - nginx-example/nginx-deploy-694c85cdc8-vknsk
  v1/Service:
    - nginx-example/nginx-svc

Persistent Volumes:
  pvc-6b7f63d7-752b-4537-9bb0-003bed9129ca:
    Snapshot ID:        dfe866cc-2de3-11ea-9ec0-0a58ac14e075
    Type:               ext4
    Availability Zone:  
    IOPS:               <N/A>

此输出表明 nginx-backup 成功完成。 资源列表显示了备份中包含的每个 Kubernetes 对象。 最后一部分显示 PersistentVolume 也使用文件系统快照进行备份。

要从 DigitalOcean 云控制面板中确认,请导航到包含 Kubernetes 备份文件的空间。

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

使用左侧导航栏,转到 Images,然后转到 Snapshots。 在 Snapshots 中,导航到 Volumes。 您应该会看到与上述输出中列出的 PVC 对应的快照。

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

我们先删除 nginx-example 命名空间。 这将删除命名空间中的所有内容,包括负载均衡器和持久卷:

kubectl delete namespace nginx-example

验证您不能再在负载均衡器端点访问 Nginx,并且 nginx-example 部署不再运行:

kubectl get deployments --namespace=nginx-example
OutputNo resources found in nginx-example namespace.

我们现在可以执行恢复过程,再次使用 velero 客户端:

velero restore create --from-backup nginx-backup

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

您应该看到以下输出:

OutputRestore request "nginx-backup-20200102235032" submitted successfully.
Run `velero restore describe nginx-backup-20200102235032` or `velero restore logs nginx-backup-20200102235032` for more details.

检查恢复的 Deployment 的状态:

kubectl get deployments --namespace=nginx-example
OutputNAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   1/1     1            1           58s

检查持久卷的创建:

 kubectl get pvc --namespace=nginx-example
OutputNAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
nginx-logs   Bound    pvc-6b7f63d7-752b-4537-9bb0-003bed9129ca   5Gi        RWO            do-block-storage   75s

还原还创建了一个 LoadBalancer。 有时会使用新的 IP 地址重新创建服务。 您将需要再次找到 EXTERNAL-IP 地址:

kubectl get services --namespace nginx-example
OutputNAME        TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
nginx-svc   LoadBalancer   10.245.15.83   159.203.48.191   80:31217/TCP   97s

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

最后,检查恢复的 Persistent Volume 上的日志,以确认日志历史记录已在恢复后保留。

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

kubectl get pods --namespace nginx-example
OutputNAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-694c85cdc8-vknsk   1/1     Running   0          2m20s

然后 exec 进入它:

kubectl exec -it nginx-deploy-694c85cdc8-vknsk --namespace nginx-example -- /bin/bash

一旦进入 Nginx 容器,cat Nginx 访问日志:

cat /var/log/nginx/access.log
Output10.244.0.119 - - [03/Jan/2020:04:43:04 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
10.244.0.119 - - [03/Jan/2020:04:43:04 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"

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

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

结论

在本指南中,我们在基于 DigitalOcean 的 Kubernetes 集群上安装并配置了 Velero Kubernetes 备份工具。 我们将该工具配置为将 Kubernetes 对象备份到 DigitalOcean Spaces,并使用块存储卷快照备份持久卷。

Velero 还可以用于为 灾难恢复 安排 Kubernetes 集群的定期备份。 为此,您可以使用 velero schedule 命令。 Velero 还可用于 将资源 从一个集群迁移到另一个集群。

要了解有关 DigitalOcean Spaces 的更多信息,请参阅 官方 Spaces 文档 。 要了解有关块存储卷的更多信息,请参阅 块存储卷文档

本教程基于 StackPointCloud 的 ark-plugin-digitalocean GitHub repo 中的 README。