在Kubernetes的实际应用中,集群自身并不负责用户数据的持久化保管,这使得为集群部署一套可靠的备份恢复方案至关重要。
本文将详细介绍如何搭建Velero + MinIO这一经典的Kubernetes备份组合,并演示其核心的备份与恢复操作流程。
1 为什么选择 Velero + MinIO?
对于大多数团队而言,该方案具有以下几个显著优势:
- 完全开源,避免厂商锁定:无需依赖AWS S3或阿里云OSS等商业服务。
- MinIO部署简易快速:使用Docker可秒级启动,对现有环境无侵入。
- Velero功能强大全面:支持备份(Backup)、恢复(Restore)、集群迁移、定时任务及存储卷快照等。
- 生产环境级安全可控:所有备份数据均存储在自主管理的MinIO对象存储中。
核心价值:这是一套易于落地且稳定可靠的Kubernetes数据保护方案。
2 搭建MinIO服务
我们使用Docker快速部署一个MinIO实例。当然,你也可以选择将其部署在Kubernetes集群内部。Velero后续会将备份文件上传至此。
# 创建数据目录(请确保执行节点已安装Docker)
mkdir -p /data/minio/data && chmod -R 777 /data/minio/data
# 启动MinIO容器
docker run -d \
-p 9000:9000 \
-p 9001:9001 \
--name velero-minio \
-v /data/minio/data:/data \
-e "MINIO_ROOT_USER=miniouser" \
-e "MINIO_ROOT_PASSWORD=Manager@2025" \
quay.io/minio/minio server /data --console-address ":9001"
关键参数解析:
- 9000端口:MinIO对象存储的API端口(兼容S3协议),Velero将通过此端口与MinIO通信。
- 9001端口:MinIO控制台(Web UI)端口,用于管理存储桶。
- MINIO_ROOT_USER / MINIO_ROOT_PASSWORD:MinIO的管理员账号和密码。
- --console-address:指定控制台服务的监听端口。
- server /data:以Server模式启动,并使用
/data目录作为存储后端。
3 创建S3兼容的存储桶
通过浏览器访问MinIO控制台(例如:http://<你的服务器IP>:9001),使用上一步设置的管理员账号密码登录。

在控制台中,点击 Create Bucket 按钮创建一个新的存储桶。

Velero的所有备份文件都将被写入这个Bucket中,建议为其命名一个具有标识性的名称,例如velero-backups。
4 安装 Velero
4.1 下载Velero客户端
访问Velero的GitHub发布页面下载客户端。请务必根据你的Kubernetes集群版本选择合适的Velero版本。例如,针对K8s 1.33.5版本,可以选择Velero 1.17.1。

同时,由于我们需要对接S3兼容存储,需记录对应版本的AWS插件信息(该插件使Velero能够与MinIO通信),无需单独下载插件包。

4.2 安装Velero客户端
将下载的安装包上传至Kubernetes集群的Master节点,并执行以下步骤进行客户端安装:
# 解压安装包
cd /data/velero/
tar -xvf velero-v1.17.1-linux-amd64.tar.gz
# 将velero二进制文件移至系统PATH目录
cp velero-v1.17.1-linux-amd64/velero /usr/local/bin/
chmod +x /usr/local/bin/velero
# 验证客户端安装
velero version
此时,输出会显示客户端版本信息,并提示无法获取服务端版本(因为服务端尚未部署),这属于正常现象。
4.3 部署Velero服务端
首先,创建一个凭证文件,其中包含访问MinIO所需的密钥(需与部署MinIO时设置的账号密码一致):
cat > user-minio << EOF
[default]
aws_access_key_id=miniouser
aws_secret_access_key=Manager@2025
EOF
执行以下命令,在Kubernetes集群中安装Velero服务端:
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.13.1 \
--bucket velero-backups \
--secret-file ./user-minio \
--use-volume-snapshots=false \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://10.0.0.207:9000 \
--namespace velero
核心参数说明:
--provider aws:MinIO兼容S3协议,因此选择aws provider。
--plugins:指定用于连接S3兼容存储的插件及其版本。
--bucket:指定在MinIO中创建的存储桶名称。
--secret-file:指定包含MinIO访问凭证的文件。
--backup-location-config:
region=minio:区域名称,可自定义但必须提供。
s3ForcePathStyle="true":连接MinIO必须启用此项。
s3Url:指向MinIO服务API地址(端口9000)。

安装完成后,验证相关资源状态:
# 检查Velero Pod运行状态
kubectl get po -n velero
# 检查部署状态
kubectl get deploy -n velero
# 检查备份存储位置是否就绪
kubectl get BackupStorageLocation -n velero
# 再次查看版本,此时应显示客户端和服务端版本
velero version
当所有资源状态正常,且velero version命令能正确输出服务端信息时,表明Velero服务端已成功部署。
5 执行备份操作
以下是Velero进行备份恢复的简易架构示意图:

现在,我们来创建一个完整的集群备份:
# 创建名为 cluster-backup 的备份
velero backup create cluster-backup
# 查看备份任务列表及状态
velero backup get

当状态(Status)显示为 Completed 时,表示备份已完成。此时,登录MinIO控制台,可以在之前创建的Bucket中看到Velero生成的备份文件结构。

6 执行恢复操作
当发生误删除等事故时,即可利用备份进行恢复。我们通过一个简单的测试来演示:
假设在default命名空间中有一个名为nginx-test的Pod,现将其删除:
kubectl delete pod nginx-test
随后,使用之前创建的备份进行恢复:
velero restore create --from-backup cluster-backup
恢复执行完毕后,再次查看Pod,可以发现nginx-test已被成功恢复。

Velero能够自动化恢复多种资源,包括Deployment、Service、Ingress、PVC/PV数据以及相关的Kubernetes元数据,是保障数据库及有状态应用数据安全的关键组件。
总结
本文完成了Velero与MinIO备份环境的基础搭建,并验证了其核心的备份与恢复功能。Velero还支持更精细化的操作,例如按命名空间备份、资源过滤、定时备份策略制定等,这些高级功能将有助于构建更完善的企业级运维备份体系。