Velero 快速上手:使用本地 Minio 完成备份与恢复全流程实操
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
本文基于 Velero 官方文档《Quick start evaluation install with Minio》,完整演示如何在 Kubernetes 集群中用 Minio(S3 兼容的本地对象存储)搭建一套可直接体验的 Velero 环境:安装客户端、启动服务器与本地存储、部署示例应用、创建备份与定时策略、模拟灾难并恢复数据,最后完成清理。读完后,你将掌握 Velero 从安装到备份/恢复的完整操作链路,并能结合仓库源码理解velero install各参数的实际作用。
需要说明的是,该示例的目的是让你快速体验 Velero 的基本功能,不适用于生产环境(Minio 的生产化配置不在本文范围内)。文档适用于 v1.11 版本线;参数说明以当前仓库 velero install 命令源码 为准。
前置条件
开始前请确认以下条件均已满足:
- 可访问的 Kubernetes 集群,版本 1.7 或更高。注意:文件系统备份(File System Backup)需要 Kubernetes 1.10 及以上,或开启了 mount propagation 特性的更早版本。本示例不依赖文件系统备份,但后续可能需要(参考 文件系统备份文档)。
- 集群内可用的 DNS 服务器。
- 已安装
kubectl。 - Minio 所在节点有足够的磁盘空间:足以存放所有备份数据,且额外保留至少 1GB 空闲空间——Minio 在空闲磁盘低于 1GB 时会停止工作。
安装 Velero CLI
方式一:macOS Homebrew
在 macOS 上可以直接用 Homebrew 安装velero客户端:
brew install velero方式二:从官方 Release 下载
下载与你客户端平台匹配的官方 Release 压缩包(tarball)。
建议使用官方发布的 Release 版本。每个 Release 的 tarball 中均包含
velero命令行客户端。仓库 main 分支的代码处于活跃开发状态,不保证稳定。解压 tarball:
tar -xvf <RELEASE-TARBALL-NAME>.tar.gz -C /dir/to/extract/to解压后的目录在后续步骤中称为“Velero 目录”。
将
velero二进制从 Velero 目录移动到PATH中的某个位置。
部署本地 Minio 存储
Velero 需要一个对象存储来存放备份数据。示例提供了完整的 Minio 部署清单 00-minio-deployment.yaml,包含三个对象:
- Namespace:
velero,Velero 与 Minio 共用。 - Deployment(
component: minio):运行minio/minio:latest镜像,监听 9000 端口;访问密钥由环境变量MINIO_ACCESS_KEY=minio与MINIO_SECRET_KEY=minio123定义;数据目录使用emptyDir卷挂载到/storage。 - Service(
minio):默认类型为ClusterIP,仅集群内可访问,暴露 9000 端口。注释中明确提示:生产环境保持ClusterIP,仅在 Minikube 等试验环境才改为NodePort。 - Job(
minio-setup):使用minio/mc客户端初始化存储,命令为mc alias set velero http://minio:9000 minio minio123 && mc mb -p velero/velero,即创建名为velero的 bucket——这正是后续velero install --bucket velero所引用的 bucket,且mb -p参数表示在 bucket 上禁用公共访问。
应用该清单:
kubectl apply -f examples/minio/00-minio-deployment.yaml注意:示例 Minio 清单使用emptyDir存储,所在节点必须同时满足“备份数据 + 1GB 空闲空间”的要求。如果节点空间不足,可以修改清单改用 Persistent Volume 替代emptyDir。
部署 Velero 服务器
第一步:创建 Velero 专用凭据文件
在你的 Velero 目录下创建credentials-velero文件(AWS 风格的 S3 凭据格式,供 AWS 插件解析):
[default] aws_access_key_id = minio aws_secret_access_key = minio123其中的minio/minio123与 Minio Deployment 的MINIO_ACCESS_KEY/MINIO_SECRET_KEY环境变量一致。
第二步:执行 velero install
在 Velero 目录下运行:
velero install \ --provider aws \ --plugins velero/velero-plugin-for-aws:v1.2.1 \ --bucket velero \ --secret-file ./credentials-velero \ --use-volume-snapshots=false \ --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.velero.svc:9000各参数的含义(结合 install.go 中的BindFlags定义):
| 参数 | 取值 | 说明 |
|---|---|---|
--provider | aws | 备份与卷存储的提供者名称。由于 Minio 兼容 S3,这里按 AWS 处理 |
--plugins | velero/velero-plugin-for-aws:v1.2.1 | 要装入 Velero Deployment 的插件镜像。AWS 插件版本需与 Velero 版本兼容,安装时请自行核对 |
--bucket | velero | 备份存放的 bucket 名称,即 Minio setup Job 创建的velero |
--secret-file | ./credentials-velero | 凭据文件路径,内容会读取后创建为名为cloud-credentials的 Secret |
--use-volume-snapshots | false | 不自动创建VolumeSnapshotLocation。示例假设集群没有支持快照的卷提供者 |
--backup-location-config | region=minio,s3ForcePathStyle="true",s3Url=http://minio.velero.svc:9000 | BackupStorageLocation的键值配置:s3Url指向集群内 Minio Service 地址;s3ForcePathStyle="true"让 S3 客户端使用 path-style 寻址(Minio 要求) |
源码层面的补充说明:
- 在 pkg/cmd/cli/install/install.go 的
Validate方法中可以看到参数校验规则:未使用--no-default-backup-location时,--provider和--bucket均为必填;--secret-file与--no-secret必须二选一且不可同时使用;当--use-volume-snapshots=false时,--snapshot-location-config必须为空;非--no-default-backup-location场景下--plugins为必填。 AsVeleroOptions会用os.ReadFile读取--secret-file指向的文件,字节内容作为SecretData传入资源生成逻辑;pkg/install/resources.go 中的BackupStorageLocation函数据此构建BackupStorageLocation对象,并将凭据组装为cloud-credentialsSecret。该 Secret 随后被挂载到 Velero 服务器 Deployment(见 pkg/install/deployment.go)。- 此外还可以追加
--use-node-agent开启文件系统备份支持(会创建 node-agent DaemonSet),以及--wait等待 Deployment 就绪(源码中Run方法会对 Velero Deployment、node-agent DaemonSet 逐一执行就绪检查)。 - 也可以组合使用
--dry-run -o yaml,只生成资源清单而不提交到集群,便于定制安装。
第三步:部署示例 nginx 应用
kubectl apply -f examples/nginx-app/base.yaml该清单(base.yaml)创建了:nginx-example命名空间(标签app: nginx)、2 副本的nginx-deployment(标签app: nginx)、以及LoadBalancer类型的 Servicemy-nginx。
第四步:验证部署
kubectl get deployments -l component=velero --namespace=velero kubectl get deployments --namespace=nginx-example确认 Velero 与 nginx 两个 Deployment 均已成功创建。
创建备份
按标签选择器创建一次性备份
备份所有匹配app=nginx标签选择器的对象:
velero backup create nginx-backup --selector app=nginx如果希望备份所有对象、但排除匹配backup=ignore标签的对象,可使用:
velero backup create nginx-backup --selector 'backup notin (ignore)'(可选)创建定时备份
基于 cron 表达式,每天凌晨 1 点执行一次:
velero schedule create nginx-daily --schedule="0 1 * * *" --selector app=nginx也可以直接使用的非标准简写 cron 表达式:
velero schedule create nginx-daily --schedule="@daily" --selector app=nginx更多 cron 用法可参考 Velero 所依赖的 cron 包的文档。
模拟灾难
删除示例命名空间,模拟应用彻底丢失:
kubectl delete namespace nginx-example确认 Deployment 与 Service 均已消失:
kubectl get deployments --namespace=nginx-example kubectl get services --namespace=nginx-example kubectl get namespace/nginx-example以上命令应无任何结果返回。注意:命名空间的完整清理可能需要等待几分钟。
执行恢复
基于之前的备份创建恢复:
velero restore create --from-backup nginx-backup查看恢复状态:
velero restore get恢复完成后输出形如:
NAME BACKUP STATUS WARNINGS ERRORS CREATED SELECTOR nginx-backup-20170727200524 nginx-backup Completed 0 0 2017-07-27 20:05:24 +0000 UTC <none>
注意:恢复可能需要一段时间,期间STATUS列显示InProgress。恢复成功后STATUS变为Completed,WARNINGS与ERRORS均为 0,nginx-example命名空间中的所有对象应恢复到删除前的状态。
如出现错误或警告,可查看详情(更多排查信息见 恢复问题排查文档):
velero restore describe <RESTORE_NAME>清理
删除备份
删除指定备份(包括对象存储中的数据和卷快照):
velero backup delete BACKUP_NAME该命令会让 Velero 服务器删除与BACKUP_NAME关联的全部备份数据,需要对每个要彻底删除的备份分别执行。完全删除后,执行velero backup get BACKUP_NAME将看不到该备份。
彻底卸载 Velero、Minio 与示例应用
kubectl delete namespace/velero clusterrolebinding/velero kubectl delete crds -l component=velero kubectl delete -f examples/nginx-app/base.yaml将 Minio 暴露到集群外
执行velero describe或获取日志等命令时,Velero 服务器会生成预签名 URL 供客户端下载所请求的对象。要让集群外的 Velero 客户端访问这些 URL,就必须把 Minio 暴露到集群外。有两种方式:
- 将 Minio Service 类型从
ClusterIP改为NodePort; - 为集群配置 Ingress,Minio Service 保持
ClusterIP不变。
两种方式都可以进一步在BackupStorageLocation的配置中指定publicUrl字段,用于生成预签名 URL。
方式一:NodePort Service
Minio 部署默认为ClusterIP类型。如果从客户端可以直达集群节点,可以改为NodePort轻松对外暴露服务。
在 00-minio-deployment.yaml 中,把 Service 的
spec.type从ClusterIP改为NodePort。获取 Minio 的完整 URL:
如果使用 Minikube:
minikube service minio --namespace=velero --url其他环境:
获取集群任意节点的对外 IP 或 DNS 名称,确保 Velero 客户端能访问该地址;
追加 NodePort 端口号组成完整 URL,端口号通过以下命令获取:
kubectl -n velero get svc/minio -o jsonpath='{.spec.ports[0].nodePort}'
编辑
BackupStorageLocationYAML,在spec.config下添加publicUrl: <上一步获得的 URL>。URL 必须包含http://或https://前缀。
通过 HTTPS 端点访问日志
如果使用 HTTPS 的 Minio,velero describe或velero logs的输出可能是一堆不可读的乱码。解决办法是为BackupStorageLocation添加公共 URL:
kubectl patch -n velero backupstoragelocation default --type merge -p '{"spec":{"config":{"publicUrl":"https://<a public IP for your Minio instance>:9000"}}}'如果证书是自签名的,请参考 自签名证书文档。
方式二:KinD(Kubernetes in Docker)环境
KinD 不支持 NodePort Service,此时可以用端口转发访问 Minio bucket。在终端中执行:
MINIO_POD=$(kubectl get pods -n velero -l component=minio -o jsonpath='{.items[0].metadata.name}') kubectl port-forward $MINIO_POD -n velero 9000:9000然后在另一个终端编辑BackupStorageLocation:
kubectl edit backupstoragelocation default -n velero在spec.config部分添加publicUrl: http://localhost:9000。
方式三:Ingress
为集群配置 Ingress 超出了 Velero 文档的范围;但如果你已经配置好了 Ingress,在跑 Minio 示例时继续沿用它也是合理的选择:
- Service 类型保持
ClusterIP; - 编辑
BackupStorageLocationYAML,在spec.config下添加publicUrl: <Ingress 的 URL 和端口>。
相关链接
- 生产环境安装与平台定制:自定义安装
- 安装与配置问题排查:安装问题调试
- 文件系统备份(本示例未启用,可通过
--use-node-agent开启):File System Backup - 恢复问题排查:Debugging Restores
- 仓库内的示例资源:Minio 部署清单、nginx 示例应用
velero install命令实现与参数校验:pkg/cmd/cli/install/install.go,资源生成逻辑见 pkg/install/resources.go
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考