在 AI 訓練、資料分析等任務開始前,將儲存於Object Storage Service 的海量冷資料按需預熱到高效能儲存卷(如 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控制台-Block Storage-雲端硬碟,在雲端硬碟列表中確認沒有因該工作流程產生的雲端硬碟資源殘留。
驗證 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 許可權不足、網路不通、儲存空間不足等。