Velero(以前称为 Heptio Ark)是一个开源工具,可以安全地备份和还原,执行灾难恢复以及迁移 Kubernetes 集群资源和持久卷。 Velero可以部署在自建Kubernetes集群或者公有云托管的K8S环境中,比如QKE(Kubesphere)。 Velero 可用于:
- 备份集群资源
- 并在丢失的情况下进行还原。
- 将集群资源迁移到其他集群。
- 将生产集群资源复制到开发和测试集群。
Velero的两种备份方式:
- 用restic方式备份,它是文件系统级别备份持久卷数据并将其发送到 Velero 的对象存储。执行速度取决于本地IO能力,网络贷款和对象存储性能,相对快照方式备份慢。 但如果当前集群或者存储出现问题,由于所有资源和数据都存储在远端的对象存储上, 用restic方式备份可以很容易的将应用恢复。
- 用快照方式备份, Velero使用一组 BackupItemAction 插件针对 PersistentVolumeClaims 进行备份。执行速度快。它创建一个以 PersistentVolumeClaim 作为源的 VolumeSnapshot 对象. 此 VolumeSnapshot 对象与用作源的 PersistentVolumeClaim 位于同一命名空间中。与VolumeSnapshot对应的 VolumeSnapshotContent 对象是一个集群范围的资源,将指向存储系统中基于磁盘的实际快照。Velero 备份时将所有 VolumeSnapshots 和 VolumeSnapshotContents 对象上传到对象存储系统, 但是Velero 备份后的数据资源仍然保存在集群的存储上。数据可用性依赖于本地存储的高可用性,因为如果是由于存储故障导致的应用问题,Velero的快照备份机制并不能恢复应用数据。
本文将针对velero 快照备份的限制,手动将备份的应用和数据到AWS兼容的S3对象存储,比如私有环境下的minio或者公有云上青云的QingStor等等,这里以QingStor为例。
本次实验将在Kubesphere集群的wordpress项目(命名空间)中部署一个wordpress的应用,先使用 Velero快照方式备份这个命名空间下的应用和数据到QingStor,手动将数据资源从主存储导出到QingStor,然后模拟主存储失效,从QingStor恢复数据资源和应用到另一个集群。下面是具体的实验步骤:
实验环境和前提条件:
安装Velero 开源工具,配置好对应的对象存储。 基于rook-ceph创建wordpress命名空间,并且运行wordpress和mysql应用
root$ kubectl -n wordpress get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pv-claim Bound pvc-8a3b3541-1718-4af5-94fc-e24ebe026172 10Gi RWO rook-ceph-block 47m
wp-pv-claim Bound pvc-355352e5-0ecf-4b40-9056-5514015eb392 2Gi RWO rook-ceph-block 47m
root$ kubectl -n wordpress get pods
NAME READY STATUS RESTARTS AGE
wordpress-589f976cd5-4ns55 1/1 Running 0 45m
wordpress-mysql-d9b8d8884-2kmtb 1/1 Running 0 45m
备份数据
- 为了证明数据能够恢复,首先在wordpress上发布一篇新的文章,等整个备份恢复流程后再检验文章是否已经被恢复。
<img src="https://gitee.com/jibutech/tech-docs/raw/master/images/wordpress-demo.png" style="zoom:50%;" />
- 使用Velero对workpress项目做一个快照备份。我们在可以Velero运行的命名空间velero下创建一个Velero备份时所使用的CR。
# wp-snap-manual.yaml
apiVersion: velero.io/v1
kind: Backup
metadata:
annotations:
velero.io/source-cluster-k8s-gitversion: v1.19.5
velero.io/source-cluster-k8s-major-version: "1"
velero.io/source-cluster-k8s-minor-version: "19"
namespace: velero
name: wp-snap-manual
spec:
defaultVolumesToRestic: false
hooks: {}
snapshotVolumes: true
includedNamespaces:
- wordpress
storageLocation: qingstor-vbbf8
volumeSnapshotLocations:
- qingstor-bd0a9b2b-7add-4b97-ba26-d8182d1a2d8e
ttl: 2h0m0s
创建一个backups.velero.io CR
root$ kubectl apply -f wp-snap-manual.yaml
backup.velero.io/wp-snap-manual created
可以查看到wordpress 命名空间下生成的volumesnapshot资源,并查看对应的volumesnapshotcontent信息
root$ kubectl -n wordpress get volumesnapshot
NAME AGE
velero-mysql-pv-claim-hmt