Velero 私有化部署指南:对象存储选型、卷快照方案与离线(Air-Gapped)镜像准备
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
本文围绕 Velero 官方文档 On-Premises Environments 展开,系统讲解在无法依赖公有云服务的私有集群中运行 Velero 的三类关键决策:如何选择对象存储后端(含 MinIO 评估安装实操)、如何选择持久卷数据备份方案(原生快照插件或文件级备份 FSB),以及离线(Air-Gapped)环境下如何将 Velero 核心镜像、插件镜像和恢复辅助镜像迁移到内部镜像仓库。读完本文,你可以独立完成一套私有化 Velero 备份栈的选型、安装与镜像自托管配置,并从源码层面理解velero install各参数背后的实现逻辑。
一、私有化部署的三个核心决策点
Velero 的设计假设备份数据最终要落到对象存储,卷数据要么依赖存储平台的原生快照,要么走平台无关的文件级备份。因此,在一台不接入公有云的集群上落地 Velero,需要依次回答三个问题:
- 对象存储后端选什么?Velero 必须有一个可访问的对象存储来存放备份归档(backup tarball 及附属文件);
- 持久卷数据怎么备份?要么选一个有原生快照插件的存储(如 Portworx),要么使用 Velero 内置的文件系统备份(File System Backup,下称 FSB);
- 镜像从哪来?如果集群完全离线(Air-Gapped),无法访问公共镜像仓库,就必须把所有 Velero 相关镜像搬进内部镜像仓库。
下面按这三个决策点逐一展开,并结合当前仓库源码与示例配置加以印证。
二、选择对象存储提供商
2.1 支持的存储提供商
Velero 的对象存储与卷快照能力都通过插件体系扩展,任何人无需修改 Velero 主仓库即可接入新的存储平台。官方文档 Supported Providers 列出的由 Velero 维护者维护的提供商插件包括:
| 提供商 | 对象存储 | 卷快照 |
|---|---|---|
| Amazon Web Services (AWS) | AWS S3 | AWS EBS |
| Google Cloud Platform (GCP) | Google Cloud Storage | Google Compute Engine 磁盘 |
| Microsoft Azure | Azure Blob Storage | Azure 托管磁盘 |
| VMware vSphere | 不支持 | vSphere 卷 |
| Container Storage Interface (CSI) | 不支持 | CSI 卷 |
此外,社区还维护了 AlibabaCloud(OSS)、DigitalOcean、HPE、OpenEBS、OpenStack(Swift/Cinder)、Portworx、Storj 等插件。
对私有化场景更关键的是S3 兼容存储这一条路线:Velero 的 AWS 对象存储插件基于 Amazon 的 Go SDK 连接 S3 API,因此任何实现了 S3 API 的存储都可以直接作为备份目标。用户报告可用(但 Velero 团队不定期测试)的 S3 兼容存储包括:IBM Cloud、Oracle Cloud、MinIO、DigitalOcean、NooBaa、Tencent Cloud、Ceph RADOS(v12.2.7 及以上)、Quobyte、Cloudian HyperStore 等。注意:部分存储(如 Quobyte)可能需要不同的签名算法版本(signature algorithm version),具体参数见 AWS 插件的 BackupStorageLocation 文档。
2.2 没有对象存储?用 MinIO 快速搭一套
如果你还没有对象存储系统,MinIO 是官方推荐的开源 S3 兼容方案:它可以部署在你的集群内部,且已被验证与 Velero 兼容。该文档明确说明:MinIO 的生产级配置(高可用、加密、多副本等)不在 Velero 文档范围内,仓库提供的是"评估安装"(evaluation install)级别的指引,生产环境请自行完成 MinIO 的可靠性建设。
仓库中附带了现成的 MinIO 部署清单 examples/minio/00-minio-deployment.yaml,它由三部分组成,值得逐一看懂:
Deployment(组件minio):运行minio/minio:latest,监听 9000 端口,通过环境变量MINIO_ACCESS_KEY=minio、MINIO_SECRET_KEY=minio123写入账号,数据目录挂在emptyDir卷/storage上;Service:默认ClusterIP类型(清单注释明确建议生产用 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能直接对上的原因。
官方评估安装流程(摘自 MinIO 快速上手)如下:
前提条件
- 一个 Kubernetes 1.7+ 集群(若日后启用文件级备份,需 1.10+ 或开启了 MountPropagation 特性的更低版本);
- 集群内有可用的 DNS 服务器与
kubectl; - MinIO 所在节点有足够磁盘空间:备份数据量 + 至少 1GB 余量(MinIO 在剩余空间低于 1GB 时无法工作)。
第一步:部署 MinIO
kubectl apply -f examples/minio/00-minio-deployment.yaml示例清单使用
emptyDir,若节点空间不足,可修改清单改用 Persistent Volume。
第二步:创建 Velero 凭证文件
在本地 Velero 目录创建credentials-velero,内容对应 MinIO 的账号(即部署清单中的环境变量):
[default] aws_access_key_id = minio aws_secret_access_key = minio123第三步:安装 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参数要点:
--provider aws:私有集群没有云厂商,对象存储插件统一选 AWS 插件(走 S3 API);插件版本需与你安装的 Velero 版本兼容;--backup-location-config中s3ForcePathStyle="true"与s3Url=http://minio.velero.svc:9000是让 S3 客户端指向集群内 MinIO 服务的关键(MinIO 不支持虚拟主机风格的 endpoint);--use-volume-snapshots=false:在没有支持快照的存储时避免创建无用的VolumeSnapshotLocation;- 若需要文件级备份能力,追加
--use-node-agent;想等待部署就绪再加--wait。
第四步:部署示例应用并验证
kubectl apply -f examples/nginx-app/base.yaml kubectl get deployments -l component=velero --namespace=velero kubectl get deployments --namespace=nginx-example第五步:演练一次备份与恢复
# 按标签选择器创建备份 velero backup create nginx-backup --selector app=nginx # (可选)定时备份,支持标准 cron 表达式与 @daily 等简写 velero schedule create nginx-daily --schedule="0 1 * * *" --selector app=nginx # 模拟故障:删掉业务命名空间 kubectl delete namespace nginx-example # 从备份恢复 velero restore create --from-backup nginx-backup velero restore get恢复完成后velero restore get中STATUS应为Completed、WARNINGS与ERRORS均为 0;如有异常用velero restore describe <RESTORE_NAME>查看详情。
两个私有化高频问题
- 让
velero logs/velero describe能读到备份内容:Velero 服务端会为备份对象生成预签名 URL(pre-signed URL)供客户端下载,因此 MinIO 必须对客户端可达。三种做法:把 Service 从ClusterIP改为NodePort并在BackupStorageLocation.spec.config中配置publicUrl;或配置 Ingress(保持 ClusterIP);KinD 环境因不支持 NodePort,可用kubectl port-forward转发 MinIO Pod 的 9000 端口后配置publicUrl: http://localhost:9000。 - MinIO 走 HTTPS 时
velero describe输出乱码:通过kubectl patch -n velero backupstoragelocation default --type merge -p '{"spec":{"config":{"publicUrl":"https://<MinIO 公网地址>:9000"}}}'补充公共 URL 即可。
三、(可选)选择卷快照/卷数据备份方案
如果需要备份持久卷数据(而非仅备份 K8s 资源对象),有两条路:
3.1 原生快照插件
在 Supported Providers 中查找你的存储平台对应的卷快照插件。例如使用 Portworx 做持久存储时,可以安装 Portworx 的 Velero 插件,在 Velero 备份中获得 Portworx 原生卷快照。
3.2 没有原生插件?用 File System Backup
文档明确指出:如果存储平台没有可用的原生快照插件,可以使用 Velero 的 File System Backup。FSB 是一个平台无关的文件级卷备份方案,通过运行在节点上的 Velero Node Agent(DaemonSet)直接访问 Pod 卷数据,底层数据搬运由 restic 或 kopia 两个开源备份引擎完成(当前仓库中uploader-type安装参数的合法值即restic或kopia,见 install.go 的uploader-typeflag 定义)。
从源码结构看,FSB 与本文私有化主题有直接关系:启用 FSB 会引入额外的容器镜像(restore helper,见第四节),并依赖 Node Agent DaemonSet 挂载节点 hostPath。当前仓库 pkg/install/daemonset.go 中可以看到 node-agent 的构建逻辑:
- 基于
kubeletRootDir拼出<kubeletRoot>/pods与<kubeletRoot>/plugins两个 hostPath 卷,分别挂到容器内的/var/lib/kubelet/pods与/var/lib/kubelet/plugins; - 挂载方式强制为
MountPropagationHostToContainer(HostToContainer 传播模式),这正是 FSB 文档要求 Kubernetes 具备 MountPropagation 特性的原因; - 额外挂了一个
emptyDir的/scratch暂存目录。
FSB 的选型权衡(摘自官方文档):
- 优点:几乎支持所有卷类型(EFS、AzureFile、NFS、emptyDir、local 等无原生快照概念的卷均可);备份数据可存放到与卷底层不同的存储平台;
- 缺点:从活文件系统拷贝,一致性弱于快照;需以 root/特权模式访问宿主目录;
hostPath卷不被支持(local PV 支持); - 限制:Pod 必须正在运行并挂载卷才能备份(孤儿 PVC/PV 需先起一个 staging Pod 挂载)。
启用方式为在velero install时加--use-node-agent(install.go 中该 flag 的描述为 "Create Velero node-agent daemonset");发现 Pod 卷有两种模式:
- Opt-in(默认):在需要备份的 Pod 上打注解
backup.velero.io/backup-volumes=<卷名1>,<卷名2>; - Opt-out:备份所有 Pod 卷(自动排除默认 SA token、Secret、ConfigMap 与 hostPath 卷),可配合
--default-volumes-to-fs-backup或备份级参数全局启用,并用backup.velero.io/backup-volumes-excludes注解排除个别卷。
注意 install.go 中的校验逻辑:--default-volumes-to-fs-backup与--use-node-agent必须配套使用,单独开启前者会直接报错——这是私有化安装时容易踩的坑。
四、Air-Gapped(离线)部署:镜像准备全流程
在 Air-Gapped 环境中,集群没有任何公网访问能力,自然也无法拉取公共容器镜像仓库(如 Docker Hub)中的velero/velero等镜像。官方文档给出的标准做法是:在集群外准备一台可联网的跳板机,先部署一个内部镜像仓库(如 Harbor),然后把三类镜像逐一 pull → tag → push 进内部仓库:
4.1 准备 Velero 核心镜像
PRIVATE_REG=<your private registry> VELERO_VERSION=<version of Velero you're targeting, for example v1.4.0> docker pull velero/velero:$VELERO_VERSION docker tag velero/velero:$VELERO_VERSION $PRIVATE_REG/velero:$VELERO_VERSION docker push $PRIVATE_REG/velero:$VELERO_VERSION4.2 准备插件镜像
对每个需要的插件重复同样操作。文档以 AWS 插件为例(实际替换为你所需的插件名):
PRIVATE_REG=<your private registry> PLUGIN_VERSION=<version of plugin you're targeting, for example v1.0.2> docker pull velero/velero-plugin-for-aws:$PLUGIN_VERSION docker tag velero/velero-plugin-for-aws:$PLUGIN_VERSION $PRIVATE_REG/velero-plugin-for-aws:$PLUGIN_VERSION docker push $PRIVATE_REG/velero-plugin-for-aws:$PLUGIN_VERSION4.3 准备恢复辅助镜像(使用 FSB 时必做)
如果你启用了 File System Backup,还需要上传 restore helper 镜像——FSB 恢复时 Velero 会向 Pod 注入一个基于该镜像的 init 容器来等待卷数据恢复完成(当前仓库中该镜像引用见 pod_volume_restore_action.go):
PRIVATE_REG=<your private registry> VELERO_VERSION=<version of Velero you're targeting, for example v1.4.0> docker pull velero/velero-restore-helper:$VELERO_VERSION docker tag velero/velero-restore-helper:$VELERO_VERSION $PRIVATE_REG/velero-restore-helper:$VELERO_VERSION docker push $PRIVATE_REG/velero-restore-helper:$VELERO_VERSION4.4 拉取特定架构的镜像(可选)
Velero 的镜像使用 Docker manifest 列表(multi-arch manifest),Docker 会按客户端机器架构自动选择对应镜像。如果离线环境需要手工指定架构版本,应把velero/velero替换为特定架构镜像名,例如 ARM 平台用velero/velero-arm。
查看当前支持哪些架构的官方方法(需在可联网机器上开启 Docker 实验特性):
docker manifest inspect velero/velero返回的 manifest 列表中每种架构对应一个镜像名,把架构字符串用-拼接到镜像名后即可直接 pull。
4.5 用内部仓库镜像安装 Velero
默认velero install使用公共的velero/velero镜像;离线部署时必须通过--image和--plugins显式指定私有仓库镜像(当前仓库 internal/velero/images.go 中DefaultVeleroImage()提供默认公共镜像,velero install的--image参数会覆盖它):
velero install \ --image=$PRIVATE_REG/velero:$VELERO_VERSION \ --plugins=$PRIVATE_REG/velero-plugin-for-aws:$PLUGIN_VERSION \ <....>提示:
--plugins可重复指定多个插件镜像;如果同时使用 FSB,node-agent DaemonSet 与核心 Deployment 共用--image指定的镜像(pkg/install/daemonset.go 中 DaemonSet 默认取DefaultVeleroImage(),同样受安装选项覆盖)。因此核心镜像、插件镜像、restore helper 镜像三者缺一不可,漏掉任何一个都可能导致备份或 FSB 恢复失败。
五、验证与排障清单
私有化安装完成后,建议按以下顺序验证(命令均摘自仓库文档与示例):
# 1. 服务端与 MinIO 组件状态 kubectl get pods -n velero # 2. 备份存储位置是否就绪 velero backup-location get # 3. 端到端演练(对应 2.2 节) velero backup create nginx-backup --selector app=nginx velero restore create --from-backup nginx-backup velero restore get若启用 FSB,还要检查每命名空间的备份仓库(velero repo get)、PodVolumeBackup/PodVolumeRestore资源状态,以及 node-agent Pod 日志(kubectl -n velero logs DAEMON_POD_NAME);velero describe输出异常时优先按 2.2 节排查 MinIO 可达性与publicUrl配置。
六、小结
Velero 的私有化部署本质上是一组"存储选型 + 镜像自托管"的工程决策:
- 对象存储:优先 S3 兼容方案(MinIO/Ceph 等),AWS 插件 +
s3Url/s3ForcePathStyle参数即可对接; - 卷数据:有原生快照插件就走插件,没有就启用 FSB(
--use-node-agent,注意其与--default-volumes-to-fs-backup的配套约束); - 离线环境:核心镜像、插件镜像、restore helper 镜像全部预置进内部仓库,ARM 等特定架构用
docker manifest inspect确认后按架构名拉取,最后用velero install --image ... --plugins ...完成指向私有仓库的安装。
相关文档与源码入口:On-Premises Environments、Supported Providers、File System Backup、MinIO 评估安装、MinIO 部署清单、install 命令实现、node-agent DaemonSet 构建。
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考