Kubernetes 集群备份是一大难点。虽然可以通过etcd来进行备份来实现K8S集群备份,但是这种备份很难恢复单个 Namespace。 对于K8s集群数据的备份和恢复,以及复制当前集群数据到其他集群等都非常方便。可以在两个集群间克隆应用和命名空间,来创建一个临时性的开发环境。

1、概述

Velero(以前称为Heptio Ark)可以为 提供了备份和还原Kubernetes集群资源和持久卷的能力,你可以在公有云或本地搭建的私有云环境安装Velero,可以为你提供以下能力:

  • 备份集群数据,并在集群故障的情况下进行还原;
  • 将集群资源迁移到其他集群;
  • 将 的生产集群复制到开发和测试集群;

Velero包含:

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

2、Velero工作原理

每个Velero的操作(如按需备份,计划备份,还原)都是自定义资源,使用Kubernetes 自定义资源定义(CRD)定义并存储在 etcd中,Velero还包括处理自定义资源以执行备份,还原以及所有相关操作的控制器,可以备份或还原群集中的所有对象,也可以按类型,命名空间或标签过滤对象。

Velero是kubernetes用来灾难恢复的理想选择,也是在集群上执行系统操作(如升级)之前对应用程序状态进行快照的理想选择。

2.1 按需备份

该备份操作:

将复制的Kubernetes对象的压缩文件上传到云对象存储中。

调用云提供程序API以创建持久卷的磁盘快照(如果指定)。

可以选择指定在备份期间执行的备份挂钩。例如, 可能需要在拍摄快照之前告诉数据库将其内存中的缓冲区刷新到磁盘。

请注意,集群备份不是严格的原子备份,如果在备份时创建或编辑Kubernetes对象,则它们可能不包含在备份中,虽然捕获不一致信息的几率很低,但是有可能会发生这种现象。

2.2 定时备份

通过定时操作, 可以定期重复备份数据,第一次创建日程表时将执行第一次备份,随后的备份将按日程表的指定间隔进行,这些间隔由Cron表达式指定。

定时备份保存的名称-,其中被格式化为YYYYMMDDhhmmss。

[

](https://blog.csdn.net/weixin_42143049/article/details/115757747)

2.3 备份还原

通过还原操作, 可以从以前创建的备份中还原所有对象和持久卷, 还可以仅还原对象和持久卷的过滤子集,Velero支持多个命名空间重新映射。例如,在一次还原操作中,可以在命名空间“ def”下重新创建命名空间“ abc”中的对象,或在“ 456”之下重新创建名称空间“ 123”中的对象。

还原的默认名称为-格式为YYYYMMDDhhmmss, 还可以指定自定义名称,恢复的对象还包括带有键velero.io/restore-name和值的标签

默认情况下,备份存储位置以读写模式创建。但是,在还原期间, 可以将备份存储位置配置为只读模式,这将禁用该存储位置的备份创建和删除,这对于确保在还原方案期间不会无意间创建或删除任何备份非常有用。

可以选择指定在还原期间或还原资源后执行的还原钩子。例如, 可能需要在数据库应用程序容器启动之前执行自定义数据库还原操作。

2.4 备份工作流程

运行时velero backup create test-backup

  1. Velero客户端调用Kubernetes API服务器以创建Backup对象;
  2. 该BackupController将收到通知有新的Backup对象被创建并执行验证;
  3. BackupController开始备份过程,它通过查询API服务器以获取资源来收集数据以进行备份;
  4. BackupController将调用对象存储服务,例如,AWS S3 -上传备份文件。

默认情况下,velero backup create支持任何持久卷的磁盘快照, 可以通过指定其他标志来调整快照,运行velero backup create —help可以查看可用的标志,可以使用—snapshot-volumes=false选项禁用快照。

0、Velero介绍 - 图1

2.5 备份的API版本

Velero使用Kubernetes API服务器的首选版本为group/resource备份资源,还原资源时,目标集群中必须存在相同的API group/vesion,以便还原成功。

例如,如果集群正在备份thingsAPI组下的gizmos资源,该资源包括things/v1alpha1,things/v1beta1以及things/v1三个API版本,并且服务器的首选版本为things/v1,那么gizmos的备份数据将从things/v1API端点获取;从该集群还原备份时,目标集群必须具有things/v1端点才能将gizmos的备份数据还原。请注意,things/v1 并不需要为目标集群中的首选版本,它只需要存在。

2.6 设置备份过期时间

创建备份时,可以通过添加标志来指定TTL(生存时间)—ttl,如果Velero检测到有备份资源已过期,它将删除以下相应备份数据:

备份资源

来自云对象存储的备份文件

所有PersistentVolume快照

所有关联的还原

TTL标志使用户可以使用表格中以小时,分钟和秒为单位指定的值来指定备份保留期—ttl 24h0m0s。如果未指定,则将应用默认的TTL值30天

2.7 同步备份存储

Velero将对象存储视为资源标准的来源,它不断检查以确保始终存在正确的备份资源,如果存储桶中有格式正确的备份文件,但Kubernetes API中没有相应的备份资源,则Velero会将信息从对象存储同步到Kubernetes,这使还原功能可以在集群迁移方案中工作,在该方案中,新集群中不存在原始的备份对象。同样,如果备份对象存在于Kubernetes中,但不存在于对象存储中,则由于备份压缩包不再存在,它将从Kubernetes中删除。

[

](https://blog.csdn.net/weixin_42143049/article/details/115757747)

2.8 备份存储位置和卷快照位置

Velero有两个自定义资源BackupStorageLocation和VolumeSnapshotLocation,用于配置Velero备份及其关联的持久卷快照的存储位置。

BackupStorageLocation:定义为存储区,存储所有Velero数据的存储区中的前缀以及一组其他特定于提供程序的字段,后面部分会详细介绍该部分所包含的字段。

VolumeSnapshotLocation:完全由提供程序提供的特定的字段(例如AWS区域,Azure资源组,Portworx快照类型等)定义,后面部分会详细介绍该部分所包含的字段。

用户可以预先配置一个或多个可能的BackupStorageLocations对象,也可以预先配置一个或多个VolumeSnapshotLocations对象,并且可以在创建备份时选择应该存储备份和相关快照的位置。

此配置设计支持许多不同的用法,包括:

  • 在单个Velero备份中创建不止一种持久卷的快照。例如,在同时具有EBS卷和Portworx卷的集群中
  • 在不同地区将数据备份到不同的存储中
  • 对于支持它的卷提供程序(例如Portworx), 可以将一些快照存储在本地集群中,而将其他快照存储在云中

2.9 缺陷和注意事项

Velero对每个提供商仅支持一组凭据,如果后端存储使用同一提供者,则不可能在不同的位置使用不同的凭据;

卷快照仍然受提供商允许 创建快照的位置的限制,不支持跨公有云供应商备份带有卷的集群数据。例如,AWS和Azure不允许 在卷所在的区域中不同的可用区创建卷快照,如果 尝试使用卷快照位置(与集群卷所在的区域不同)来进行Velero备份,则备份将失败。

每个Velero备份都只能有一个BackupStorageLocation,VolumeSnapshotLocation,不可能(到目前为止)将单个Velero备份同时发送到多个备份存储位置,或者将单个卷快照同时发送到多个位置。但是,如果跨位置的备份冗余很重要,则始终可以设置多个计划的备份,这些备份仅在所使用的存储位置有所不同。

不支持跨提供商快照,如果 的集群具有多种类型的卷,例如EBS和Portworx,但VolumeSnapshotLocation仅配置了EBS,则Velero将仅对EBS卷进行快照。

恢复数据存储在主Velero存储桶的prefix/subdirectory下,并在备份创建时将BackupStorageLocationc存储到与用户选择的存储桶相对应的存储桶。

[

](https://blog.csdn.net/weixin_42143049/article/details/115757747)

2.10 使用用例

1)在单个Velero备份中创建不止一种持久卷的快照

创建快照存储位置
  1. velero snapshot-location create ebs-us-east-1 \
  2. --provider aws \
  3. --config region=us-east-1
  4. velero snapshot-location create portworx-cloud \
  5. --provider portworx \
  6. --config type=cloud
创建备份任务
  1. velero backup create full-cluster-backup \
  2. --volume-snapshot-locations ebs-us-east-1,portworx-cloud
由于在此示例中,为我们提供后端存储的的两个供应商(ebs-us-east-1forawsportworx-cloudfor portworx)各自仅配置了一个可能的卷快照位置,因此Velero在创建备份时也可以不明确指定它们:
  1. velero backup create full-cluster-backup

2)在不同的地区将备份存储到不同的对象存储桶中

创建备份存储位置

  1. velero backup-location create default \
  2. --provider aws \
  3. --bucket velero-backups \
  4. --config region=us-east-1
  5. velero backup-location create s3-alt-region \
  6. --provider aws \
  7. --bucket velero-backups-alt \
  8. --config region=us-west-1
创建备份任务
  1. # The Velero server will automatically store backups in the backup storage location named "default" if
  2. # one is not specified when creating the backup. You can alter which backup storage location is used
  3. # by default by setting the --default-backup-storage-location flag on the `velero server` command (run
  4. # by the Velero deployment) to the name of a different backup storage location.
  5. velero backup create full-cluster-backup
或者
  1. velero backup create full-cluster-alternate-location-backup \
  2. --storage-location s3-alt-region

3)对于公有云提供的存储卷,将一部分快照存储在本地,一部分存储在公有云

创建快照存储位置
  1. velero snapshot-location create portworx-local \
  2. --provider portworx \
  3. --config type=local
  4. velero snapshot-location create portworx-cloud \
  5. --provider portworx \
  6. --config type=cloud
创建备份
  1. # Note that since in this example you have two possible volume snapshot locations for the Portworx
  2. # provider, you need to explicitly specify which one to use when creating a backup. Alternately,
  3. # you can set the --default-volume-snapshot-locations flag on the `velero server` command (run by
  4. # the Velero deployment) to specify which location should be used for each provider by default, in
  5. # which case you don't need to specify it when creating a backup.
  6. velero backup create local-snapshot-backup \
  7. --volume-snapshot-locations portworx-local

或者

  1. velero backup create cloud-snapshot-backup \
  2. --volume-snapshot-locations portworx-cloud

4)使用存储位置

创建存储位置
  1. velero backup-location create default \
  2. --provider aws \
  3. --bucket velero-backups \
  4. --config region=us-west-1
  5. velero snapshot-location create ebs-us-west-1 \
  6. --provider aws \
  7. --config region=us-west-1
创建备份任务
  1. # Velero will automatically use your configured backup storage location and volume snapshot location.
  2. # Nothing needs to be specified when creating a backup.
  3. velero backup create full-cluster-backup