4. 对象存储与快照后端选型

Velero 的备份数据最终要落到一个“后端存储”上,而卷数据则可能走另一条路径。理解这两条路径的差异,是选型的第一步。Velero 把集群资源(YAML 对象)序列化后写入对象存储,这部分称为 BackupStorageLocation(BSL);而持久卷里的数据,则通过 VolumeSnapshotLocation(VSL) 调用云厂商快照 API,或通过 Restic/Kopia 以文件级方式读取后同样写入对象存储。因此“对象存储选型”和“卷备份方式选型”是两个独立但需要协同决策的问题。

对象存储接入:统一抽象与差异点

Velero 通过 AWS SDK 兼容的 S3 协议访问绝大多数对象存储,这也是它能同时支持 AWS S3、MinIO、阿里云 OSS、Ceph RGW 等的原因。接入时核心是四类参数:bucket、prefix、region、以及凭证。凭证通常放在一个 Secret 中,键名固定为 cloud,内容是一段 INI 风格的配置:

apiVersion: v1
kind: Secret
metadata:
  name: cloud-credentials
  namespace: velero
type: Opaque
stringData:
  cloud: |
    [default]
    aws_access_key_id=AKIAEXAMPLE123456789
    aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

对于非 AWS 的 S3 兼容存储,需要在 BackupStorageLocation 中显式指定 s3Url,并关闭或调整签名区域。以 MinIO 为例,典型配置如下:

apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
  name: minio
  namespace: velero
spec:
  provider: aws
  objectStorage:
    bucket: velero-backups
    prefix: prod-cluster
  config:
    region: minio
    s3ForcePathStyle: "true"
    s3Url: http://minio.storage.svc:9000
  credential:
    name: cloud-credentials
    key: cloud

这里有两个容易踩坑的点。第一,s3ForcePathStyle 必须为 "true",否则 SDK 会尝试用 bucket.host 形式的虚拟主机寻址,而 MinIO 默认只支持路径寻址。第二,region 对 MinIO 而言只是签名占位符,填任意非空值即可,但若留空,部分 SDK 版本会直接报签名错误。阿里云 OSS 的接入方式与 MinIO 类似,s3Url 填 https://oss-cn-hangzhou.aliyuncs.com,region 填 cn-hangzhou,并保持路径寻址。Azure Blob 与 GCP GCS 则不走 S3 协议,Velero 分别提供 azure 和 gcp 两个 provider,凭证字段也不同:Azure 使用 AZURE_STORAGE_ACCOUNT_ACCESS_KEY,GCS 使用服务账号 JSON 的 GOOGLE_APPLICATION_CREDENTIALS 内容。

Velero 备份数据流:对象存储路径 vs 卷快照路径 Velero Server 备份编排 / 元数据写入 路径 A:对象存储(BSL) 集群资源 YAML + Restic/Kopia 卷数据 AWS S3 / MinIO S3 协议 · s3Url + 路径寻址 阿里云 OSS S3 兼容 · region 必填 Azure Blob provider: azure · 账户密钥 GCP GCS provider: gcp · 服务账号 JSON 关键配置项 bucket · prefix · region · s3Url · s3ForcePathStyle 凭证 Secret 键名固定为 cloud 路径 B:卷快照(VSL) 块级快照 · 不经过对象存储 CSI 快照 VolumeSnapshotClass 云盘原生快照 EBS / 云盘 API 文件系统备份(Restic / Kopia) 逐文件读取 → 写入对象存储 · 跨云可移植 适用判断 快照:块存储、RTO 短、同云恢复 文件级:跨云、细粒度、无快照能力时 卷数据 可写入

CSI 快照、云盘快照与文件系统备份的适用场景

卷备份方式的选择,取决于存储类型、恢复目标(RTO/RPO)、是否跨云以及是否需要细粒度恢复。三者并非互斥,Velero 允许在同一备份中混合使用:对有 VolumeSnapshotClass 的 PVC 走快照,其余走 Restic/Kopia。

CSI 快照是 Kubernetes 原生的卷快照机制,依赖存储驱动实现 CreateSnapshot。它的优势是与 PVC 生命周期解耦、恢复时可直接从 VolumeSnapshot 创建新 PVC,且不占用节点 CPU 去逐文件读取。前提是集群已安装 snapshot-controller 与对应 CSI 驱动,并存在可用的 VolumeSnapshotClass。它适合块存储、数据库类应用,以及 RTO 要求较短的场景。需要注意的是,快照通常与底层存储绑定,跨集群恢复时目标集群必须能访问同一存储后端。

云盘原生快照(如 AWS EBS Snapshot、阿里云云盘快照)由云厂商提供,Velero 通过对应插件调用。它比 CSI 快照更底层,适合尚未支持 CSI 快照的旧集群,或需要利用云厂商快照策略(如生命周期、跨区域复制)的场景。代价是绑定特定云,迁移性差。

文件系统备份(Restic 或 Kopia)不依赖存储快照能力,而是由节点上的 Velero 代理逐文件读取卷内容,去重后写入对象存储。它最大的价值是跨云可移植和细粒度恢复——可以只恢复某个命名空间甚至某个文件。代价是备份速度受文件数量和大小影响,且对节点资源有消耗。对于 NFS、CephFS 等不支持快照的存储,或需要把备份搬到另一朵云的场景,文件级备份几乎是唯一选择。

选型口诀:同云 + 块存储 + 要快 → CSI/云盘快照;跨云 + 无快照能力 + 要细粒度 → Restic/Kopia;两者可共存,按 PVC 打标签分流。

一个可参考的混合配置示例

假设生产集群在 AWS,部分 PVC 使用 EBS(gp3),部分使用 EFS。EBS 走 CSI 快照,EFS 走 Kopia。BackupStorageLocation 指向 S3,VolumeSnapshotLocation 指向同一区域。备份命令如下:

velero backup create prod-daily \
  --include-namespaces prod \
  --snapshot-volumes=true \
  --default-volumes-to-fs-backup=true \
  --storage-location aws-s3 \
  --volume-snapshot-locations aws-ebs \
  --ttl 720h

其中 --snapshot-volumes=true 表示优先尝试快照,--default-volumes-to-fs-backup=true 表示对没有快照能力的卷自动回退到文件级备份。执行后可用 velero backup describe prod-daily --details 查看每个卷实际走的是 Snapshot 还是 Restic/Kopia,并核对 Phase 是否为 Completed、Errors 是否为 0。若某个 EBS 卷显示 Snapshot 失败而回退到文件级,通常意味着 VolumeSnapshotClass 缺失或 CSI 驱动未就绪,应优先排查这两项,而不是直接接受回退结果。

常见误区:把对象存储的 region 与快照的可用区混为一谈。对象存储 region 只影响签名和端点;快照则受可用区约束,跨可用区恢复可能需要额外的卷重建步骤。选型时务必分别确认。

最后,无论选择哪种后端,都应在正式启用前做一次“备份—删除—恢复”的闭环演练:创建一个带数据的测试 PVC,执行备份,删除命名空间,再从备份恢复,验证数据行数与校验和一致。只有闭环通过,选型才算真正落地。