在 AI 训练、数据分析等任务开始前,将存储于对象存储(OSS) 的海量冷数据按需预热到高性能存储卷(如 CPFS智算版、云盘),计算任务可直接从高性能卷中高速读取数据,任务结束后存储卷自动回收,实现计算加速与成本优化的平衡。
工作原理
功能实现
该功能基于 Kubernetes 的 Volume Populators 特性实现,由 ACK 的 storage-operator 进行管理。当创建引用自定义资源 OSSVolumePopulator (OSSVP) 的 PVC 时,storage-operator会拦截该请求并执行数据填充操作。
根据目标存储卷的类型,填充操作分为以下模式。
模式 | 适用存储类型 | 说明 |
| CPFS智算版 | storage-operator 调用 CPFS 自身的数据流动能力进行数据填充。 此模式不占用集群计算资源,效率更高。 |
| 其他类型存储,如云盘、CPFS通用版等 | storage-operator 在 此模式将占用集群计算资源。 |
数据填充成功后,PVC 状态会从 Pending 变为 Bound,此时业务 Pod 便可以挂载该 PVC 并访问已预热的数据。
典型应用场景
该功能主要支持以下两种典型应用场景。
维度 | ||
适用场景 | AI 模型训练、推理等高吞吐、只读密集型计算,旨在解决 OSS 访问的性能瓶颈。 | 批处理、数据流水线等需要独立、可读写工作空间的并行任务,旨在解决并发冲突和数据隔离问题。 |
技术实现 | 使用 CPFS 智算版,通过 | 使用云盘等任意动态存储,通过 |
核心特点 |
|
|
操作流程
两种模式下,使用 VolumePopulator 功能的核心步骤相似。
|
准备工作
确认集群为 1.26 及以上版本,且使用 CSI 插件。本功能依赖动态创建并预填充数据的存储卷,仅支持动态存储卷。
如需升级集群,请参见手动升级集群;如需迁移Flexvolume至CSI,请参见通过csi-compatible-controller组件迁移Flexvolume至CSI。
已升级storage-operator 至 v1.35.1 及以上版本,且已开启Feature Gate
VolumePopulator。若已有其他特性门控,参数格式为
xxxxxx=true,yyyyyy=false,VolumePopulator=true
场景一:预热数据至CPFS 智算版共享卷
本方案面向模型训练、推理等只读、高吞吐场景,利用CPFS 智算版的数据流动能力,将 OSS 中的模型按需预热到 CPFS 智算版存储卷,供多个 GPU 任务高速读取。
准备工作
已参见CPFS智算版数据流动(邀测)了解功能介绍及使用限制。
重要CPFS 智算版数据流动功能处于邀测中,大规模集群中性能可能出现波动。如遇相关问题或有相关产品建议,请加入钉群35532895联系我们。
1. 为 OSS Bucket 设置特定标签
参见对象标签操作方式为 OSS Bucket 设置特定标签,键为 cpfs-dataflow,值为 true。
使用过程中,请勿删除或修改此标签,以免存储卷创建失败。
2. 创建 OSSVolumePopulator (OSSVP)
在业务应用和PVC所在的命名空间创建 OSSVolumePopulator 资源,定义从 OSS 拉取的数据源。
apiVersion: storage.alibabacloud.com/v1beta1
kind: OSSVolumePopulator
metadata:
name: qwen3-32b
# 需要与业务应用和 PVC 处于同一命名空间
namespace: bmcpfs-dataflow-demo
spec:
bucket: <your-bucket-name>
region: cn-hangzhou
endpoint: oss-cn-hangzhou-internal.aliyuncs.com
path: /Qwen3-32B/
# 专用于 CPFS 智算版存储卷,利用其数据流动能力
mode: bmcpfs-dataflow
# 以下为 bmcpfs-dataflow 模式的可选高级配置
# 本实践推荐使用默认配置,此处仅为展示,若无特殊需求可忽略
# bmcpfsDataflow:
# 数据流动的最大吞吐 (MB/s),可选值为 600, 1200, 1500。默认为 600
# throughput: 1200
# 是否启用加密传输,默认为空(不启用)
# sourceSecurityType: SSL
# 数据预热模式。默认为 metadataAndData,实现数据完全预热
# 如需仅预热元数据,可设置为 metadata
# dataType: metadataAndData参数说明:
参数名称 | 描述 | 是否可选 | 默认值 |
| OSSVolumePopulator需要与业务应用和 PVC 处于同一命名空间。 | 否 | 不涉及 |
| OSS Bucket名称。 | 否 | 不涉及 |
| OSS 所在地域。 | 否 | 不涉及 |
| OSS 服务访问 Endpoint 地址。 | 否 | 不涉及 |
| OSS Bucket内的路径前缀,如 | 是 |
|
| 运行模式。可选值:
| 是 |
|
| CPFS 智算版数据流的最大吞吐量(单位:MB/s),支持 | 是 | 与 CPFS 智算版数据流动默认值一致 |
| 数据传输的安全协议类型,例如 | 是 | 不开启加密传输 |
| 指定同步的数据类型:
| 是 |
|
3. 准备 StorageClass 和 PVC
创建引用CPFS 智算版的StorageClass,然后创建 PVC 并通过 dataSourceRef 引用此前创建的 OSSVP。
创建 StorageClass | 通过此StorageClass创建的每个动态卷默认在后端CPFS智算版创建Fileset。可通过在创建 OSSVolumePopulator时创建不同的OSSVP资源,为相同StorageClass创建的不同动态卷按需预填充不同的OSS数据。 |
创建 PVC | StorageClass配置了 |
4. 验证数据预热状态
查询数据流动进度:数据填充期间,PVC 的状态会保持为 Pending,填充完成后变为 Bound。
对于 bmcpfs-dataflow 模式,除检查 PVC 状态外,也可通过以下命令查询实时的CPFS智算版数据流动进展。
kubectl -n bmcpfs-dataflow-demo describe ossvp qwen3-32b数据填充期间的
status为:Bmcpfs Dataflow: 62a4e7ec-fae1-4f11-848f-b57cxxxxxxxx: Data Flow Id: df-29d3ad9e9xxxxxxx Data Flow Task Id: task-2993179xxxxxxxxx File Set Id: fset-2997498xxxxxxxxx File System Id: bmcpfs-29000z8xz3lf5xxxxxxxx Progress: 59%数据填充完成后的
status为:Message: Populated successfully
5. 创建工作负载并使用数据
待 PVC 变为 Bound 后,创建工作负载挂载该 PVC。
本示例使用 GPU 资源。如仅需验证数据,可创建一个 CPU Pod,使用 kubectl exec 命令登录容器进行检查。
资源释放指引
AI 训推任务完成后,请及时释放为其创建的 CPFS 智算版共享卷及相关工作负载。
待释放资源:
使用共享卷的工作负载(本例中为
StatefulSet)用于数据预热的PVC
由 PVC 自动创建的后端存储资源(CPFS 智算版 FileSet)
释放流程:
删除工作负载
删除正在使用该存储卷的 StatefulSet,以解除对 PVC 的占用。
kubectl delete statefulset demo-apply-qwen3-32b -n bmcpfs-dataflow-demo删除PVC
StorageClass 配置了
reclaimPolicy: Delete,此操作将自动触发后端 CPFS FileSet 的自动删除,从而释放存储空间并停止计费。kubectl delete pvc qwen3-32b -n bmcpfs-dataflow-demo验证资源释放:
场景二:预热数据至云盘隔离卷
本方案适用于批处理工作流,通过 Argo Workflows 为每个任务动态创建并预热一个独立的云盘,实现数据处理的隔离与弹性。
准备工作
在storage-operator中额外开启
VolumePopulatorPodHandler。开启后,系统会自动为相关组件和创建的临时 Pod 授予必要的 RBAC 权限。请在开启前评估此操作可能带来的安全风险。
已安装 Argo Workflows组件。
场景示例使用Serverless算力(ECI)运行数据预填充任务和工作流,还需安装ack-virtual-node组件。如使用非Serverless算力验证,可删除资源中相关的labels
alibabacloud.com/eci: "true"配置。
1. 为数据预热任务授权访问 OSS
generic 模式下的数据预热任务会以一个临时 Pod 的形式运行在 ack-volume-populator 命名空间中。需为该 Pod 授予访问源数据所在 OSS Bucket 的权限。
RRSA方式:为 Pod 动态授予临时、自动轮换的 RAM 角色,实现应用级别的精细化权限隔离,安全性较高。
AccessKey方式:将静态、长期的密钥存储在 Secret 中。配置简单,但安全性较低。
RRSA方式
1. 在集群中启用RRSA
在ACK集群列表页面,单击目标集群名称,选择集群信息。
在基本信息页签的安全与审计区域,单击RRSA OIDC右侧的开启,按照页面提示在业务低峰期完成RRSA的启用。
当集群状态由更新中变为运行中,表明RRSA已成功启用。
重要启用RRSA功能后,集群内新创建的ServiceAccount Token的最大有效期将限制为12小时。
2. 创建RAM角色并授权
创建一个供 Pod 扮演的 RAM 角色,以通过 RRSA 鉴权来访问 OSS 存储卷。
AccessKey方式
创建RAM用户(如有,可跳过)。
访问RAM控制台-创建用户页面,按照页面提示完成RAM用户的创建,如登录名称、密码等。
创建权限策略。
本示例遵循最小权限原则,创建一个自定义权限策略,授予访问目标OSS Bucket的权限(OSS只读权限或OSS读写权限)。
访问RAM控制台-创建权限策略页面,切换为脚本编辑,按照页面提示配置策略脚本。
将该策略授权给RAM用户。
访问RAM控制台-用户页面,在RAM用户列表的操作列,单击目标用户对应的添加权限。
在权限策略区域,按照页面提示搜索并选择上一步创建的权限策略,并完成授权的新增。
为RAM用户创建AccessKey,以便后续将其存储为Secret,供后续数据预填充使用。
访问RAM控制台-用户页面,在RAM用户列表单击目标用户,然后在AccessKey区域,单击创建 AccessKey。
按照页面提示,在对话框进行AccessKey的创建,获取并妥善保管其AccessKey ID和AccessKey Secret。
在集群中创建 Secret。
参见以下 YAML,在
ack-volume-populator命名空间下创建一个 Secret 来存储 AccessKey。apiVersion: v1 kind: Secret metadata: name: oss-secret # 固定为 ack-volume-populator namespace: ack-volume-populator stringData: # 替换为此前获取的 AccessKey ID accessKeyId: <your-AccessKey-ID> # 替换为此前获取的 AccessKey Secret accessKeySecret: <your-AccessKey-Secret>
2. 创建 OSSVolumePopulator (OSSVP)
在业务应用和PVC所在的命名空间创建OSSVolumePopulator 资源,定义数据源,并指定 mode 为 generic 及授权方式。
apiVersion: storage.alibabacloud.com/v1beta1
kind: OSSVolumePopulator
metadata:
name: generic-demo
# 需要与业务和 PVC 处于同一命名空间
namespace: argo
spec:
bucket: my-test-bucket
region: cn-hangzhou
endpoint: oss-cn-hangzhou-internal.aliyuncs.com
path: /many-files/
# 通用模式,适用于任意后端存储卷
mode: generic
generic:
# 为数据填充任务 Pod 追加 Labels,可用于指定调度到 ECI Pod
labels:
alibabacloud.com/eci: "true"
# 为数据填充任务 Pod 追加 Annotation,可用于配置 ECI 规格
annotations:
k8s.aliyun.com/eci-use-specs: "2-4Gi"
# secretRef 与 rrsaConfigs 配置二选一
# secretRef: oss-secret
rrsaConfigs:
# RRSA 授权使用的 RAM 角色 ARN
roleArn: "acs:ram::1234567*****:role/oss-populator"
# 集群的 OIDC Provider ARN
oidcProviderArn: "acs:ram::1234567*****:oidc-provider/my-oidc-provider"
# 为数据填充任务 Pod 配置亲和性,以指定调度到特定节点
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "disktype"
operator: NotIn
values:
- "hdd"
# 为数据填充任务 Pod 配置容忍度
tolerations:
- key: "virtual-kubelet.io/provider"
operator: Equal
value: "alibabacloud"
effect: NoSchedule
# 最大吞吐量 (单位:MB/s)
# throughput: 1000参数说明:
参数名称 | 描述 | 是否可选 | 默认值 |
| OSSVolumePopulator需要与业务应用和 PVC 处于同一命名空间。 | 否 | 不涉及 |
| OSS Bucket名称。 | 否 | 不涉及 |
| OSS 所在地域。 | 否 | 不涉及 |
| OSS 服务访问 Endpoint 地址。 | 否 | 不涉及 |
| OSS Bucket内的路径前缀,如 | 是 |
|
| 运行模式。可选值:
| 是 |
|
| 为数据填充任务 Pod 追加的 Labels,可用于指定调度到 ECI。 | 是 | 不涉及 |
| 为数据填充任务 Pod 追加的 Annotation,可用于配置 ECI 规格。 | 是 | 不涉及 |
| 引用存储 AccessKey 的 Secret 名称,与 | 是 | 不涉及 |
| RRSA 授权使用的 RAM 角色 ARN。 可访问RAM控制台-角色,单击RAM角色名称,在详情页面获取。 | 使用 RRSA 时必填 | 不涉及 |
| 集群的 OIDC Provider ARN。 可访问ACK集群列表页面,单击目标集群名称,选择集群信息,在基本信息页签的RRSA OIDC区域获取。 | 使用 RRSA 时必填 | 不涉及 |
| 为数据填充任务 Pod 配置亲和性,以指定调度到特定节点。 | 是 | 不涉及 |
| 为数据填充任务 Pod 配置容忍。 | 是 | 不涉及 |
| 最大吞吐量(单位:MB/s),用于设置数据填充任务 Pod 的最大下载速度。 与 | 是 | 不限制(实际速率受节点网络、CPU 及存储写入性能影响) |
3. 准备 StorageClass
此场景需要一个用于动态创建云盘的 StorageClass。ACK提供默认StorageClass,也支持手动创建StorageClass。
本示例使用
alicloud-disk-essd,其reclaimPolicy为Delete,volumeBindingMode为Immediate,适用于使用 Serverless 算力等无需关心节点可用区的场景。如需使用非 Serverless 算力运行工作流,建议使用
volumeBindingMode为WaitForFirstConsumer的StorageClass(如alicloud-disk-topology-alltype),以确保云盘与业务 Pod 创建在同一可用区,避免因可用区不匹配导致的调度失败。
4. 创建 Argo Workflow
以下 Workflow 示例中使用 ephemeral 类型的 volumeClaimTemplate ,为每个并行任务动态创建一个已预填充好初始数据的独立云盘。
Workflow 创建完成后,查看任意任务 Pod 的日志,确认已正常读取预填充的数据。
实际生产环境中,也可通过 Argo Workflows 的 Artifact 功能将最终的计算结果持久化存储在 OSS中。
# 将 <your-workflow-pod-name> 替换为实际 Pod 名称
kubectl -n argo logs <your-workflow-pod-name>预期输出如下:
子任务启动,编号: 1
创建一个新的日志文件...
列出从 OSSVP 创建的磁盘中的内容:
1-logs
lost+found
results-2025-04-16T07:48:00Z
...
子任务完成,编号: 1结果分析:
1-logs:任务中新写入的文件,验证存储卷可读写,且不同并行任务间的存储隔离。results-2025-04-16T07:48:00Z等文件:即从 OSS 预填充到云盘中的数据,表明数据预热功能正常。lost+found:文件系统格式化后自动生成的目录,可忽略。
资源释放指引
批处理任务完成后,请及时释放由 Argo Workflow 动态创建的云盘隔离卷及相关工作流。
待释放的资源:
Argo Workflow 实例
由 Workflow 自动创建的临时PVC
由 PVC 自动创建的后端存储资源(云盘)。
释放流程:
删除 Argo Workflow:
对于本场景,通常只需删除
Workflow资源。工作流中使用ephemeral临时卷声明,删除 Workflow 会自动级联删除其创建的所有 PVC。StorageClass配置了reclaimPolicy: Delete,将进一步触发后端云盘的自动删除,从而释放资源并停止计费。# 将 <workflow-name> 替换为 Workflow 实际名称 kubectl -n argo delete workflow <workflow-name>验证资源释放:
验证 PVC:执行
kubectl -n argo get pvc,确认与该工作流相关的 PVC 均已被删除。验证云盘资源:访问ECS控制台-块存储-云盘,在云盘列表中确认没有因该工作流产生的云盘资源残留。
验证 OSS 源数据:该操作不会改动 OSS 的源数据。为进行验证,可访问OSS管理控制台,确认数据集依然完整。
生产环境使用建议
成本与资源管理:
设置资源自动回收:为动态创建卷的 StorageClass 设置
reclaimPolicy: Delete,确保任务结束后,高性能存储资源被自动清理。优化数据填充成本(
generic模式):在generic模式下,数据填充会消耗计算资源,通过在OSSVolumePopulator中配置affinity和tolerations,可将临时任务 Pod 调度到成本更低的Serverless算力(包括ACS、ECI)或抢占式实例上运行。规划存储容量:创建 PVC 时申请的
storage容量需大于源数据大小,否则数据填充将因空间不足而失败。
性能与稳定性:
云盘可用区对齐:云盘是可用区级别的资源。在 ECS 节点上使用时,建议将
StorageClass的volumeBindingMode设置为WaitForFirstConsumer,以确保云盘始终与业务 Pod 创建在同一个可用区,避免因跨可用区调度而导致的挂载失败。权衡 CPFS 智算版预热模式:若追求 PV 快速就绪,允许首次读取文件时有一定延迟,可选择
dataType: metadata模式;若业务对首次读取性能要求高,希望数据完全预热,则应选择dataType: metadataAndData模式。状态观测:通过
kubectl describe ossvp <name>关注数据预热任务的状态和事件,以便快速监控和排查问题。
安全与权限:
使用 RRSA 安全授权:在
generic模式下,为数据填充任务 Pod 授予 OSS 访问权限时,推荐使用 RRSA方式,避免 AccessKey 泄漏带来的安全风险。
计费说明
本功能涉及以下计费:
常见问题
预热完成后,更新了 OSS 上的源文件,存储卷里的数据会同步更新吗?
不会。数据预热是在存储卷创建时的一次性操作,卷创建成功并填充完毕后,其内容与 OSS 源数据解耦。后续对 OSS 的任何更改都不会同步到已创建的卷上。
为什么创建的 PVC 一直处于 Pending 状态?
Pending 是数据预热过程中的正常状态。若长时间未变为 Bound,请按以下步骤排查。
kubectl describe pvc <pvc-name> -n <namespace>:查看 PVC 的 Events 中是否有 Populator 相关的错误信息。kubectl describe ossvp <ossvp-name> -n <namespace>:查看 OSSVP 的 Status 和 Events,确认填充任务的状态、进度或失败原因。若使用
generic模式,检查ack-volume-populator命名空间下是否有失败的 Pod,并查看其日志,常见原因包括 OSS 权限不足、网络不通、存储空间不足等。