使用 Velero 备份和恢复 Harbor

备份和恢复对于灾难恢复和数据迁移场景至关重要。借助像 Velero 这样的工具,您可以备份和恢复您的 Harbor 实例,并在发生灾难时避免服务中断。 Velero 是一个开源工具,您可以使用它来安全地备份和恢复、执行灾难恢复以及迁移 Kubernetes 集群资源和持久卷。

以下教程展示了如何使用 Velero 备份和恢复使用 Harbor Helm chart 部署在 Kubernetes 集群中的 Harbor 实例。 有关 Velero 工作原理 的更多详细信息,请参阅此处。

本教程仅备份 Harbor 资源和数据的一个子集,包括所有 Harbor 相关的 Kubernetes 资源(Deployments、StatefulSets、Services、ConfigMaps 等)以及 Harbor 内部数据库、registry、chartmuseum、jobservice 和 Trivy 的持久卷中的数据。

Harbor 的 Redis 数据不会被备份,有关 Harbor 实例潜在影响的更多详细信息,请参阅 局限性 部分。

本教程中进行的备份是崩溃一致性的,而不是应用程序一致性的。 这意味着恢复后会丢失一些数据,有关更多信息,请参阅 局限性 部分。

安装 Velero

根据 Velero 官方文档 安装 Velero CLI 和服务器。

根据您数据的大小,您可能需要增加 Velero 可用的 CPU 或内存资源。 有关更多信息,请参阅 文档

备份 Harbor 实例

将 Harbor 设置为只读

  1. 使用具有 Harbor 系统管理员权限的帐户登录到 Harbor 门户。

  2. 展开 管理,然后选择 配置

  3. 选择 系统设置 选项卡。

    Set read only

  4. 选中 仓库只读 复选框,然后单击 保存 按钮以保存配置。

标记资源以从备份中排除 Redis 数据

为了在备份中排除 Redis 的卷,我们需要使用特定标签标记 Redis pod、PVC 和 PV

# label the Pod of Redis, replace the namespace and Pod name with yours
kubectl -n harbor label pod/harbor-redis-0 velero.io/exclude-from-backup=true
# label the PVC of Redis, replace the namespace and PVC name with yours
kubectl -n harbor label pvc/data-harbor-redis-0 velero.io/exclude-from-backup=true
# label the PV of Redis, replace the namespace and PVC name with yours
kubectl label pv/$(kubectl -n harbor get pvc data-harbor-redis-0 --template={{.spec.volumeName}}) velero.io/exclude-from-backup=true

备份 Harbor 实例

根据 Harbor 部署平台的性能,您可以选择使用快照或文件系统备份来备份持久卷

  • 快照
    根据 Velero 的安装方式,您可以使用 CSI 快照带有数据移动的 CSI 快照原生快照 来备份持久卷

    1. 使用 CSI 快照或原生快照备份 Harbor
      # replace the namespace and backup name with yours
      velero backup create harbor-backup --include-namespaces harbor --snapshot-volumes --wait
      
    2. 使用带有数据移动的 CSI 快照备份 Harbor
      # replace the namespace and backup name with yours
      velero backup create harbor-backup --include-namespaces harbor --snapshot-volumes --snapshot-move-data --wait
      
  • 文件系统备份
    在使用文件系统备份之前,您应该查看 Velero 文件系统备份 页面,尤其要了解 局限性

    1. 备份 Harbor
      # replace the namespace and backup name with yours
      velero backup create harbor-backup --include-namespaces harbor --default-volumes-to-fs-backup --wait
      

取消只读

按照 将 Harbor 设置为只读 中的相同步骤,取消选中 仓库只读 复选框,然后单击 保存 按钮以保存配置。

恢复 Harbor 实例

从备份恢复

# replace the backup and restore names with yours
velero restore create harbor-restore --from-backup harbor-backup --wait

取消只读

由于我们在进行备份时将 Harbor 设置为只读,因此实例在恢复后仍处于只读模式,请按照 取消只读 取消只读。

故障排除

如果您在备份或恢复时遇到任何问题,请参阅 Velero 的 故障排除 文档。

局限性

  • 上传清除过程可能会导致备份失败
    默认情况下,清除过程在 registry pod 中启动,它会定期删除上传目录下的未使用文件,并且无法在不重启的情况下停用。 当使用 Restic 时,这可能会影响备份并导致失败。
    最好增加清除操作的 间隔(默认值为 168 小时),并在两轮清除操作的中间进行备份,以避免文件被删除。
  • 内存中的数据在备份期间丢失
    Harbor 将仓库拉取和镜像拉取时间存储在内存中,并定期将它们同步到 Harbor 的数据库中。 这意味着在您进行备份时,任何未同步到数据库的数据都会丢失。 这种数据丢失对您恢复的 Harbor 实例的影响应该很小。
  • 任务在恢复后可能挂起在进行中状态
    Harbor 任务(例如复制、垃圾回收或安全扫描)在恢复后可能会挂起在进行中状态。 您可以在门户上手动停止它们。
  • 已登录用户的会话将在恢复后丢失
    由于我们不备份 Redis 的持久卷,因此已登录用户的会话将在恢复后丢失。
  • 不支持外部数据库的备份
    仅支持 Harbor 内部数据库的备份。