全部產品
Search
文件中心

Container Service for Kubernetes:使用strmvol儲存卷最佳化OSS小檔案讀取效能

更新時間:May 07, 2025

在容器化情境中,傳統方案常採用基於FUSE的檔案系統(如ossfs)掛載Object Storage Service資料。但對於小檔案讀取密集型情境(例如AI訓練集載入、時序日誌分析等需要快速遍曆百萬級小檔案的業務情境),傳統方案難以滿足高吞吐與低延遲需求。此時,推薦採用虛擬塊裝置方案,通過strmvol儲存卷直接掛載Object Storage Service資料,最佳化小檔案讀取效能。

注意事項

strmvol儲存卷

  • 目前僅支援以內網方式訪問OSS資料,即僅支援使用內網Endpoint。

  • 虛擬塊裝置初始化時需要構建全量的檔案元資訊索引,該階段需要佔用節點部分資源,業務Pod會處於ContainerCreating狀態。所需資源與時間與OSS Bucket掛載路徑下檔案數量緊密相關。

    • 在選擇OSS Bucket掛載路徑時應按照最小原則。

      如業務A訪問OSS Bucket中/app/a/下的內容,業務B訪問/app/b/下的內容時,建議為A、B業務分別建立掛載目標路徑為/app/a//app/b/的儲存卷。

    • 初始化期間所需時間及資源開銷,請參見中繼資料索引構建

  • 虛擬塊裝置在節點上掛載期間(除初始化階段)佔用的資源開銷受PV上的相關配置限制,請保留足夠的節點資源。

  • 單塊虛擬塊裝置容量為16 TiB,即掛載的OSS路徑下最多可儲存16 TiB資料。

叢集和節點要求

  • 叢集類型為ACK託管叢集Pro版ACK專有叢集,且叢集版本為1.20及以上,儲存外掛程式類型為CSI。

  • 節點核心版本≥4.19,資源規格建議4C8G及以上。

  • 支援的節點OS:Alibaba Cloud Linux 3、Alibaba Cloud Linux 2、CentOS 7。為使用erofs作業系統最佳化資料訪問效能,推薦使用Alibaba Cloud Linux 3。

    說明

    CentOS 7和AliyunLinux 2目前已停止維護(EOL),具體請參見【產品變更】停止維護Alibaba Cloud Linux 2、CentOS 7的公告

  • 暫不支援為調度到虛擬節點上的Serverless Pod掛載strmvol儲存卷。

準備工作

步驟一:部署strmvol-csi-driver

使用strmvol儲存卷需要部署單獨的CSI驅動(strmvol-csi-driver組件)。部署後,該CSI驅動與ACK組件管理中維護的csi-provisioner與csi-plugin組件相互獨立,不會產生衝突。

  1. 登入Container Service管理主控台,在左側導覽列,選擇市場 > 應用市場

  2. 應用市場頁面,搜尋strmvol-csi-driver,然後單擊對應的卡片。

  3. 在應用詳情頁面,單擊右上方的一鍵部署

  4. 在彈出面板中完成基本資料和參數配置,單擊確定

步驟二:配置OSS存取權限

  1. 建立RAM使用者並授權。

    1. 建立RAM使用者,如已建立可跳過。具體操作,請參見建立RAM使用者

    2. 建立如下OSS訪問的自訂權限原則。具體操作,請參見建立自訂權限原則

      以下唯讀和讀寫權限策略請根據使用需求選擇,並替換mybucket為您實際建立的Bucket名稱。

      • OSS唯讀權限原則

        展開查看OSS唯讀權限原則內容

        {
            "Statement": [
                {
                    "Action": [
                        "oss:Get*",
                        "oss:List*"
                    ],
                    "Effect": "Allow",
                    "Resource": [
                        "acs:oss:*:*:mybucket",
                        "acs:oss:*:*:mybucket/*"
                    ]
                }
            ],
            "Version": "1"
        }
      • OSS讀寫權限

        展開查看OSS讀寫權限策略內容

        {
            "Statement": [
                {
                    "Action": "oss:*",
                    "Effect": "Allow",
                    "Resource": [
                        "acs:oss:*:*:mybucket",
                        "acs:oss:*:*:mybucket/*"
                    ]
                }
            ],
            "Version": "1"
        }
    3. (可選)若您使用KMS託管的指定CMK ID加密OSS Object,還需要為該RAM使用者配置KMS許可權。具體操作,請參見加密操作

    4. 為RAM使用者添加OSS許可權。具體操作,請參見為RAM使用者授權

    5. 為RAM使用者建立AccessKey。具體操作,請參見擷取AccessKey

  2. 建立存放鑒權資訊的Secret,用於訪問OSS資料。

    命令樣本如下,請替換akIdakSecret為實際使用的AccessKey。

    kubectl create -n default secret generic strmvol-secret --from-literal='akId=xxxxxx' --from-literal='akSecret=xxxxxx'

掛載strmvol儲存卷

步驟一:建立strmvol儲存卷

使用strmvol靜態卷

  1. 建立PV。

    1. 修改以下YAML,儲存為strmvol-pv.yaml。

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: pv-strmvol
      spec:
        capacity:
        # 掛載的OSS掛載點下最高可儲存16 TiB資料。
          storage: 20Gi
        # 僅支援ReadOnlyMany訪問模式。
        accessModes:
          - ReadOnlyMany
        # 為避免刪除遠端資料,目前僅支援Retain。 
        persistentVolumeReclaimPolicy: Retain
        csi:
          driver: strmvolplugin.csi.alibabacloud.com
          volumeHandle: pv-strmvol
          # 使用準備工作中建立的secret。
          nodeStageSecretRef:
            name: strmvol-secret
            namespace: default
          volumeAttributes:
            bucket: cnfs-oss-test
            path: /subpath
            # strmvol儲存卷僅支援以內網訪問OSS資料。
            url: oss-cn-hangzhou-internal.aliyuncs.com
            umask: "000"
            directMode: "false"
            resourceLimit: "2c4g"
      • nodeStageSecretRef參數說明

        參數

        是否必選

        說明

        name

        必選

        儲存AccessKey資訊的Secret名稱。

        namespace

        必選

        儲存AccessKey資訊的Secret所在的命名空間。

      • volumeAttributes參數說明

        參數

        是否必選

        說明

        bucket

        必選

        需要掛載的OSS Bucket。

        path

        可選

        OSS Bucket掛載路徑表示掛載時相對Bucket根檔案的目錄結構。

        重要

        掛載路徑的選擇應按照最小夠用原則。

        url

        必選

        掛載OSS的內網Endpoint。Endpoint以OSS控制台Bucket概覽頁為準,常見內網格式如下:

        http://oss-{{regionName}}-internal.aliyuncs.comhttps://oss-{{regionName}}-internal.aliyuncs.com

        重要

        vpc100-oss-{{regionName}}.aliyuncs.com的內網訪問連接埠格式已廢棄,請及時切換。

        umask

        可選

        掛載虛擬塊裝置後檔案系統預設許可權的掩碼。

        如若您期望檔案系統的預設許可權為755,則umask應配置為022。

        directMode

        可選

        是否開啟direct模式。

        • "true":開啟direct模式時,關閉預取與資料本機快取,適合小檔案隨機讀情境,如訓練集的隨機批量讀取。

        • "false":預設關閉direct模式,適合小檔案順序讀、大檔案等通用情境。若您的業務沒有明顯資料讀取特性,請保持direct模式關閉。

        resourceLimit

        可選

        掛載虛擬塊裝置後能使用節點的最大資源限制。

        "2c4g"表示該虛擬塊裝置最多能佔用節點的2 vCPU、4GiB記憶體資源。

        說明
        • 記憶體主要用於資料預取與本機快取。開啟direct模式時,所需記憶體量會明顯低於預設值。

        • 對非Alibaba Cloud Linux 3作業系統,資料讀取效能上限趨近,因此不推薦使用過高配置。具體請參見資料讀取效能測試

    2. 建立PV。

      kubectl create -f strmvol-pv.yaml
    3. 確認PV狀態。

      kubectl get pv pv-strmvol

      預期返回如下:

      NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
      pv-strmvol   20Gi       ROX            Retain           Available                          <unset>                          18s
  2. 建立PVC。

    1. 修改以下YAML,儲存為strmvol-pvc-static.yaml。

      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: pvc-strmvol
        namespace: default
      spec:
        # 以下配置需要與PV一致
        accessModes:
          - ReadOnlyMany
        resources:
          requests:
            storage: 20Gi
        volumeName: pv-strmvol
    2. 建立PVC。

      kubectl create -f strmvol-pvc-static.yaml
    3. 確認PVC狀態。

      kubectl get pvc pvc-strmvol

      預期返回如下,可以看到PVC已綁定PV。

      NAME            STATUS   VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
      pvc-strmvol-2   Bound    pv-strmvol   20Gi       ROX                           <unset>                 16s

使用strmvol動態磁碟區

  1. 建立StorageClass。

    1. 修改以下YAML,儲存為strmvol-sc.yaml。

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: strmvol-test
      parameters:
        # 使用準備工作中建立的secret。
        csi.storage.k8s.io/node-stage-secret-name: strmvol-secret  
        csi.storage.k8s.io/node-stage-secret-namespace: default
        bucket: cnfs-oss-test 
        path: /subpath
        # strmvol儲存卷僅支援以內網訪問OSS資料。
        url: oss-cn-hangzhou-internal.aliyuncs.com 
        umask: "000"
        directMode: "false"
        resourceLimit: "2c4g"
      provisioner: strmvolplugin.csi.alibabacloud.com
      # 為避免刪除遠端資料,目前僅支援Retain 
      reclaimPolicy: Retain
      volumeBindingMode: Immediate

      parameters中的相關參數說明如下:

      • 配置Secret

        參數

        是否必選

        說明

        csi.storage.k8s.io/node-stage-secret-name

        必選

        儲存AccessKey資訊的Secret名稱。

        csi.storage.k8s.io/node-stage-secret-namespace

        必選

        儲存AccessKey資訊的Secret所在的命名空間。

      • 配置儲存卷

        參數

        是否必選

        說明

        bucket

        必選

        需要掛載的OSS Bucket。

        path

        可選

        OSS Bucket掛載路徑表示掛載時相對Bucket根檔案的目錄結構。

        重要

        掛載路徑的選擇應按照最小夠用原則。

        url

        必選

        掛載OSS的內網Endpoint。Endpoint以OSS控制台Bucket概覽頁為準,常見內網格式如下:

        http://oss-{{regionName}}-internal.aliyuncs.comhttps://oss-{{regionName}}-internal.aliyuncs.com

        重要

        vpc100-oss-{{regionName}}.aliyuncs.com的內網訪問連接埠格式已廢棄,請及時切換。

        umask

        可選

        掛載虛擬塊裝置後檔案系統預設許可權的掩碼。

        如若您期望檔案系統的預設許可權為755,則umask應配置為022。

        directMode

        可選

        是否開啟direct模式。

        • "true":開啟direct模式時,關閉預取與資料本機快取,適合小檔案隨機讀情境,如訓練集的隨機批量讀取。

        • "false":預設關閉direct模式,適合小檔案順序讀、大檔案等通用情境。若您的業務沒有明顯資料讀取特性,請保持direct模式關閉。

        resourceLimit

        可選

        掛載虛擬塊裝置後能使用節點的最大資源限制。

        "2c4g"表示該虛擬塊裝置最多能佔用節點的2 vCPU、4GiB記憶體資源。

        說明
        • 記憶體主要用於資料預取與本機快取。開啟direct模式時,所需記憶體量會明顯低於預設值。

        • 對非Alibaba Cloud Linux 3作業系統,資料讀取效能上限趨近,因此不推薦使用過高配置。具體請參見資料讀取效能測試

    2. 建立StorageClass。

      kubectl create -f strmvol-sc.yaml
  2. 建立PVC。

    1. 修改以下YAML,儲存為strmvol-pvc-dynamic.yaml。

      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: pvc-strmvol
        namespace: default
      spec:
        # 僅支援ReadOnlyMany訪問模式
        accessModes:
          - ReadOnlyMany
        # 指定StorageClass
        storageClassName: strmvol-test
        resources:
          requests:
            # 掛載的OSS掛載點下最高可儲存16 TiB資料
            storage: 20Gi
    2. 建立PVC。

      kubectl create -f strmvol-pvc-dynamic.yaml
    3. 確認PVC狀態。

      kubectl get pvc pvc-strmvol

      預期返回如下,可以看到PVC已綁定CSI自動建立的PV。

      NAME          STATUS   VOLUME                                         CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
      pvc-strmvol   Bound    strmvol-d8d1d22a-e1d7-4caa-b875-54f378dec769   20Gi       ROX            strmvol-test   <unset>                 3m

步驟二:建立應用並掛載strmvol儲存卷

  1. 使用以下YAML,建立strmvol-test.yaml。

    以下YAML樣本可以建立包含1個Pod的StatefulSet,Pod通過名為pvc-strmvol的PVC申請儲存資源,掛載路徑為/data

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: strmvol-test
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: strmvol-test
      template:
        metadata:
          labels:
            app: strmvol-test
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
            volumeMounts:
            - name: pvc-strmvol
              mountPath: /data
          volumes:
            - name: pvc-strmvol
              persistentVolumeClaim:
                claimName: pvc-strmvol
  2. 建立StatefulSet並掛載strmvol儲存卷。

    kubectl create -f strmvol-test.yaml
  3. 查看StatefulSet中Pod的部署情況。

    kubectl get pod -l app=strmvol-test

    預期返回:

    NAME             READY   STATUS    RESTARTS   AGE
    strmvol-test-0   1/1     Running   0          14s
  4. 驗證掛載點類型為塊裝置,且應用能正常訪問OSS資料。

    kubectl exec -it strmvol-test-0 -- sh -c "df /data && ls /data"

    預期返回:

    Filesystem     1K-blocks  Used Available Use% Mounted on
    /dev/ublkb1        24812 24812         0 100% /data
    <data in OSS mountpath>

相關文檔

strmvol用戶端效能壓測