在 TKE 中使用 Velero 迁移复制集群资源

概述

Velero(之前称为Heptio Ark)是一个开源工具,能够安全地备份和还原,执行灾难恢复以及迁移 Kubernetes 群集资源和持久卷,能够在 TKE 集群或自建 Kubernetes 集群中部署 Velero 用于:数据库

  • 备份集群并在丢失的状况下进行还原。
  • 将集群资源迁移到其余集群。
  • 将生产集群复制到开发和测试集群。

更多关于 Velero 介绍,请参阅 Velero 官网,本文将介绍使用 Velero 实现 TKE 集群间的无缝迁移复制集群资源的操做步骤。后端

迁移原理

在须要被迁移的集群和目标集群上都安装 Velero 实例,而且两个集群的 Velero 实例指向相同的腾讯云 COS 对象存储位置,使用 Velero 在须要被迁移的集群执行备份操做生成备份数据存储到腾讯云 COS ,而后在目标集群上使用 Velero 执行数据的还原操做实现迁移,迁移原理以下:安全

img

前提条件

  • 注册腾讯云帐户
  • 已开通腾讯云 COS 服务。
  • 已有须要被迁移的 TKE 集群(如下称做集群 A),已建立迁移目标的 TKE 集群(如下称做集群 B),建立 TKE 集群请参阅 建立集群
  • 集群 A 和 集群 B 都须要安装 Velero 实例(1.5版本以上),而且共用同一个腾讯云 COS 存储桶做为 Velero 后端存储,安装步骤请参阅 配置存储和安装 Velero

注意事项

  1. 从 1.5 版本开始,Velero 可使用 Restic 备份全部pod卷,而没必要单独注释每一个 pod。默认状况下,此功能容许用户使用 restic 备份全部 pod 卷,但如下卷状况除外:ide

    • 挂载默认 Service Account Secret 的卷
    • 挂载的 hostPath 类型卷
    • 挂载 Kubernetes secretsconfigmaps 的卷

    本示例须要 Velero 1.5 以上版本且启用 restic 来备份持久卷数据,请确保在安装 Velero 阶段开启 --use-restic--default-volumes-to-restic 参数,安装步骤请参阅 配置存储和安装 Velero 工具

  2. 在执行迁移过程当中,请不要对两边集群资源作任何 CRUD 操做,以避免在迁移过程当中形成数据差别,最终致使迁移后的数据不一致。测试

  3. 尽可能保证集群 B 和集群 A 工做节点的CPU、内存等规格配置相同或不要相差太大,以避免出现迁移后的 Pods 因资源缘由没法调度致使 Pending 的状况。

操做步骤

在集群 A 建立备份

能够手动执行备份操做,也能够给 velero 设置按期自动备份,设置方法可使用 velero schedule -h 查看。本示例将以 default 、default2 命名空间的资源状况做比较验证,下图能够看到集群 A 中两个命名空间下的 Pods 和 PVC 资源状况:spa

提示:能够指定在备份期间执行一些自定义 Hook 操做。好比,须要在备份以前将运行应用程序的内存中的数据持久化到磁盘。 有关备份 Hook 的更多信息请参阅 备份 Hook 3d

img

其中,集群中的 minio 对象存储服务使用了持久卷,而且已经上传了一些图片数据,以下图所示:rest

img

执行下面命令来备份集群中不包含 velero 命名空间(velero 安装的默认命名空间)资源的其余全部资源,若是想自定义须要备份的集群资源范围,可以使用 velero create backup -h 查看支持的资源筛选参数。日志

velero backup create <BACKUP-NAME> --exclude-namespaces <NAMESPACE>

本示例咱们建立一个 “default-all” 的集群备份,备份过程以下图所示:

img

备份任务状态显示是 “Completed” 时,说明备份任务完成,能够经过 velero backup logs | grep error 命令检查是否有备份操做发生错误,没有输出则说明备份过程无错误发生,以下图所示:

注意:请确保备份过程未发生任何错误,假如 velero 在执行备份过程当中发生错误,请排查解决后从新执行备份。

img

备份完成后,临时将备份存储位置更新为只读模式(非必须,这能够防止在还原过程当中 Velero 在备份存储位置中建立或删除备份对象):

kubectl patch backupstoragelocation default --namespace velero \
    --type merge \
    --patch '{"spec":{"accessMode":"ReadOnly"}}'

在集群 B 执行还原

在执行还原操做前集群 B 中 default 、default2 命名空间下没有任何工做负载资源,查看结果以下图:

img

临时将集群 B 中 Velero 备份存储位置也更新为只读模式(非必须,这能够防止在还原过程当中 Velero 在备份存储位置中建立或删除备份对象):

kubectl patch backupstoragelocation default --namespace velero \
    --type merge \
    --patch '{"spec":{"accessMode":"ReadOnly"}}'

提示:能够选择指定在还原期间或还原资源后执行自定义 Hook 操做。例如,可能须要在数据库应用程序容器启动以前执行自定义数据库还原操做。 有关还原 Hook 的更多信息请参阅 还原 Hook

在还原操做以前,需确保集群 B 中 的 Velero 资源与云存储中的备份文件同步。默认同步间隔是1分钟,可使用--backup-sync-period 来配置同步间隔。可使用下面命令查看集群 A 的备份是否已同步:

velero backup get <BACKUP-NAME>

获取备份成功检查无误后,执行下面命令还原全部内容到集群 B 中:

velero restore create --from-backup <BACKUP-NAME>

本示例执行还原过程以下图:

img

等待还原任务完成后查看还原日志, 可使用下面命令查看还原是否有报错和跳过信息:

# 查看迁移时是否有错误的还原信息
velero restore logs <BACKUP-NAME> | grep error 

# 查看迁移时跳过的还原操做
velero restore logs <BACKUP-NAME> | grep skip

从下图能够看出没有发生错误的还原步骤,可是有不少 “skipped” 步骤,是由于咱们在备份集群资源时备份了不包含 velero 命名空间的全部集群资源,有一些同类型同名的集群资源已经存在了,如 kube-system下的集群资源,当还原过程当中有资源冲突时,velero 会跳过还原的操做步骤。因此实际上还原过程是正常的,能够忽略这些 “skipped” 日志,假若有特殊状况能够分析下日志看看。

img

迁移结果核验

查看校验集群 B 执行迁移操做后的集群资源,能够看到 default 、default2 命名空间下的 pods 和 PVC 资源已按预期迁移成功:

img

再经过 Web 管理页面登陆集群 B 中的 monio 服务,能够看到 minio 服务中的图片数据没有丢失,说明持久卷数据也已按预期迁移成功。

img

至此,咱们完成了 TKE 集群间资源的迁移,迁移操做完成后,请不要忘记把备份存储位置恢复为读写模式(集群 A 和 集群B),以便下次备份任务能够成功使用:

kubectl patch backupstoragelocation default --namespace velero \
   --type merge \
   --patch '{"spec":{"accessMode":"ReadWrite"}}'

总结

本文主要介绍了在 TKE 集群间使用 Velero 迁移集群资源的原理、注意事项和操做方法,成功的将示例集群 A 中的集群资源无缝迁移到集群 B 中,整个迁移过程很是简单方便,是一种很是友好的集群资源迁移方案。

相关文章
相关标签/搜索