众所周知,Kubernetes可以协调连接在一起,作为一个工作单元,形成高可用性的计算机集群。Kubernetes包含许多抽象概念,这些抽象概念允许将容器化的应用程序部署到集群中,而无需将它们附加到单独的机器上。

简而言之,Kubernetes拥有以下特性:

  • 便携式:公有、私有、混合、多云
  • 可扩展:模块化、可插拔、可挂钩、可组合
  • 自我修复:自动放置、自动重启、自动复制、自动缩放

在本文中,我们将介绍如何使用Velero开源工具备份和还原Kubernetes集群资源和持久卷的步骤。

第一节 为什么要备份?

首先,让我们了解您需要使用备份的典型方案,如果从灾难中恢复,则可以减少恢复时间。Kubernetes 资源从一个集群迁移到另一个集群或更高版本的 Kubernetes ,需要复制环境以进行调试、开发等。

现在我们已经清楚了为什么需要备份了,接下来我们可以检查要备份的对象列表。

要备份什么?Kubernetes资源存储在etcd存储中。etcd是一个一致且高度可用的键值存储,用作所有集群数据的 Kubernetes 的后备存储。您可以在官方文档中找到有关 etcd 的详细信息。集群中运行的有状态应用程序的应用程序数据,即持久卷。

第二节 Velero如何运作

Velero( 以前称为Heptio Ark )为您提供了备份和还原 Kubernetes 集群资源和持久卷的工具。

Velero包含:

  • Ivacy VPN
  • 在集群上运行的服务器
  • 在本地运行的命令行客户端

每个Velero操作(例如:按需备份、计划备份、还原等)都是自定义资源,使用Kubernetes自定义资源(CRD)定义并存储在etcd存储中。

kibana 备份还原es kubernetes备份_服务器

当你运行命令 velero backup create test-backup:时。

1.Velero客户端调用Kubernetes API服务器以创建一个 Backup 对象。

2.BackupController 看起来像一个新的 Backup 对象并执行验证。

3.BackupController 开始备份操作。它通过查询API服务器以获取资源来收集数据以进行备份。

4.BackupController 调用对象存储服务(例如AWS S3)以上传备份文件。

在下一节中,我们将介绍有关如何备份和还原Kubernetes集群资源和持久卷的步骤。

第三节 先决条件

以下是此快速入门所需的先决条件:

1.具有Kubernetes最新稳定版本的集群
2.Kubectl CLI

在安装之前,请检查我们是否具有正确的Kubernetes版本。

kibana 备份还原es kubernetes备份_应用程序_02

步骤#1 下载Velero

使用以下命令下载最新版本的Velero:

curl -LO https://get.helm.sh/helm-v3.0.0-linux-amd64.tar.gz

kibana 备份还原es kubernetes备份_应用程序_03

使用Linux或者其他平台的朋友,请参见发行页面的说明。

解压缩下载文件并将velero可执行文件移至/ usr / local / bin或您的路径。

在您的本地目录中创建特定于Velero的凭证文件(credentials-velero)。

echo "[default] 

aws_access_key_id = minio

aws_secret_access_key = minio123" > credentials-velero

Velero需要合适的存储提供商来存储备份和快照数据,在本演示中,我们将使用Minio,这是一个在本地集群上运行的S3兼容存储服务,Minio实例将使用上述凭据。 

现在我们已经准备好凭据和群集,接下来就可以安装Velero服务器了。

步骤#2 安装Velero服务器

在以下步骤中,我们将启动服务器和本地存储服务。在Velero文件夹中,运行以下命令:

使用以下命令配置本地存储服务:

kubectl apply -f examples/minio/00-minio-deployment.yaml

kibana 备份还原es kubernetes备份_服务器_04

使用以下命令启动Velero服务器:

velero install \
    --provider aws \
    --bucket velero \
    --secret-file ./credentials-velero \
    --use-volume-snapshots=false \
    --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.velero.svc:9000

kibana 备份还原es kubernetes备份_nginx_05

现在,我们假设Velero在本地集群中运行,而没有能够提供快照的卷。

检查是否成功创建部署了Velero。

kibana 备份还原es kubernetes备份_nginx_06

步骤#3 部署示例应用程序

下一步是使用以下命令在集群上部署示例nginx应用程序:

kubectl apply -f velero/examples/nginx-app/base.yaml

kibana 备份还原es kubernetes备份_应用程序_07

检查是否成功创建了示例应用程序部署。

kibana 备份还原es kubernetes备份_nginx_08

步骤#4 备份

现在,我们将为与 app = nginx 标签选择器匹配的任何对象创建备份:

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

kibana 备份还原es kubernetes备份_kibana 备份还原es_09

如果要备份除匹配标签的对象以外的所有对象,则可以使用“ backup notin(ignore)”选项。

还有一些选项可用于基于 cron 表达式创建备份计划。

要验证备份是否已完成,请使用 describe 命令,如下所示:

velero backup describe nginx-backup

kibana 备份还原es kubernetes备份_nginx_10

现在我们已经完成了备份操作,为了测试还原操作,我们将删除命名空间。

kibana 备份还原es kubernetes备份_kibana 备份还原es_11

验证是否删除了 nginx 服务和部署:

kibana 备份还原es kubernetes备份_kibana 备份还原es_12

通常需要几分钟才能完全清理名称空间。

步骤#5 Restore

要列出我们创建的备份,请使用以下命令:

velero restore get

kibana 备份还原es kubernetes备份_nginx_13

要恢复我们创建的备份,请使用以下命令:

velero restore create --from-backup nginx-backup

kibana 备份还原es kubernetes备份_nginx_14

还原完成后,您可以检查还原的部署是否返回名称空间:

kibana 备份还原es kubernetes备份_nginx_15

如果在还原操作过程中出现错误或警告,则可以使用以下命令检查详细信息:

velero restore describe <RESTORE_NAME>

恭喜! 我们已经成功进行了备份和还原。

如果由于某些限制而无法使用Velero,则可以始终使用 Kubectl CLI 从现有 Kubernetes 集群中导出资源定义,然后将其应用于目标集群。 

以下是导出对象的命令

kubectl get deployment -o=yaml --export > deployments.yaml

第四节 局限性

以下是Velero的已知限制:

  • Velero当前每个提供商都支持一套凭据。 尚无法在不同的位置使用不同的凭据。

  • 卷快照受提供程序创建快照位置限制。 例如,AWS和Azure不允许您在不同卷所在区域中创建卷快照。

  • 每个Velero备份每个卷都有一个BackupStorageLocation和一个VolumeSnapshotLocation。无法将单个 Velero 备份同时发送到多个备份存储位置,也不能将单个卷快照同时发送到多个位置。

  • 不支持跨提供商快照。