Velero 快速上手:使用本地 Minio 完成备份与恢复全流程实操
2026/9/17 10:24:19 网站建设 项目流程

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 下载

  1. 下载与你客户端平台匹配的官方 Release 压缩包(tarball)。

    建议使用官方发布的 Release 版本。每个 Release 的 tarball 中均包含velero命令行客户端。仓库 main 分支的代码处于活跃开发状态,不保证稳定。

  2. 解压 tarball:

    tar -xvf <RELEASE-TARBALL-NAME>.tar.gz -C /dir/to/extract/to

    解压后的目录在后续步骤中称为“Velero 目录”。

  3. velero二进制从 Velero 目录移动到PATH中的某个位置。

部署本地 Minio 存储

Velero 需要一个对象存储来存放备份数据。示例提供了完整的 Minio 部署清单 00-minio-deployment.yaml,包含三个对象:

  • Namespacevelero,Velero 与 Minio 共用。
  • Deploymentcomponent: minio):运行minio/minio:latest镜像,监听 9000 端口;访问密钥由环境变量MINIO_ACCESS_KEY=minioMINIO_SECRET_KEY=minio123定义;数据目录使用emptyDir卷挂载到/storage
  • Serviceminio):默认类型为ClusterIP,仅集群内可访问,暴露 9000 端口。注释中明确提示:生产环境保持ClusterIP,仅在 Minikube 等试验环境才改为NodePort
  • Jobminio-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定义):

参数取值说明
--provideraws备份与卷存储的提供者名称。由于 Minio 兼容 S3,这里按 AWS 处理
--pluginsvelero/velero-plugin-for-aws:v1.2.1要装入 Velero Deployment 的插件镜像。AWS 插件版本需与 Velero 版本兼容,安装时请自行核对
--bucketvelero备份存放的 bucket 名称,即 Minio setup Job 创建的velero
--secret-file./credentials-velero凭据文件路径,内容会读取后创建为名为cloud-credentials的 Secret
--use-volume-snapshotsfalse不自动创建VolumeSnapshotLocation。示例假设集群没有支持快照的卷提供者
--backup-location-configregion=minio,s3ForcePathStyle="true",s3Url=http://minio.velero.svc:9000BackupStorageLocation的键值配置: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

以上命令应无任何结果返回。注意:命名空间的完整清理可能需要等待几分钟。

执行恢复

  1. 基于之前的备份创建恢复:

    velero restore create --from-backup nginx-backup
  2. 查看恢复状态:

    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变为CompletedWARNINGSERRORS均为 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轻松对外暴露服务。

  1. 在 00-minio-deployment.yaml 中,把 Service 的spec.typeClusterIP改为NodePort

  2. 获取 Minio 的完整 URL:

    • 如果使用 Minikube:

      minikube service minio --namespace=velero --url
    • 其他环境:

      1. 获取集群任意节点的对外 IP 或 DNS 名称,确保 Velero 客户端能访问该地址;

      2. 追加 NodePort 端口号组成完整 URL,端口号通过以下命令获取:

        kubectl -n velero get svc/minio -o jsonpath='{.spec.ports[0].nodePort}'
  3. 编辑BackupStorageLocationYAML,在spec.config下添加publicUrl: <上一步获得的 URL>。URL 必须包含http://https://前缀。

通过 HTTPS 端点访问日志

如果使用 HTTPS 的 Minio,velero describevelero 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 示例时继续沿用它也是合理的选择:

  1. Service 类型保持ClusterIP
  2. 编辑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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询