Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Optimize OSS small file reads with strmvol volumes

Última actualización: Sep 04, 2026

En aplicaciones contenedorizadas, un método convencional para montar datos de object storage consiste en utilizar un sistema de archivos basado en Filesystem in Userspace (FUSE), como ossfs. Sin embargo, este enfoque suele ser insuficiente en escenarios de lectura intensiva que involucran millones de archivos pequeños, como la carga de conjuntos de datos de entrenamiento de IA o el análisis de registros de series temporales, donde son críticos un alto rendimiento y una baja latencia. Para estos casos de uso, se recomienda emplear una solución de dispositivo de bloque virtual. Al montar los datos de object storage directamente con un volumen strmvol, es posible optimizar significativamente el rendimiento de lectura de archivos pequeños.

Notas de uso

Volúmenes strmvol

  • Solo se pueden usar endpoints internos para acceder a los datos de OSS.

  • Cuando se inicializa un dispositivo de bloque virtual, este construye un índice completo de metadatos de archivos. Este proceso consume recursos del nodo y provoca que el pod de la aplicación permanezca en estado ContainerCreating. El tiempo y los recursos necesarios son directamente proporcionales a la cantidad de archivos en la ruta de montaje del bucket de OSS.

    • Al seleccionar una ruta de montaje de bucket de OSS, siga el principio de menor privilegio.

      Si el Negocio A accede al contenido bajo /app/a/ en un bucket de OSS y el Negocio B accede al contenido bajo /app/b/, cree volúmenes separados para el Negocio A y el Negocio B con rutas de destino de montaje /app/a/ y /app/b/, respectivamente.

    • Para obtener información sobre el tiempo y la sobrecarga de recursos durante la inicialización, consulte Metadata index construction.

  • La configuración del PersistentVolume (PV) limita el consumo de recursos del dispositivo de bloque virtual durante su ciclo de vida de montaje, excluyendo la fase de inicialización. Asegúrese de reservar suficientes recursos en el nodo.

  • Un solo dispositivo de bloque virtual tiene una capacidad de 16 TiB, lo que significa que la ruta de OSS montada también está limitada a 16 TiB de datos.

Requisitos del clúster y de los nodos

  • El clúster debe ser un clúster administrado ACK Pro o un clúster dedicado ACK que ejecute Kubernetes 1.20 o posterior. El plugin de almacenamiento debe ser un plugin de Container Storage Interface (CSI).

  • Los nodos deben usar la versión del kernel 4.19 o posterior. Se recomiendan especificaciones de recursos de como mínimo 4 vCPU y 8 GiB de memoria.

  • Sistemas operativos de nodo compatibles: Alibaba Cloud Linux 3, Alibaba Cloud Linux 2 y CentOS 7. Para optimizar el rendimiento de acceso a datos con el sistema operativo erofs, se recomienda utilizar Alibaba Cloud Linux 3.

    Nota

    CentOS 7 y Alibaba Cloud Linux 2 han llegado al final de su vida útil (EOL). Para más información, consulte [[Product Change] Announcement on the Discontinuation of Support for Alibaba Cloud Linux 2 and CentOS 7](t2602809.xdita#).

  • No es posible montar volúmenes strmvol en un pod serverless programado en un nodo virtual.

Requisitos previos

Paso 1: Desplegar el strmvol-csi-driver

Para usar volúmenes strmvol, debe desplegar un controlador CSI independiente, el componente strmvol-csi-driver. Después del despliegue, este controlador CSI opera de forma independiente y no entra en conflicto con los componentes csi-provisioner y csi-plugin gestionados por ACK.

  1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, elija Marketplace > Marketplace.

  2. En la página Marketplace, busque strmvol-csi-driver y haga clic en su tarjeta.

  3. En la página de detalles de la aplicación, haga clic en Deploy en la esquina superior derecha.

  4. En el panel que aparece, configure la información básica y los parámetros, y luego haga clic en OK.

Paso 2: Configurar permisos de acceso a OSS

  1. Cree un usuario RAM y otorgue los permisos necesarios.

    1. Cree un usuario RAM. Puede omitir este paso si ya cuenta con un usuario RAM.

      Vaya a la página Crear usuario en la consola de RAM y siga las instrucciones en pantalla para crear un usuario RAM. Debe especificar parámetros como el nombre de inicio de sesión y la contraseña.

    2. Cree una política personalizada para el acceso a OSS. Para más información, consulte Create a custom policy.

      Elija entre las siguientes políticas de permisos de solo lectura y de lectura/escritura según sus necesidades, y reemplace mybucket con el nombre de su bucket.

      • Política de solo lectura de OSS

        Haga clic para ver la política de solo lectura

        {
            "Statement": [
                {
                    "Action": [
                        "oss:Get*",
                        "oss:List*"
                    ],
                    "Effect": "Allow",
                    "Resource": [
                        "acs:oss:*:*:mybucket",
                        "acs:oss:*:*:mybucket/*"
                    ]
                }
            ],
            "Version": "1"
        }
      • Política de lectura/escritura de OSS

        Haga clic para ver la política de lectura/escritura

        {
            "Statement": [
                {
                    "Action": "oss:*",
                    "Effect": "Allow",
                    "Resource": [
                        "acs:oss:*:*:mybucket",
                        "acs:oss:*:*:mybucket/*"
                    ]
                }
            ],
            "Version": "1"
        }
    3. (Opcional) Si cifra objetos de OSS con una clave maestra de cliente (CMK) de Key Management Service (KMS), también debe otorgar permisos de KMS al usuario RAM. Para más información, consulte Encrypt ossfs 1.0 volumes.

    4. Otorgue los permisos de OSS al usuario RAM. Para más información, consulte Manage RAM user permissions.

    5. La AccessKey que cree se almacenará como un Secret para el PV.

      1. Vaya a la página Usuarios en la consola de RAM, haga clic en el nombre de su usuario RAM y, a continuación, en la sección AccessKey, haga clic en Create AccessKey.

      2. Siga las instrucciones en pantalla para crear una AccessKey. Copie y almacene de forma segura el AccessKey ID y el AccessKey Secret.

  2. Cree un secret para almacenar las credenciales de autenticación necesarias para acceder a los datos de OSS.

    A continuación se muestra un comando de ejemplo. Reemplace akId y akSecret con su AccessKey ID y su AccessKey secret.

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

Montar un volumen strmvol

Paso 1: Crear un volumen strmvol

Volumen estático

  1. Cree un PersistentVolume (PV).

    1. Cree un archivo llamado strmvol-pv.yaml con el siguiente contenido.

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: pv-strmvol
      spec:
        capacity:
        # The mounted OSS path can store a maximum of 16 TiB of data.
          storage: 20Gi
        # Only the ReadOnlyMany access mode is supported.
        accessModes:
          - ReadOnlyMany
        # To prevent accidental data loss, only the Retain policy is supported. 
        persistentVolumeReclaimPolicy: Retain
        csi:
          driver: strmvolplugin.csi.alibabacloud.com
          volumeHandle: pv-strmvol
          # Use the secret created in the prerequisite steps.
          nodeStageSecretRef:
            name: strmvol-secret
            namespace: default
          volumeAttributes:
            bucket: cnfs-oss-test
            path: /subpath
            # strmvol volumes only support accessing OSS data over an internal network.
            url: oss-cn-hangzhou-internal.aliyuncs.com
            umask: "000"
            directMode: "false"
            resourceLimit: "2c4g"
      • Parámetros en nodeStageSecretRef

        Parámetro

        Obligatorio

        Descripción

        name

        Sí

        Nombre del secret que almacena la información de la AccessKey.

        namespace

        Sí

        Namespace del secret que contiene la información de la AccessKey.

      • Parámetros en volumeAttributes

        Parámetro

        Obligatorio

        Descripción

        bucket

        Sí

        El bucket de OSS que se va a montar.

        path

        No

        La ruta del directorio que se va a montar dentro del bucket de OSS. Esta ruta es relativa a la raíz del bucket.

        Importante

        Seleccione una ruta de montaje basada en el principio de menor privilegio.

        url

        Sí

        El endpoint interno para OSS. Debe coincidir con el endpoint mostrado en la página Overview del bucket en la consola de OSS. Los formatos comunes para endpoints internos incluyen:

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

        Importante

        El formato de endpoint interno vpc100-oss-{{regionName}}.aliyuncs.com está obsoleto. Actualice a un nuevo formato lo antes posible.

        umask

        No

        La máscara de permisos para el sistema de archivos después de montar el dispositivo de bloque virtual.

        Por ejemplo, para establecer los permisos predeterminados de archivo en 755, configure umask en 022.

        directMode

        No

        Especifica si se habilita el modo directo.

        • "true": Habilita el modo directo, lo que desactiva la precarga de datos y el almacenamiento en caché local. Es adecuado para escenarios de lectura aleatoria, como la lectura por lotes aleatorios de conjuntos de datos de entrenamiento.

        • "false": Desactiva el modo directo (predeterminado). Es adecuado para escenarios de propósito general, como lecturas secuenciales de archivos pequeños o lecturas de archivos grandes. Si su aplicación no tiene un patrón específico de acceso a datos, mantenga este modo desactivado.

        resourceLimit

        No

        Los recursos máximos del nodo que puede consumir el dispositivo de bloque virtual.

        Por ejemplo, "2c4g" indica que el dispositivo de bloque virtual puede usar hasta 2 vCPU y 4 GiB de memoria del nodo.

        Nota
        • La memoria se utiliza principalmente para la precarga de datos y el almacenamiento en caché local. Cuando el modo directo está habilitado, el uso de memoria es significativamente menor que el valor preestablecido.

        • Para sistemas operativos distintos de Alibaba Cloud Linux 3, el rendimiento de lectura es similar independientemente de la configuración. Por lo tanto, no se recomiendan límites de recursos altos. Para más información, consulte Data read performance tests.

    2. Cree el PV.

      kubectl create -f strmvol-pv.yaml
    3. Compruebe el estado del PV.

      kubectl get pv pv-strmvol

      Salida esperada:

      NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
      pv-strmvol   20Gi       ROX            Retain           Available                          <unset>                          18s
  2. Cree un PersistentVolumeClaim (PVC).

    1. Cree un archivo llamado strmvol-pvc-static.yaml con el siguiente contenido.

      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: pvc-strmvol
        namespace: default
      spec:
        # The following settings must match the PV configuration.
        accessModes:
          - ReadOnlyMany
        resources:
          requests:
            storage: 20Gi
        volumeName: pv-strmvol
    2. Cree el PVC.

      kubectl create -f strmvol-pvc-static.yaml
    3. Compruebe el estado del PVC.

      kubectl get pvc pvc-strmvol

      La salida esperada muestra que el PVC ahora está vinculado al PV.

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

Volumen dinámico

  1. Cree una StorageClass.

    1. Cree un archivo llamado strmvol-sc.yaml con el siguiente contenido.

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: strmvol-test
      parameters:
        # Use the secret created in the prerequisite steps.
        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 volumes only support accessing OSS data over an internal network.
        url: oss-cn-hangzhou-internal.aliyuncs.com 
        umask: "000"
        directMode: "false"
        resourceLimit: "2c4g"
      provisioner: strmvolplugin.csi.alibabacloud.com
      # To prevent accidental data loss, only the Retain policy is supported. 
      reclaimPolicy: Retain
      volumeBindingMode: Immediate

      Los parámetros en parameters se describen a continuación:

      • Configuración del secret

        Parámetro

        Obligatorio

        Descripción

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

        Sí

        Nombre del secret que almacena la información de la AccessKey.

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

        Sí

        Namespace del secret que contiene la información de la AccessKey.

      • Configuración del volumen

        Parámetro

        Obligatorio

        Descripción

        bucket

        Sí

        El bucket de OSS que se va a montar.

        path

        No

        La ruta del directorio que se va a montar dentro del bucket de OSS. Esta ruta es relativa a la raíz del bucket.

        Importante

        Seleccione una ruta de montaje basada en el principio de menor privilegio.

        url

        Sí

        El endpoint interno para OSS. Debe coincidir con el endpoint mostrado en la página Overview del bucket en la consola de OSS. Los formatos comunes para endpoints internos incluyen:

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

        Importante

        El formato de endpoint interno vpc100-oss-{{regionName}}.aliyuncs.com está obsoleto. Actualice a un nuevo formato lo antes posible.

        umask

        No

        La máscara de permisos para el sistema de archivos después de montar el dispositivo de bloque virtual.

        Por ejemplo, para establecer los permisos predeterminados de archivo en 755, configure umask en 022.

        directMode

        No

        Especifica si se habilita el modo directo.

        • "true": Habilita el modo directo, lo que desactiva la precarga de datos y el almacenamiento en caché local. Es adecuado para escenarios de lectura aleatoria, como la lectura por lotes aleatorios de conjuntos de datos de entrenamiento.

        • "false": Desactiva el modo directo (predeterminado). Es adecuado para escenarios de propósito general, como lecturas secuenciales de archivos pequeños o lecturas de archivos grandes. Si su aplicación no tiene un patrón específico de acceso a datos, mantenga este modo desactivado.

        resourceLimit

        No

        Los recursos máximos del nodo que puede consumir el dispositivo de bloque virtual.

        Por ejemplo, "2c4g" indica que el dispositivo de bloque virtual puede usar hasta 2 vCPU y 4 GiB de memoria del nodo.

        Nota
        • La memoria se utiliza principalmente para la precarga de datos y el almacenamiento en caché local. Cuando el modo directo está habilitado, el uso de memoria es significativamente menor que el valor preestablecido.

        • Para sistemas operativos distintos de Alibaba Cloud Linux 3, el rendimiento de lectura es similar independientemente de la configuración. Por lo tanto, no se recomiendan límites de recursos altos. Para más información, consulte Data read performance tests.

    2. Cree la StorageClass.

      kubectl create -f strmvol-sc.yaml
  2. Cree un PVC.

    1. Cree un archivo llamado strmvol-pvc-dynamic.yaml con el siguiente contenido.

      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: pvc-strmvol
        namespace: default
      spec:
        # Only the ReadOnlyMany access mode is supported.
        accessModes:
          - ReadOnlyMany
        # Specify the StorageClass.
        storageClassName: strmvol-test
        resources:
          requests:
            # The mounted OSS path can store a maximum of 16 TiB of data.
            storage: 20Gi
    2. Cree el PVC.

      kubectl create -f strmvol-pvc-dynamic.yaml
    3. Compruebe el estado del PVC.

      kubectl get pvc pvc-strmvol

      La salida esperada muestra que el PVC está vinculado a un PV aprovisionado automáticamente por el controlador CSI.

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

Paso 2: Crear una aplicación y montar el volumen

  1. Cree un archivo llamado strmvol-test.yaml con el siguiente contenido.

    El siguiente ejemplo YAML crea un StatefulSet con un pod. El pod solicita recursos de almacenamiento mediante un PVC llamado pvc-strmvol, y la ruta de montaje es /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. Cree el StatefulSet.

    kubectl create -f strmvol-test.yaml
  3. Compruebe el estado de despliegue del pod en el StatefulSet.

    kubectl get pod -l app=strmvol-test

    Salida esperada:

    NAME             READY   STATUS    RESTARTS   AGE
    strmvol-test-0   1/1     Running   0          14s
  4. Compruebe que el punto de montaje es un dispositivo de bloque y que la aplicación puede acceder a los datos en OSS.

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

    Salida esperada:

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

Documentación relacionada

strmvol client performance tests