1、介绍
:::warning
官方文档:https://velero.io/docs/v1.4/ 基本工作原理:不管需求是实现什么,比如:集群迁移、恢复、备份,其核心都是通过velero client CLI创建一个backup,然后迁移和恢复等操作都是需要这个backup来完成的。
:::
创建一个backup流程,<font style="color:rgb(21, 167, 167);">velero backup create test-backup</font>:

- Velero client 调用Kubernetes API服务器以创建Backup。
- BackupController检测到新的backup,并验证。
- BackupController开始backup,通过请求ApiServer获取资源来收集数据以进行备份。
- BackupController将要备份的数据上传到一个对象存储服务器,如AMS S3。
- 默认情况下,velero backup create会生产每一个PV的磁盘快照。您可以通过指定其他参数来调整快照。运行velero backup create —help以查看可用的参数。可以使用选项禁用快照—snapshot-volumes=false。
2、Velero常用命令
1. 备份Backup
<font style="color:rgb(21, 167, 167);">velero backup get</font> :查看已备份的
<font style="color:rgb(21, 167, 167);">velero backup create <backupname></font>:创建一个backup包含所有资源
<font style="color:rgb(21, 167, 167);">velero backup create <backupname> --include-namespaces ns1,ns2</font>:为ns1,ns2命名空间下的资源备份
<font style="color:rgb(21, 167, 167);">velero backup create <backupname> --exclude-namespaces ns1,ns2</font>:排除掉ns1,ns2的命名空间,创建备份
<font style="color:rgb(21, 167, 167);">velero backup create <backupname> --include-resources resource1,resource2</font>:为指定资源备份
<font style="color:rgb(21, 167, 167);">velero backup create --exclude-resources resource1,resource2</font>:不备份指定资源
<font style="color:rgb(21, 167, 167);">--storage-location <localpath></font>:将创建的备份保存到本地路径下
<font style="color:rgb(21, 167, 167);">-l, --selector</font>:通过指定label来匹配要back up的资源
2. 恢复Restore
<font style="color:rgb(21, 167, 167);">velero restore get</font>:查看已经restore的资源
<font style="color:rgb(21, 167, 167);">vel ero restore create restore-1 --from-backup backup-1</font>:从backup-1恢复
<font style="color:rgb(21, 167, 167);">velero restore create --from-backup backup-2 --include-resources persistentvolumeclaims,persistentvolumes</font>:仅恢复指定资源,同样使用—exclude-resources:不恢复某资源
<font style="color:rgb(21, 167, 167);">velero restore create --from-schedule schedule-1</font>:从创建的schedule恢复
3. Schedule定时备份
Schedule是针对backup的,是独立于backup之外的一种资源,但他本身也是一个backup只不过是具有了定时的功能,符合Cron规则。<font style="color:rgb(21, 167, 167);">velero create schedule NAME --schedule="0 */6 * * *"</font>:每6小时自动备份一次
<font style="color:rgb(21, 167, 167);">velero create schedule NAME --schedule="@every 24h" --include-namespaces web</font>:因为schedule也是一种backup,所以创建backup指定的参数这里也都可以使用
- 对集群进行备份并在丢失的情况下进行恢复。
- 将集群资源迁移到其他集群。
- 将生产集群复制到开发和测试集群。
- 在集群上运行的服务端
- 本地的CLI客户端
3、安装minio对象存储服务器
:::warning
Velero支持的storage providers:https://velero.io/docs/v1.4/supported-providers/ 这里使用本地安装的对象存储服务器,Minio 安装的Minio需要能被两个集群(集群迁移,一个到另外一个),都能访问到。 minio也可以安装在k8s集群内:戳这里参考 ::: > 若需要在不同kubernetes和存储池集群备份与恢复数据,需要将minio服务端安装在kubernetes集群外,保证在集群发生灾难性故障时,不会对备份数据产生影响,以下为通过二进制的方式在kubernetes集群外安装minio: > > 在待安装minio的服务器上下载二进制包 >plain
wget https://dl.minio.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/
# 查看版本信息
minio --version
> 准备对象存储的磁盘,在此跳过此步骤
>
> 使用systemd管理Minio服务,对于使用systemd init系统运行系统的人,请创建用于运行Minio服务的用户和组:
>
plain
sudo groupadd --system minio
sudo useradd -s /sbin/nologin --system -g minio minio
为/data(上述步骤准备好的磁盘挂载位置)目录提供minio用户所有权:
为Minio创建systemd服务单元文件:
sudo chown -R minio:minio /data/minio
创建Minio环境文件/etc/default/minio:
vim /etc/systemd/system/minio.service[Unit]Description=MinioDocumentation=https://docs.minio.ioWants=network-online.targetAfter=network-online.targetAssertFileIsExecutable=/usr/local/bin/minio[Service]WorkingDirectory=/data/minioUser=minioGroup=minioEnvironmentFile=-/etc/default/minioExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES# Let systemd restart this service alwaysRestart=always# Specifies the maximum file descriptor number that can be opened by this processLimitNOFILE=65536# Disable timeout logic and wait until process is stoppedTimeoutStopSec=infinitySendSIGKILL=no[Install]WantedBy=multi-user.target
# Volume to be used for Minio server.MINIO_VOLUMES="/data/minio"# Use if you want to run Minio on a custom port.MINIO_OPTS="--address :9000"# Access Key of the server.MINIO_ACCESS_KEY=minio# Secret key of the server.MINIO_SECRET_KEY=minio123
- MINIO_ACCESS_KEY:长度至少为3个字符的访问密钥;
- MINIO_SECRET_KEY:最少8个字符的密钥。
sudo systemctl daemon-reloadsudo systemctl start miniosudo systemctl status minio
4、安装Velero
1. 下载包
:::warning
Velero Client就是命令行工具,安装版本应该是v1.3.0, or later。 官方提供了多种安装方式:https://velero.io/docs/master/basic-install/ ::: > 复制当前目录下的velero文件至/usr/sbin/目录下,velero是velero的二进制客户端; >plain
# https://github.com/vmware-tanzu/velero/
tar xf velero-v1.9.2-linux-amd64.tar.gz
cp velero-v1.9.2-linux-amd64/velero /usr/local/bin/
加载shell自动完成功能,方便使用
plain
velero completion bash
## 2. 部署服务
### 1)创建Buckets(桶)
:::warning
minio安装在集群外时,需手动创建名为velero的桶,可访问minioIp:port(192.168.6.20:9000),通过web页面创建velero存储桶。
再按照minio安装在进群内的方式安装velero服务端,等待pod成功运行
:::
2)安装velero服务
在本地目录中创建 Velero 特定的凭据文件credentials-velero,内容如下:
[default]aws_access_key_id = minioaws_secret_access_key = minio123
部署velero
# 执行如下命令进行velero程序部署:$ velero install \--provider aws \--image velero/velero:v1.9.2 \--plugins velero/velero-plugin-for-aws:v1.5.0 \--bucket velero \--namespace velero \--secret-file ./credentials-velero \--use-volume-snapshots=false \--use-restic \--default-volumes-to-restic \--kubeconfig /root/.kube/config \--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.6.20:9000# 运行结果如下....DaemonSet/restic: createdVelero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.
检查是否成功参数说明:
—provider:供应商
—plugins:插件
—bucket velero:指定存储桶
—namespace velero:命名空间
–secret-file:指定认证文件 ;
–use-volume-snapshots=false:禁用快照备份功能;
–use-restic:启用静态备份;
–default-volumes-to-restic:备份所有 pod 卷而不必在 pod 上应用注释;
–kubeconfig /root/.kube/config :指定k8s集群配置文件;
s3Url=http:这里是刚才部署minio存储的api接口,可以通过mino容器查看。
-feature-gates:解决了已知问题到此velero部署完成,注意替换
.
- s3Url=http:port 更具实际的minio端口进行绑定(我这里是自动生成的port,建议NodePort类型配置指定端口)
# 查看是否创建成功kubectl get pod -nvelero -wNAME READY STATUS RESTARTS AGErestic-jx8kc 1/1 Running 0 7m7svelero-7cfc49d689-wb2v2 1/1 Running 0 7m7s# 查看日志kubectl logs deployment/velero -n velero
可以看到相关服务已经正常运行,Job 任务正常完成退出,大量 CRD 被创建。
3)卸载
velero uninstall --namespace velerokubectl delete namespace/velero clusterrolebinding/velerokubectl delete crds -l component=velero
3. 创建service
由于minio安装在集群外,pod无法访问外部服务,需要创建一个external类型的服务,用来访问外部minio,yaml内容如下:保存为minio-service.yaml,执行如下命令创建service
kubectl apply -f minio-service.yaml
5、备份
1. 备份整个test名称空间
1)备份pv是Delete策略的清单
velero backup create ns-test-pv-delete --include-namespaces test
可以看到minio中已经成功存储了备份的数据

2)备份pv是Retain策略的清单
:::warning
使用Retain策略后,模拟灾难时,并删除pv(Retain策略需要手动释放pv),恢复时会自动创建相关pv
:::
修改pv策略为Retain后备份
velero backup create ns-test-pv-retain --include-namespaces test
6、模拟灾难
:::warning
- Delete策略的不需要手动清理PV(自动清理,不过时间可能较长);恢复时也会自动创建;
- Retain策略的需要手动清理PV(不会自动清理);恢复时也会自动创建,但是恢复后的策略为Delete(可能是sc的默认策略是Delete)
:::
kubectl delete namespaces test# 删除名称空间(因为存在pvc和pv,并不能完全删除,会将状态变为Terminating)# 手动删除pvc和pvkubectl delete pvc mysql-pvc -ntestkubectl delete pv pvc-c2802913-202b-4d9f-9fb8-bc75e04fda5c
因为动态配置的 PV的默认 回收策略是“删除”,这些命令应该会触发您的云提供商删除支持 PV 的磁盘。删除是异步的,因此这可能需要一些时间。在继续下一步之前,请检查您的云提供商以确认该磁盘不再存在。
7、恢复
1. 恢复整个test名称空间
1)恢复pv是Delete策略的清单
velero restore create --from-backup test-pv-delete
可以看到pod和相关其他资源都创建成功

2)恢复pv是Retain策略的清单
velero restore create --from-backup test-pv-retain
8、诉求上云项目迁移
1. 备份恢复
# 备份整个名称空间velero backup create yyjczcpt-20221114 --include-namespaces yyjczcpt --ttl=360h# pv和pvc备份太慢,过滤(只备份deploy、sts、svc、cm等资源)velero backup create dgms-20221115-2001 --include-resources deploy,sts,svc,cm --include-namespaces dgms --ttl=360h# 另一套环境恢复velero restore create --from-backup dgms-20221115-2001
- —ttl=360h:存储时间过后自动清除
2. 查看
velero backup get #备份查看velero schedule get #查看定时备份velero restore get #查看可恢复备份# 查看备份位置信息velero backup-location get
- 你能检查
velero backup-location get吗?查看default备份存储位置是否可用。
更多操作命令移步--help或官网
