Velero迁移k8s集群数据
1、前提条件
原始自建集群Kubernetes版本需1.10及以上,且集群可正常使用DNS与互联网服务。 若您使用OBS存放备份文件,需已有OBS操作权限用户的AK/SK,请参考获取访问密钥(AK/SK)。 若您使用MinIO存放备份文件,则安装MinIO的服务器需要绑定EIP并在安全组中开放MinIO的API端口和Console端口。 已创建迁移的目标CCE集群。 原集群和目标集群中需要至少各拥有一个空闲节点,节点规格建议为4U8G及以上。 存储 本次存储使用华为云OBS存储(可以自建minio存储)
2、安装Velero
1)下载Velero 1.9.0版本的二进制文件
$ wget https://github.com/vmware-tanzu/velero/releases/download/v1.9.0/velero-v1.9.0-linux-amd64.tar.gz
2)安装Velero客户端
$ tar -xvf velero-v1.9.0-linux-amd64.tar.gz
$ cp ./velero-v1.9.0-linux-amd64/velero /usr/local/bin
3)创建备份对象存储访问密钥文件credentials-velero
文件内容如下,其中的AK/SK请根据实际情况进行替换。使用OBS时,可参考获取访问密钥(AK/SK)获取AK/SK。如使用MinIO,此处AK/SK则为创建minio中所创建的用户名及密码。
$ vim credentials-velero
[default]
aws_access_key_id = **** # obs访问ID
aws_secret_access_key = **** # obs秘钥
4)部署Velero服务端。注意其中--bucket参数需要修改为已创建的对象存储桶名称,本例中为velero
$ velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.5.0 \
--bucket velero-cluster-backup \
--secret-file ./credentials-velero \
--use-restic \
--default-volumes-to-restic \
--use-volume-snapshots=false \
--backup-location-config region=****,s3ForcePathStyle="true",s3Url=http://****
安装参数
--provider 声明使用“aws”提供的插件类型。
--plugins 使用AWS S3兼容的API组件,本文使用的OBS和MinIO对象存储均支持该S3协议。
--bucket 用于存放备份文件的对象存储桶名称,需提前创建。
--secret-file 访问对象存储的密钥文件,即3中创建的“credentials-velero”文件。
--use-restic 使用Restic工具支持PV数据备份,建议开启,否则将无法备份存储卷资源。
--use-volume-snapshots 是否创建 VolumeSnapshotLocation 对象进行PV快照,需要提供快照程序支持。该值设为false。
--backup-location-config 对象存储桶相关配置,包括region、s3ForcePathStyle、s3Url等。
region 对象存储桶所在区域。
OBS:请根据实际区域填写,如“cn-north-4”。
MinIO:参数值为minio。
s3ForcePathStyle 参数值为“true”,表示使用S3文件路径格式。
s3Url 对象存储桶的API访问地址。
OBS:该参数值需根据对象存储桶地域决定,参数值为“http://obs.{region}.myhuaweicloud.com”。例如区域为北京四(cn-north-4),则参数值为“http://obs.cn-north-4.myhuaweicloud.com”。
MinIO:该参数值需根据MinIO安装节点的IP及暴露端口确定,参数值为“http://{minio所在节点的eip}:9000”。
说明:
s3Url中的访问端口需填写MinIO的API端口,而非console端口。MinIO API端口默认为9000。
访问集群外安装的MinIO时,需填写其公网IP地址。
5)Velero实例将默认创建一个名为velero的namespace,执行以下命令可查看pod状态
$ kubectl get pod -n velero
NAME READY STATUS RESTARTS AGE
restic-rn29c 1/1 Running 0 16s
velero-c9ddd56-tkzpk 1/1 Running 0 16s
6)查看Velero工具与对象存储的对接情况,状态需要为available
$ velero backup-location get
NAME PROVIDER BUCKET/PREFIX PHASE LAST VALIDATED ACCESS MODE DEFAULT
default aws velero Available 2021-10-22 15:21:12 +0800 CST ReadWrite true
3、集群内资源迁移
1)对应用进行备份 备份prod-efssc名称空间下的mysql
$ velero backup create prod-efssc-namespace-backup-202212291315 --include-namespaces prod-efssc --default-volumes-to-restic
# 查看备份详细信息
$ velero backup describe prod-efssc-namespace-backup-202212291315
# 查看备份日志
$ velero backup logs prod-efssc-namespace-backup-202212291315
# 解释
prod-efssc-namespace-backup-202212291315:备份数据名称
--include-namespaces prod-efssc:备份数据名称空间
--default-volumes-to-restic:表示使用Restic工具对Pod挂载的所有存储卷进行备份
--default-volumes-to-restic:表示使用Restic工具对Pod挂载的所有存储卷进行备份,不支持HostPath类型的存储卷。如不指定该参数,将默认对1中annotation指定的存储卷进行备份。此参数仅在安装Velero时指定“--use-restic”后可用。
velero backup create <backup-name> --default-volumes-to-restic
--include-namespaces:用于指定namespace下的资源进行备份。
velero backup create <backup-name> --include-namespaces <namespace>
--include-resources:用于指定资源进行备份。
velero backup create <backup-name> --include-resources deployments
--selector:用于指定与selector相匹配的资源备份。
velero backup create <backup-name> --selector <key>=<value>
本文指定default命名空间下的资源进行备份,wordpress-backup为备份名称,进行应用恢复时也需指定相同的备份名称。示例如下:
velero backup create wordpress-backup --include-namespaces default --default-volumes-to-restic
回显如下,表示成功创建备份任务:
Backup request "wordpress-backup" submitted successfully. Run `velero backup d
2)查看备份情况
$ velero backup get
4、目标集群应用恢复
1)在新集群安装velero
# 安装方法同2、安装Velero
# 备份数据
$ velero backup get
2)在CCE集群中创建如下所示的ConfigMap,将原集群使用的StorageClass映射到CCE集群默认的StorageClass
# 新集群和老集群StorageClass名称不一致,需要在还原之前修改StorageClass
$ vim change-storage-class.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: change-storageclass-plugin-config
namespace: velero
labels:
app.kubernetes.io/name: velero
velero.io/plugin-config: "true"
velero.io/change-storage-class: RestoreItemAction
data:
managed-nfs-storage: ceph-rbd
# managed-nfs-storage: 老StorageClass名称
# ceph-rbd: 新StorageClass名称
3)执行以下命令,应用上述的 ConfigMap 配置
$ kubectl apply -f change-storage-class.yaml
4)还原备份
# 备份还原
$ velero restore create --from-backup prod-efssc-namespace-backup-202212291315
# 查看还原详细信息
$ velero restore describe prod-efssc-namespace-backup-202212291315
# 查看还原日志
$ velero restore logs prod-efssc-namespace-backup-202212291315
5、删除 velero 服务
安装失败或者从新安装执行 清理删除 velero 服务(如需删除重新安装时使用)
# 删除 velero 名称空间下的资源
$ kubectl delete namespace/velero clusterrolebinding/velero
# 删除crds
$ kubectl delete crds -l component=velero
6、velero设置定时备份任务
# 设置定时任务,每1小时备份一次,生命周期3小时
$ velero create schedule prod-efssc-`date +"%Y%m%d%H%M"` \
--include-namespaces prod-efssc \
--default-volumes-to-restic \
--schedule="@every 1h" \
--ttl 3h0m0s
# 设置定时任务,每天凌晨0点备份,备份保存时长48小时
$ velero create schedule prod-efssc-`date +"%Y%m%d%H%M"` \
--include-namespaces prod-efssc \
--default-volumes-to-restic \
--schedule="0 0 * * *" \
--ttl 48h0m0s
7、velero常用命令
#备份查看
velero get backup
#查看定时备份
velero get schedule
#查看已有的恢复
velero get restore
#查看插件
velero get plugins
#备份 namespace
velero backup create NAMESPACE-backup --include-namespaces NAMESPACE
##查看备份
velero backup describe NAMESPACE-backup .
#指定对应的备份名称
velero restore create --from-backup test-backup
# 每日1点进行备份
velero create schedule <SCHEDULE NAME> --schedule="0 1 * * *"
# 每日1点进行备份,备份保留72小时
velero create schedule <SCHEDULE NAME> --schedule="0 1 * * *" --ttl 72h
# 每5小时进行一次备份
velero create schedule <SCHEDULE NAME> --schedule="@every 5h"
# 每日对 指定 namespace 进行一次备份 (如panshi-qtc-dev)
velero create schedule <SCHEDULE NAME> --schedule="@every 24h" --include-namespaces panshi-qtc-dev
#恢复
velero restore create --from-backup pvc-backup --restore-volumes
8、velero连接minio存储
1)安装minio(参考笔记)
2)创建minio连接认证文件
$ vim credentials-velero
[default]
aws_access_key_id = ****
aws_secret_access_key = ****
3)安装velero
$ velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.5.0 \
--bucket velero-backup \
--secret-file ./credentials-velero \
--use-restic \
--default-volumes-to-restic \
--use-volume-snapshots=false \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://****:9000
# --bucket velero-backup minio桶名称
# --secret-file ./credentials-velero minio认证文件
4)备份操作 备份标签是 app.kubernetes.io/instance=mysql 的pod
$ velero backup create mysql-backup-`date +"%Y%m%d%H%M"` --selector app.kubernetes.io/instance=mysql --default-volumes-to-restic
5)备份还原
$ velero restore create --from-backup
参考文档: https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_0310.html https://velero.io/docs/v1.7/customize-installation/
软件下载地址: https://github.com/vmware-tanzu/velero/releases/tag/v1.9.0