全部產品
Search
文件中心

Container Service for Kubernetes:將 OSS 資料按需預填充到高效能儲存卷

更新時間:Jan 22, 2026

在 AI 訓練、資料分析等任務開始前,將儲存於Object Storage Service 的海量冷資料按需預熱到高效能儲存卷(如 CPFS智算版、雲端硬碟),計算任務可直接從高效能卷中高速讀取資料,任務結束後儲存卷自動回收,實現計算加速與成本最佳化的平衡。

工作原理

功能實現

該功能基於 Kubernetes 的 Volume Populators 特性實現,由 ACK 的 storage-operator 進行管理。當建立引用自訂資源 OSSVolumePopulator (OSSVP) 的 PVC 時,storage-operator會攔截該請求並執行資料填充操作。

根據目標儲存卷的類型,填充操作分為以下模式。

模式

適用儲存類型

說明

bmcpfs-dataflow
原生資料流動模式

CPFS智算版

storage-operator 調用 CPFS 自身的資料流動能力進行資料填充。

此模式不佔用叢集計算資源,效率更高。

image

generic
通用 Pod 填充模式

其他類型儲存,如雲端硬碟、CPFS通用版等

storage-operator 在 ack-volume-populator 命名空間建立臨時 Pod,負責掛載建立儲存卷,並將指定 OSS 資料下載至卷內。填充完成後,該Pod 被銷毀。

此模式將佔用叢集計算資源。

image

資料填充成功後,PVC 狀態會從 Pending 變為 Bound,此時業務 Pod 便可以掛載該 PVC 並訪問已預熱的資料。

典型應用情境

該功能主要支援以下兩種典型應用情境。

維度

情境一:預熱資料至CPFS 智算版共用卷

情境二:預熱資料至雲端硬碟隔離卷

適用情境

AI 模型訓練、推理等高吞吐、唯讀密集型計算,旨在解決 OSS 訪問的效能瓶頸。

批處理、資料流水線等需要獨立、可讀寫工作空間的並行任務,旨在解決並發衝突和資料隔離問題。

技術實現

使用 CPFS 智算版,通過 bmcpfs-dataflow 模式進行原生資料填充。

使用雲端硬碟等任意動態儲存裝置,通過 generic 模式的臨時 Pod 進行通用資料填充。

核心特點

  • 成本最佳化:利用原生能力加速,不佔計算資源,儲存使用後即釋放。

  • 資料共用:支援多對一訪問,多個 GPU 任務可共用一份預熱好的資料。

  • 資料隔離與靈活性:每個任務獨佔儲存,互不干擾,適配多種動態儲存裝置類型。

  • Auto Scaling:支援一對一訪問,儲存與任務生命週期綁定,成本更為精確可控。

操作流程

兩種模式下,使用 VolumePopulator 功能的核心步驟相似。

image

  1. 環境準備:在storage-operator中開啟Feature Gate VolumePopulator

    開啟VolumePopulator後,將預設建立ack-volume-populator命名空間,用於運行資料預填充期間產生的臨時PVC與Pod。
  2. 許可權配置:為資料填充任務授予訪問 OSS 的許可權:bmcpfs-dataflow 模式需要為 OSS Bucket 打上特定標籤;generic 模式需要配置 RRSA 或 AccessKey。

  3. 定義資料來源 (OSSVP):建立一個 OSSVolumePopulator對象,定義從拉取資料的OSS Bucket路徑和填充模式。

  4. 建立儲存卷並發起預熱 (PVC):建立一個PVC對象,指定StorageClass,並使用 dataSourceRef 欄位指向此前建立的 OSSVP。此操作將啟動資料預熱流程(啟動時機取決於 StorageClass 的 volumeBindingMode)。

  5. 驗證與使用:PVC 狀態變為 Bound 後,建立業務工作負載(Pod、Deployment 等)掛載此 PVC 進行高速資料讀寫。

    資料預熱是儲存卷建立時的一次性操作。建立後,OSS 來源資料的任何修改都不會同步到該儲存卷中。
  6. 資源回收:任務結束後,刪除 PVC。若 StorageClass 的 reclaimPolicyDelete,關聯的高效能儲存資源(如 CPFS FileSet、雲端硬碟)將被自動刪除並停止計費,OSS 中的來源資料不受影響。

準備工作

  • 確認叢集為 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 任務高速讀取。

準備工作

1. 為 OSS Bucket 設定特定標籤

參見對象標籤操作方式為 OSS Bucket 設定特定標籤,cpfs-dataflowtrue

使用過程中,請勿刪除或修改此標籤,以免儲存卷建立失敗。

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

參數說明:

參數名稱

描述

是否可選

預設值

namespace

OSSVolumePopulator需要與業務應用和 PVC 處於同一命名空間。

不涉及

bucket

OSS Bucket名稱。

不涉及

region

OSS 所在地區

不涉及

endpoint

OSS 服務訪問 Endpoint 地址。

不涉及

path

OSS Bucket內的路徑首碼,如 /data/

/

mode

運行模式。可選值:

  • generic(預設):通用的資料填充模式,適用於任何後端動態儲存裝置卷(如雲端硬碟、CPFS 通用版等)。通過在 ack-volume-populator 命名空間中建立一個臨時的 Pod 來完成資料下載,此過程會消耗叢集的計算資源。

  • bmcpfs-dataflow:僅支援CPFS 智算版儲存卷的高效能模式。利用原生的資料流動能力進行資料填充,效率更高,且不佔用叢集的計算資源。

  • auto:根據目標儲存類型自動選擇最佳模式。但在絕大多數情況下會回退到 generic 模式。如需使用bmcpfs-dataflow模式,推薦手動指定。

auto

bmcpfsDataflow.throughput

CPFS 智算版資料流的最大輸送量(單位:MB/s),支援 60012001500

與 CPFS 智算版資料流動預設值一致

bmcpfsDataflow.sourceSecurityType

資料轉送的安全性通訊協定類型,例如 "SSL"表示啟用加密傳輸。

不開啟加密傳輸

bmcpfsDataflow.dataType

指定同步的資料類型:

  • metadata:僅同步檔案元資訊。

    僅同步元資訊時,實際資料將在首次讀取時從 OSS 拉取,可能影響初次訪問效能。

  • metadataAndData:同時同步元資訊和檔案內容。

metadataAndData

3. 準備 StorageClass 和 PVC

建立引用CPFS 智算版的StorageClass,然後建立 PVC 並通過 dataSourceRef 引用此前建立的 OSSVP。

建立 StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: bmcpfs-dataflow-demo
parameters:
  bmcpfsId: bmcpfs-29000z8xz3xxxxxxxxxxx
  vpcMountTarget: cpfs-29000z8xz3xxxxxxxxxxx-vpc-xxxxxx.cn-wulanchabu.cpfs.aliyuncs.com
  mountpointAutoSwitch: "true"
provisioner: bmcpfsplugin.csi.alibabacloud.com
# 關鍵:確保 PVC 刪除後,CPFS 上的 FileSet 和資料能被自動清理
reclaimPolicy: Delete
# 建議設定為 Immediate,以便 PVC 建立後立即開始資料預熱
volumeBindingMode: Immediate

通過此StorageClass建立的每個動態磁碟區預設在後端CPFS智算版建立Fileset。可通過在建立 OSSVolumePopulator時建立不同的OSSVP資源,為相同StorageClass建立的不同動態磁碟區按需預填充不同的OSS資料。

建立 PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: qwen3-32b
  namespace: bmcpfs-dataflow-demo
spec:
  accessModes:
    - ReadOnlyMany
  dataSourceRef:
    apiGroup: storage.alibabacloud.com
    kind: OSSVolumePopulator
    # 引用上面建立的 OSSVP 名稱
    name: qwen3-32b
  resources:
    requests:
      # 必須不低於 OSSVP 指向資料來源的資料量
      storage: 80Gi
  storageClassName: bmcpfs-dataflow-demo
  volumeMode: Filesystem

StorageClass配置了volumeBindingMode: Immediate,因此PVC建立後storage-operator將立即執行OSS到CPFS智算版的資料流動任務。

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 命令登入容器進行檢查。

展開查看範例程式碼

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: demo-apply-qwen3-32b
  namespace: bmcpfs-dataflow-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo-apply-qwen3-32b
  template:
    metadata:
      labels:
        app: demo-apply-qwen3-32b
      # 使用 ACS HPN 機型,掛載 CPFS 儲存卷
      # alibabacloud.com/compute-class: "gpu-hpn"
    spec:
      # 使用 ACS HPN 機型,掛載 CPFS 儲存卷
      # nodeSelector: 
      #   alibabacloud.com/node-type: reserved
      # tolerations:
      # - key: "virtual-kubelet.io/provider" 
      #   operator: "Exists"
      #   effect: "NoSchedule"
      volumes:
        - name: model-storage
          persistentVolumeClaim:
            # 指定已建立的 PVC
            claimName: qwen3-32b
        - name: dshm
          emptyDir:
            medium: Memory
            sizeLimit: 15Gi
      containers:
        - command: ["sh", "-c", "python3 -m sglang.launch_server --model-path /models/Qwen3-32B --tp 2"]
          image: registry.cn-beijing.aliyuncs.com/tool-sys/ossfs-public:demo-env-python3.12.7-sglang0.5.5
          name: sglang
          ports:
            - containerPort: 8000
              name: http
          resources:
            limits:
              nvidia.com/gpu: "2"
            requests:
              nvidia.com/gpu: "2"
          volumeMounts:
            - mountPath: /models/Qwen3-32B
              name: model-storage
            - mountPath: /dev/shm
              name: dshm

資源釋放指引

AI 訓推任務完成後,請及時釋放為其建立的 CPFS 智算版共用卷及相關工作負載。

待釋放資源:

  • 使用共用卷的工作負載(本例中為 StatefulSet

  • 用於資料預熱的PVC

  • 由 PVC 自動建立的後端儲存資源(CPFS 智算版 FileSet)

釋放流程:

  1. 刪除工作負載

    刪除正在使用該儲存卷的 StatefulSet,以解除對 PVC 的佔用。

    kubectl delete statefulset demo-apply-qwen3-32b -n bmcpfs-dataflow-demo
  2. 刪除PVC

    StorageClass 配置了 reclaimPolicy: Delete,此操作將自動觸發後端 CPFS FileSet 的自動刪除,從而釋放儲存空間並停止計費。

    kubectl delete pvc qwen3-32b -n bmcpfs-dataflow-demo
  3. 驗證資源釋放:

    • 驗證 CPFS智算版檔案系統:訪問NAS控制台,選擇檔案系統>檔案系統列表,確認該 PVC 關聯的 FileSet 已被刪除,且檔案系統的已用容量有所回落。

    • 驗證 OSS 來源資料:該操作不會改動 OSS 的來源資料。為進行驗證,可訪問OSS管理主控台,確認資料集依然完整。

情境二:預熱資料至雲端硬碟隔離卷

本方案適用於批處理工作流程,通過 Argo Workflows 為每個任務動態建立並預熱一個獨立的雲端硬碟,實現資料處理的隔離與彈性。

準備工作

  • 在storage-operator中額外開啟VolumePopulatorPodHandler

    開啟後,系統會自動為相關組件和建立的臨時 Pod 授予必要的 RBAC 許可權。請在開啟前評估此操作可能帶來的安全風險。

    關於自動設定的 RBAC 許可權

    • 為 storage-operator 授予在 ack-volume-populator 命名空間下的 Pod 操作許可權

      - apiGroups: [""]
        resources: [pods]
        verbs: [get, list, watch, create, delete]
    • 為臨時任務 Pod 授予叢集層級的存取權限

      - apiGroups: [""]
        resources: [events]
        verbs: [create, patch, get, list]
      - apiGroups: [volumepopulators.storage.alibabacloud.com]
        resources: [ossvolumepopulators]
        verbs: [get, list, watch]
  • 已安裝 Argo Workflows組件。

    展開查看具體步驟

    1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

    2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理

    3. 組件管理頁面,定位Argo Workflows,按照頁面提示完成組件的安裝。

      安裝後,您可以在叢集管理頁左側導覽列,選擇應用 > Helm,查看ack-workflow的狀態。當顯示為已部署時,表明安裝成功。

  • 情境樣本使用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

  1. ACK叢集列表頁面,單擊目的地組群名稱,選擇集群信息

  2. 基本資料頁簽的安全與審計地區,單擊RRSA OIDC右側的開啟,按照頁面提示在業務低峰期完成RRSA的啟用。

    當叢集狀態由更新中變為運行中,表明RRSA已成功啟用。

    重要

    啟用RRSA功能後,叢集內新建立的ServiceAccount Token的最大有效期間將限制為12小時。

2. 建立RAM角色並授權

建立一個供 Pod 扮演的 RAM 角色,以通過 RRSA 鑒權來訪問 OSS 儲存卷。

展開查看步驟

  1. 建立一個RAM角色。

    1. 訪問RAM控制台-建立角色頁面,選擇信任主體類型身份供應商,然後切換編輯器,進入可視化編輯頁面。

    2. 選擇主體身份供應商,單擊編輯,參見以下說明完成配置。

      主要配置如下,其餘參數保持預設即可。詳見建立OIDC身份供應商的RAM角色

      配置項

      描述

      身份供應商類型

      OIDC

      身份供應商

      選擇ack-rrsa-<cluster_id>。其中,<cluster_id>為叢集ID。

      條件

      手動添加oidc:sub。

      • 條件鍵:選擇oidc:sub

      • 運算子:選擇StringEquals

      • 條件值:預設輸入system:serviceaccount:ack-volume-populator:plugin-account

      角色名稱

      本樣本為demo-role-for-rrsa。

  2. 建立權限原則。

    本樣本遵循最小許可權原則,建立自訂權限原則,授予訪問目標OSS Bucket的許可權(OSS唯讀許可權或OSS讀寫權限)。

    訪問RAM控制台-建立權限原則頁面,切換為指令碼編輯,按照頁面提示配置策略指令碼。

    若已有授權OSS許可權的RAM角色,修改其信任策略即可複用,請參見使用已存在的RAM角色並授權

    展開查看OSS唯讀權限原則

    替換<myBucketName>為實際Bucket名稱。
    {
        "Statement": [
            {
                "Action": [
                    "oss:Get*",
                    "oss:List*"
                ],
                "Effect": "Allow",
                "Resource": [
                    "acs:oss:*:*:<myBucketName>",
                    "acs:oss:*:*:<myBucketName>/*"
                ]
            }
        ],
        "Version": "1"
    }
  3. 將該策略授權給RAM角色。

    1. 訪問RAM控制台-角色頁面,在RAM角色列表的操作列,單擊目標角色對應的新增授權

    2. 權限原則地區,按照頁面提示搜尋並選擇上一步建立的權限原則,並完成授權的新增。

AccessKey方式

  1. 建立RAM使用者(如有,可跳過)。

    訪問RAM控制台-建立使用者頁面,按照頁面提示完成RAM使用者的建立,如登入名稱稱、密碼等。

  2. 建立權限原則。

    本樣本遵循最小許可權原則,建立一個自訂權限原則,授予訪問目標OSS Bucket的許可權(OSS唯讀許可權或OSS讀寫權限)。

    訪問RAM控制台-建立權限原則頁面,切換為指令碼編輯,按照頁面提示配置策略指令碼。

    展開查看OSS唯讀權限原則

    替換<myBucketName>為實際Bucket名稱。
    {
        "Statement": [
            {
                "Action": [
                    "oss:Get*",
                    "oss:List*"
                ],
                "Effect": "Allow",
                "Resource": [
                    "acs:oss:*:*:<myBucketName>",
                    "acs:oss:*:*:<myBucketName>/*"
                ]
            }
        ],
        "Version": "1"
    }
  3. 將該策略授權給RAM使用者。

    1. 訪問RAM控制台-使用者頁面,在RAM使用者列表的操作列,單擊目標使用者對應的添加許可權

    2. 權限原則地區,按照頁面提示搜尋並選擇上一步建立的權限原則,並完成授權的新增。

  4. 為RAM使用者建立AccessKey,以便後續將其儲存為Secret,供後續資料預填充使用。

    1. 訪問RAM控制台-使用者頁面,在RAM使用者列表單擊目標使用者,然後在AccessKey地區,單擊建立 AccessKey

    2. 按照頁面提示,在對話方塊進行AccessKey的建立,擷取並妥善保管其AccessKey ID和AccessKey Secret。

  5. 在叢集中建立 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 資源,定義資料來源,並指定 modegeneric 及授權方式。

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

參數說明:

參數名稱

描述

是否可選

預設值

namespace

OSSVolumePopulator需要與業務應用和 PVC 處於同一命名空間。

不涉及

bucket

OSS Bucket名稱。

不涉及

region

OSS 所在地區

不涉及

endpoint

OSS 服務訪問 Endpoint 地址。

不涉及

path

OSS Bucket內的路徑首碼,如 /data/

/

mode

運行模式。可選值:

  • generic(預設):通用的資料填充模式,適用於任何後端動態儲存裝置卷(如雲端硬碟、CPFS 通用版等)。通過在 ack-volume-populator 命名空間中建立一個臨時的 Pod 來完成資料下載,此過程會消耗叢集的計算資源。

  • bmcpfs-dataflow:僅支援CPFS 智算版儲存卷的高效能模式。利用原生的資料流動能力進行資料填充,效率更高,且不佔用叢集的計算資源。

  • auto:根據目標儲存類型自動選擇最佳模式。但在絕大多數情況下會回退到 generic 模式。如需使用bmcpfs-dataflow模式,推薦手動指定。

auto

generic.labels

為資料填充任務 Pod 追加的 Labels,可用於指定調度到 ECI。

不涉及

generic.annotations

為資料填充任務 Pod 追加的 Annotation,可用於配置 ECI 規格。

不涉及

generic.secretRef

引用儲存 AccessKey 的 Secret 名稱,與 generic.rrsaConfigs 二選一。

不涉及

generic.rrsaConfigs.roleArn

RRSA 授權使用的 RAM 角色 ARN。

可訪問RAM控制台-角色,單擊RAM角色名稱,在詳情頁面擷取。

使用 RRSA 時必填

不涉及

generic.rrsaConfigs.oidcProviderArn

叢集的 OIDC Provider ARN。

可訪問ACK叢集列表頁面,單擊目的地組群名稱,選擇集群信息,在基本資料頁簽的RRSA OIDC地區擷取。

使用 RRSA 時必填

不涉及

generic.affinity

為資料填充任務 Pod 配置親和性,以指定調度到特定節點。

不涉及

generic.tolerations

為資料填充任務 Pod 配置容忍。

不涉及

generic.throughput

最大輸送量(單位:MB/s),用於設定資料填充任務 Pod 的最大下載速度。

與 bmcpfs-dataflow 不同,generic的實際效能受節點資源(網路、CPU)和儲存寫入能力的制約。此配置為目標上限,主要用於防止預熱任務佔用過多叢集資源。

不限制(實際速率受節點網路、CPU 及儲存寫入效能影響)

3. 準備 StorageClass

此情境需要一個用於動態建立雲端硬碟的 StorageClass。ACK提供預設StorageClass,也支援手動建立StorageClass

  • 本樣本使用alicloud-disk-essd,其reclaimPolicyDeletevolumeBindingModeImmediate,適用於使用 Serverless 算力等無需關心節點可用性區域的情境。

  • 如需使用非 Serverless 算力運行工作流程,建議使用 volumeBindingModeWaitForFirstConsumer 的StorageClass(如 alicloud-disk-topology-alltype),以確保雲端硬碟與業務 Pod 建立在同一可用性區域,避免因可用性區域不匹配導致的調度失敗。

4. 建立 Argo Workflow

以下 Workflow 樣本中使用 ephemeral 類型的 volumeClaimTemplate ,為每個並行任務動態建立一個已預填充好初始資料的獨立雲端硬碟。

展開查看範例程式碼

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: parallel-data-process-with-ossvp-
  namespace: argo
spec:
  # 定義輸入參數
  arguments:
    parameters:
      - name: number
        value: 2

  entrypoint: main
  # 定義 Workflow 中為每個並發複本建立的儲存聲明模版
  volumes:
    - name: scratch-volume
      # 聲明為臨時儲存卷,Workflow 結束後自動刪除
      ephemeral:
        volumeClaimTemplate:
          metadata:
            labels:
              diskType: scratch-volume
          spec:
            accessModes: [ "ReadWriteOnce" ]
            # 若使用非 Serverless 算力,可替換為 alicloud-disk-topology-alltype
            storageClassName: "alicloud-disk-essd"
            resources:
              requests:
                # 必須不低於 OSSVP 指向資料來源的資料量
                storage: 20Gi
            # 引用 OSSVP 作為資料來源
            dataSourceRef:
              apiGroup: storage.alibabacloud.com
              kind: OSSVolumePopulator
              name: generic-demo

  templates:
    - name: main
      dag:
        tasks:
          # 並存執行多個 echo 任務
          - name: echo-task
            template: echo-template
            arguments:
              parameters:
                - name: index
                  value: "{{item}}"
            withSequence:
              count: "{{workflow.parameters.number}}"

    - name: echo-template
      metadata:
        labels:
          # 使用 ECI 運行任務
          alibabacloud.com/eci: "true" 
      container:
        image: mirrors-ssl.aliyuncs.com/busybox:latest
        command:
          - sh
          - -c
        args:
          - |
            echo "子任務啟動,編號: {{inputs.parameters.index}}"
            echo "建立一個新的記錄檔..."
            touch /scratch-volume/"{{inputs.parameters.index}}-logs"
            echo "列出從 OSSVP 建立的磁碟中的內容:"
            ls /scratch-volume
            echo "子任務完成,編號: {{inputs.parameters.index}}"
        volumeMounts:
        - name: scratch-volume
          mountPath: /scratch-volume
        resources:
          limits:
            cpu: '4'
            memory: 16Gi
          requests:
            cpu: '4'
            memory: 16Gi
      inputs:
        parameters:
          - name: index

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 自動建立的後端儲存資源(雲端硬碟)。

釋放流程:

  1. 刪除 Argo Workflow:

    對於本情境,通常只需刪除 Workflow 資源。工作流程中使用 ephemeral 臨時卷聲明,刪除 Workflow 會自動串聯刪除其建立的所有 PVC。 StorageClass 配置了 reclaimPolicy: Delete,將進一步觸發後端雲端硬碟的自動刪除,從而釋放資源並停止計費。

    # 將 <workflow-name> 替換為 Workflow 實際名稱
    kubectl -n argo delete workflow <workflow-name>
  2. 驗證資源釋放:

    • 驗證 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 泄漏帶來的安全風險。

計費說明

本功能涉及以下計費:

  • 高效能儲存費用:根據建立的儲存卷類型(如CPFS智算版雲端硬碟)及其生命週期計費。

  • OSS 儲存費用:來源資料在 OSS 中產生的儲存費用

  • 資料轉送費用:建議在 OSSVP 中配置 OSS 的內網 Endpoint,資料轉送不產生流量費。使用公網 Endpoint 時將產生流量費用

  • 計算資源費用 (僅 generic 模式):generic 模式下的臨時 Pod 會消耗叢集計算資源(如CPU、記憶體和頻寬)並按其規格和時間長度計費。

  • CPFS 智算版資料流動任務費用(僅 bmcpfs-dataflow 模式):CPFS智算版的資料流動功能當前公測中,免費使用

常見問題

預熱完成後,更新了 OSS 上的源檔案,儲存卷裡的資料會同步更新嗎?

不會。資料預熱是在儲存卷建立時的一次性操作,卷建立成功並填充完畢後,其內容與 OSS 來源資料解耦。後續對 OSS 的任何更改都不會同步到已建立的卷上。

為什麼建立的 PVC 一直處於 Pending 狀態?

Pending 是資料預熱過程中的正常狀態。若長時間未變為 Bound,請按以下步驟排查。

  1. kubectl describe pvc <pvc-name> -n <namespace>:查看 PVC 的 Events 中是否有 Populator 相關的錯誤資訊。

  2. kubectl describe ossvp <ossvp-name> -n <namespace>:查看 OSSVP 的 Status 和 Events,確認填充任務的狀態、進度或失敗原因。

  3. 若使用 generic 模式,檢查 ack-volume-populator 命名空間下是否有失敗的 Pod,並查看其日誌,常見原因包括 OSS 許可權不足、網路不通、儲存空間不足等。