ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Velero CSI 快照支持:基于 Kubernetes CSI VolumeSnapshot API 的持久卷备份与恢复

Velero CSI 快照支持:基于 Kubernetes CSI VolumeSnapshot API 的持久卷备份与恢复 Velero CSI 快照支持基于 Kubernetes CSI VolumeSnapshot API 的持久卷备份与恢复【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/veleroVelero当前仓库为 vmware-tanzu/velero 代码库通过集成 Kubernetes Container Storage InterfaceCSIVolumeSnapshot API实现了对任意具备 CSI 驱动存储提供商的持久卷PersistentVolume快照备份与恢复能力。本文以仓库文档 site/content/docs/main/csi.md 为主体结合仓库内 CSI 插件源码pkg/backup/actions/csi/、pkg/restore/actions/csi/、pkg/util/csi/volume_snapshot.go深入讲解启用方式、VolumeSnapshotClass 选择策略、快照生命周期管理与底层工作流程。读完本文你将掌握如何为 Velero 开启 CSI 快照功能、如何在不同粒度上指定 VolumeSnapshotClass以及备份与恢复背后的完整执行链路。一、背景为什么 Velero 需要 CSI 快照传统上Velero 依赖Velero VolumeSnapshotter 插件对特定云厂商的持久卷做快照。而 CSI 已经是 Kubernetes 存储生态的标准接口几乎每个云厂商和存储厂商都提供 CSI 驱动。通过支持 Kubernetes CSI Snapshot APIVelero 可以支持所有提供 CSI 驱动的存储提供商无需为每个提供商单独开发 Velero 专属插件复用 Kubernetes 生态中external-snapshotter控制器与 CSI 驱动的成熟快照能力在备份与恢复时直接操作VolumeSnapshot/VolumeSnapshotContent这类标准的 Kubernetes 对象。这一设计使 Velero 的 CSI 快照支持不依赖 Velero 自身的 VolumeSnapshotter 插件接口而是由一组 BackupItemAction备份项动作插件和 RestoreItemAction恢复项动作插件实现详见下文工作原理。二、重要变更说明CSI 插件已并入 Velero 主仓库从 release-1.14 开始原独立维护的velero-plugin-for-csi仓库已合并进github.com/velero-io/velero主仓库即当前仓库合并动机包括VolumeSnapshot 数据移动snapshot data movement功能依赖 CSI 插件合并后更便于集成降低了 Velero 的部署复杂度不再需要单独安装 CSI 插件为后续性能调优提供了便利。因此从 v1.14 起无需再单独安装 Velero CSI 插件。从 v1.16 开始当 Velero 将备份同步到新集群时用于创建快照的 VolumeSnapshotClass 也会一并同步到目标集群以便 Velero 正确管理备份过期。三、前置条件启用 CSI 快照支持前需要满足以下条件Kubernetes 版本不低于 1.20VolumeSnapshot API 自 1.20 起进入 GA即snapshot.storage.k8s.io/v1集群中运行的CSI 驱动需在 v1 API 级别支持卷快照跨集群恢复 CSI VolumeSnapshot 时目标集群中 CSI 驱动的名称必须与源集群一致才能保证 CSI VolumeSnapshot 的跨集群可移植性。注意并非所有云厂商的 CSI 驱动都能保证快照持久性——VolumeSnapshot与VolumeSnapshotContent对象可能与原始 PersistentVolume 存储在同一个对象存储系统中存在数据丢失风险。请查阅你的云厂商文档了解快照持久性的配置方式。此外文档明确指出自 v0.3.0 起Velero 团队将为搭配 AWS 与 Azure 驱动使用的 CSI 插件提供官方支持。四、安装启用 EnableCSI 特性开关要集成 CSI VolumeSnapshot API需要在安装时启用EnableCSI特性开关feature flagvelero install \ --featuresEnableCSI \ --pluginsobject storage plugin \ ...其中object storage plugin为对象存储插件如 AWS、Azure、GCP 或 MinIO 等。EnableCSI特性开关在仓库常量中有明确定义参见 pkg/apis/velero/v1/constants.go 与安装相关测试 pkg/install/deployment_test.go。如果希望在velero backup describe的输出中包含与备份关联的 CSI 对象状态还需要在客户端设置同名特性开关velero client config set featuresEnableCSI关于客户端特性开关的更多管理方式可参考仓库文档 customize-installation.md 中的服务端特性启用说明。五、实现选择快照生命周期与清理策略文档记录了实现 CSI 快照时的几个关键设计决策这些决策同样反映在源码中。5.1 VolumeSnapshot 仅随备份存活由 Velero CSI 插件创建的 VolumeSnapshot即使其 VolumeSnapshotClass 的DeletionPolicy设置为Retain也只在备份存续期间保留。实现方式是在删除备份、删除 VolumeSnapshot 之前先对关联的 VolumeSnapshotContent 对象打补丁将其DeletionPolicy修改为Delete随后删除 VolumeSnapshot 对象从而级联删除 VolumeSnapshotContent 以及存储提供商的底层快照。源码中的对应实现位于 pkg/util/csi/volume_snapshot.goCleanupVolumeSnapshot在删除 VolumeSnapshot 前调用SetVolumeSnapshotContentDeletionPolicypkg/util/csi/volume_snapshot.go#L549-L564将 VSC 的DeletionPolicy置为Delete而patchVSC则通过 JSON Merge Patch 方式更新 VSCpkg/util/csi/volume_snapshot.go#L292-L322。5.2 清理游离的 VolumeSnapshotContent备份过程中若产生了未绑定到任何 VolumeSnapshot 的游离VolumeSnapshotContent 对象会在备份删除时借助标签被自动发现并清理。5.3 VolumeSnapshotClass 选择逻辑五级策略Velero CSI 插件为 CSI 背书的 PVC 创建快照时会按下述优先级选择 VolumeSnapshotClass。源码中的完整选择链位于GetVolumeSnapshotClass[pkg/util/csi/volume_snapshot.go#L324-L377]选择顺序为PVC 注解 → Volume Policy → Backup/Schedule 注解 → 标签/注解默认类 → 唯一类兜底。① 默认类基于 Annotation为未显式指定类的 VolumeSnapshot 设置默认 VolumeSnapshotClass可以在 VolumeSnapshotClass 上添加 Kubernetes 标准注解snapshot.storage.kubernetes.io/is-default-class: true。例如为 CSI 驱动disk.csi.cloud.com创建默认快照类apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: test-snapclass-by-annotation annotations: snapshot.storage.kubernetes.io/is-default-class: true driver: disk.csi.cloud.com注意如果集群中存在多个 CSI 驱动可以为每个驱动分别指定一个默认 VolumeSnapshotClass。② 默认类基于 Label也可以为某个驱动创建 VolumeSnapshotClass 并打上 Velero 专用标签velero.io/csi-volumesnapshot-class: true来标记其为该驱动的默认快照类apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: test-snapclass-by-label labels: velero.io/csi-volumesnapshot-class: true driver: disk.csi.cloud.com注意对于每种驱动类型只能有一个带velero.io/csi-volumesnapshot-class: true标签的 VolumeSnapshotClass。从源码GetVolumeSnapshotClassForStorageClass[pkg/util/csi/volume_snapshot.go#L470-L512]可以看到完整的兜底规则优先匹配驱动名且带 Velero 标签的类其次匹配驱动名且带 Kubernetes 默认注解的类若该驱动只有一个快照类则直接返回否则报错并提示为期望的 VolumeSnapshotClass 打上标签或注解。③ 为特定 Backup / Schedule 指定类如需为某个备份或定时调度指定特定 VolumeSnapshotClass可在 Backup/Schedule 对象上添加注解注解格式为velero.io/csi-volumesnapshot-class_driver name VolumeSnapshotClass Name例如对disk.csi.cloud.com驱动的 PVC 使用test-snapclass类apiVersion: velero.io/v1 kind: Backup metadata: name: test-backup annotations: velero.io/csi-volumesnapshot-class_disk.csi.cloud.com: test-snapclass spec: includedNamespaces: - default注意所有注解必须为小写格式严格遵循velero.io/csi-volumesnapshot-class_driver name VolumeSnapshotClass Name。源码实现见GetVolumeSnapshotClassFromBackupAnnotationsForDriver[pkg/util/csi/volume_snapshot.go#L409-L438]。④ 通过 Volume Policy 选择如果希望基于 StorageClass 等条件选择特定 VolumeSnapshotClass可以在卷策略volume policy的snapshot动作中指定snapshotClass参数。这在多个存储阵列共享同一 CSI 驱动、但需要不同 VolumeSnapshotClass 的场景下非常有用version: v1 volumePolicies: - conditions: storageClass: - nutanix-files action: type: snapshot parameters: snapshotClass: nutanix-files-snapclass该方式会覆盖备份/调度注解和 VolumeSnapshotClass 标签但会被 PVC 级注解覆盖。源码对应GetVolumeSnapshotClassFromVolumePolicy[pkg/util/csi/volume_snapshot.go#L443-L466]其参数由VolumeHelper.GetSnapshotClass从卷策略中解析而来详见 internal/volumehelper/volume_policy_helper.go。更多卷策略示例见 resource-filtering.md。⑤ 为特定 PVC 指定类在 PVC 上添加注解velero.io/csi-volumesnapshot-class即可为单个 PVC 指定 VolumeSnapshotClass该方式优先级最高覆盖其他所有选择方式apiVersion: v1 kind: PersistentVolumeClaim metadata: name: test-pvc annotations: velero.io/csi-volumesnapshot-class: test-snapclass spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: disk.csi.cloud.com源码对应GetVolumeSnapshotClassFromPVCAnnotationsForDriver[pkg/util/csi/volume_snapshot.go#L379-L404]且会校验所指定类的驱动名与 StorageClass 的 provisioner 是否一致。5.4 备份上传后移除 VolumeSnapshot 对象VolumeSnapshot 对象会在备份上传到对象存储之后从集群中移除这样在DeletionPolicy为Delete时被备份的命名空间可以安全删除而不会连带删除存储提供商的快照。六、工作原理CSI 快照的备份与恢复链路6.1 备份侧从 PVC 到 VolumeSnapshotVelero 的 CSI 支持不依赖 Velero VolumeSnapshotter 插件接口而是使用一组 BackupItemAction 插件这些插件首先作用于 PersistentVolumeClaim。备份侧插件位于 pkg/backup/actions/csi/pvc_action.goPVCBackupItemAction核心入口volumesnapshot_action.go、volumesnapshotcontent_action.go、volumesnapshotclass_action.go处理对应 CSI 对象的备份打包。整体流程如下PVCBackupItemAction处理 PVC 时[pkg/backup/actions/csi/pvc_action.go#L288-L488]首先校验 PVC 的 StorageClass 与底层 PV 是否为 CSI 卷validatePVCAndPVpvc_action.go#L164-L212非 CSI 卷会打上SkippedNoCSIPVAnnotation注解并跳过依据上文的选择链确定与该 PVC 匹配的 VolumeSnapshotClass创建一个以该 PVC 为 source 的 VolumeSnapshot 对象VolumeSnapshot 与源 PVC 位于同一命名空间createVolumeSnapshotpvc_action.go#L214-L282并通过GenerateName以velero-pvcName-前缀命名CSIexternal-snapshotter控制器观察到该 VolumeSnapshot 后创建集群作用域的 VolumeSnapshotContent 对象并调用 CSI 驱动的快照方法由驱动调用存储系统 API 生成磁盘级快照快照生成完成后VolumeSnapshotContent 会更新status.snapshotHandle并将status.readyToUse置为可用Velero 通过WaitUntilVSCHandleIsReady[pkg/util/csi/volume_snapshot.go#L656-L781]轮询等待 VSC 具备 snapshotHandle该函数支持通过环境变量CSI_SNAPSHOT_EARLY_FREQUENT_POLLING开启先高频后低频的两段式轮询高频段 1 秒间隔、10 秒超时低频段 5 秒间隔直至backup.Spec.CSISnapshotTimeout以适配 Microsoft VSS 备份 10 秒硬编码 unfreeze 的场景等待就绪后插件把 VolumeSnapshot 作为 additionalItems 加入备份并为 PVC 打上velero.io/volume-snapshot标签与velero.io/must-include注解确保后续打包备份 tarball 会包含生成的 VolumeSnapshot 与 VolumeSnapshotContent 对象同时所有 VolumeSnapshot / VolumeSnapshotContent 对象还会以JSON 文件形式上传到对象存储。注意上传到对象存储的只有 Kubernetes 对象不含快照数据本身。6.2 恢复侧以 VolumeSnapshot 作为 PVC 数据源恢复侧插件位于 pkg/restore/actions/csi/。其中PVCCSIRestoreItemAction[pkg/restore/actions/csi/pvc_action.go#L81-L138]的核心逻辑检查备份中 PVC 是否带有velero.io/volume-snapshot注解没有则跳过为避免命名冲突基于恢复 UID 与旧 VolumeSnapshot 名称生成新的唯一快照名util.GenerateSha256FromRestoreUIDAndVsName调用resetPVCSourceToVolumeSnapshotpvc_action.go#L303-L314将 PVC 的spec.volumeName清空并把spec.dataSource指向 VolumeSnapshotapiGroup: snapshot.storage.k8s.io、kind: VolumeSnapshot使新卷在创建时由存储系统从快照预填充数据将 VolumeSnapshot 加入 additionalItems 强制执行配合velero.io/must-include恢复侧注解从而在恢复过程中重建快照对象实现跨集群恢复。6.3 DeletionPolicy 与备份过期VolumeSnapshotContent 上的DeletionPolicy与创建该 VolumeSnapshot 所用 VolumeSnapshotClass 上的DeletionPolicy保持一致将 VolumeSnapshotClass 的DeletionPolicy设为Retain会在 Velero 备份存续期间保留存储系统中的卷快照并防止因灾难导致包含 VolumeSnapshot 对象的命名空间丢失时存储系统的快照被误删当 Velero 备份过期时VolumeSnapshot 对象会被删除VolumeSnapshotContent 会被更新为DeletionPolicyDelete从而释放存储系统空间对应pkg/util/csi/volume_snapshot.go中EnsureDeleteVS/EnsureDeleteVSC/DeleteReadyVolumeSnapshot等清理函数。6.4 快照数据移动Snapshot Data Movement从源码看当备份启用SnapshotMoveData即数据移动时PVCBackupItemAction不再把 VolumeSnapshot 简单加入备份 tarball而是创建一个DataUploadCRcreateDataUpload[pkg/backup/actions/csi/pvc_action.go#L634-L653]由内置数据移动器将快照数据上传到对象存储实现快照数据移动相关文档可参见 csi-snapshot-data-movement.md。此时插件作为 v2 异步插件返回 operationID并提供Progress/Cancel接口跟踪 DataUpload 进度pvc_action.go#L494-L558。恢复侧则通过DataUploadResultConfigMap与DataDownloadCR 完成数据回填并支持ExistingVolumeDataPolicy原位置恢复与基于 CBT 的增量恢复pvc_action.go#L204-L301。该流程要求 node-agent 就绪否则插件会在创建 DataUpload 前报错并让备份部分失败pvc_action.go#L349-L358。七、云厂商原生插件与 CSI 快照的互补关系需要说明的是AWS、Microsoft Azure、GCP 的 Velero 插件v1.4 及以后能够直接通过云厂商 API 对 CSI 驱动供应的持久卷做快照与恢复无需安装 Velero CSI 插件相关驱动的支持范围以对应插件仓库说明为准。而从 v1.14 起Velero 主仓库已内置 CSI 插件能力因此无论采用云厂商原生快照还是 CSI 快照都无需再单独安装 CSI 插件。八、相关资源官方指南site/content/docs/main/csi.md备份侧插件实现pkg/backup/actions/csi/pvc_action.go、pkg/backup/actions/csi/volumesnapshot_action.go、pkg/backup/actions/csi/volumesnapshotcontent_action.go恢复侧插件实现pkg/restore/actions/csi/pvc_action.go、pkg/restore/actions/csi/volumesnapshot_action.go快照工具库pkg/util/csi/volume_snapshot.go含类选择、就绪等待、生命周期清理及对应测试 pkg/util/csi/volume_snapshot_test.go卷策略辅助internal/volumehelper/volume_policy_helper.go相关文档csi-snapshot-data-movement.md、volume-group-snapshots.md、resource-filtering.md、customize-installation.md【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表