Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Prefill OSS data on demand to high-performance volumes

Última actualización: Sep 04, 2026

Antes de ejecutar tareas de entrenamiento de IA o análisis de datos, precargue grandes volúmenes de datos fríos de OSS bajo demanda en volúmenes de alto rendimiento, como CPFS for Lingjun o discos en la nube. Esto permite que las cargas de trabajo lean los datos a alta velocidad. Los volúmenes se liberan automáticamente al finalizar las tareas, lo que equilibra la aceleración del cómputo con la optimización de costos.

Funcionamiento

Implementación de la función

Esta función utiliza Volume Populators de Kubernetes, gestionados por storage-operator de ACK. Cuando crea un PVC que hace referencia al recurso personalizado OSSVolumePopulator (OSSVP), storage-operator intercepta la solicitud y pobla los datos.

El modo de poblado depende del tipo de volumen de destino:

Modo

Tipos de almacenamiento compatibles

Descripción

bmcpfs-dataflow
Modo de flujo de datos nativo



CPFS for Lingjun

storage-operator aprovecha el flujo de datos nativo de CPFS para poblar los datos.

Este modo no consume recursos de cómputo del clúster y ofrece mayor eficiencia.

image

generic
Modo de poblado genérico mediante pod



Otros tipos de almacenamiento, como discos en la nube o CPFS general-purpose edition

storage-operator crea un pod temporal en el namespace ack-volume-populator para montar el nuevo volumen y descargar los datos especificados de OSS. El pod se elimina una vez completado el poblado.

Este modo consume recursos de cómputo del clúster.

image

Una vez completado el poblado correctamente, el estado del PVC cambia de Pending a Bound. Los pods de la aplicación pueden entonces montar el PVC y acceder a los datos precargados.

Escenarios típicos

Esta función admite dos casos de uso principales.

Dimensión

Scenario 1: Prefetch data to CPFS for Lingjun shared volumes

Scenario 2: Prefetch data to isolated cloud disk volumes

Escenario aplicable

Cargas de trabajo intensivas en lectura y de alto throughput, como el entrenamiento e inference de modelos de IA, para superar cuellos de botella en el acceso a OSS.

Tareas por lotes paralelas o pipelines de datos que requieren espacios de trabajo de lectura-escritura aislados para evitar conflictos de concurrencia y garantizar el aislamiento de datos.

Implementación técnica

Utilice CPFS for Lingjun con el modo bmcpfs-dataflow para el poblado nativo de datos.

Utilice almacenamiento aprovisionado dinámicamente, como discos en la nube, con el modo generic y un pod temporal para el poblado de datos.

Características clave

  • Optimización de costos: Usa aceleración nativa sin consumir recursos de cómputo. El almacenamiento se libera inmediatamente después de su uso.

  • Compartición de datos: El acceso de muchos a uno permite que múltiples tareas de GPU compartan el mismo conjunto de datos precargado.

  • Aislamiento de datos: Cada tarea obtiene un volumen dedicado, lo que evita interferencias. Admite varios tipos de almacenamiento dinámico.

  • Escalado elástico: El acceso uno a uno vincula el ciclo de vida del almacenamiento al de la tarea para un control preciso de costos.

Flujo de trabajo

Los pasos principales de VolumePopulator son similares en ambos modos.

image

  1. Habilite el Feature Gate VolumePopulator en storage-operator.

    Al habilitar VolumePopulator, se crea de forma predeterminada el namespace ack-volume-populator para alojar PVCs y pods temporales durante la precarga de datos.
  2. Otorgue permisos de acceso a OSS para la tarea de poblado. El modo bmcpfs-dataflow requiere etiquetas específicas en el bucket de OSS. El modo generic requiere configuración de RRSA o AccessKey.

  3. Cree un objeto OSSVolumePopulator donde especifique la ruta del bucket de OSS y el modo de poblado.

  4. Cree un PVC, especifique una StorageClass y haga referencia al OSSVP mediante dataSourceRef para iniciar la precarga de datos (el momento depende del parámetro volumeBindingMode de la StorageClass).

  5. Una vez que el PVC esté en estado Bound, cree las cargas de trabajo (pods, deployments, etc.) que lo montarán para acceder a los datos a alta velocidad.

    La precarga de datos se realiza una sola vez durante la creación del volumen. Los cambios posteriores en los datos de origen de OSS no se sincronizan con el volumen creado.
  6. Al finalizar la tarea, elimine el PVC. Si el parámetro reclaimPolicy de la StorageClass es Delete, el almacenamiento de alto rendimiento asociado (como FileSets de CPFS o discos en la nube) se elimina automáticamente y se detiene la facturación. Los datos de origen en OSS no se ven afectados.

Requisitos previos

  • El clúster debe ejecutar Kubernetes 1.26 o posterior con el plugin CSI. Esta función requiere almacenamiento aprovisionado dinámicamente.

    Para actualizar su clúster, consulte Manually upgrade a cluster . Para migrar de FlexVolume a CSI, consulte Migrate FlexVolume to CSI using csi-compatible-controller .
  • Actualice storage-operator a la versión v1.35.1 o posterior y habilite el Feature Gate VolumePopulator.

    Si ya hay otros feature gates habilitados, utilice el formato: xxxxxx=true,yyyyyy=false,VolumePopulator=true

Escenario 1: Precarga de datos en volúmenes compartidos de CPFS for Lingjun

Para entrenamiento de modelos e inference de solo lectura y alto throughput, utilice el flujo de datos de CPFS for Lingjun para precargar modelos desde OSS bajo demanda. Esto permite que múltiples tareas de GPU lean los datos a alta velocidad.

Requisitos previos

1. Establecer una etiqueta específica en el bucket de OSS

En Object tagging operations, agregue una etiqueta a su bucket de OSS con key cpfs-dataflow y value true.

No elimine ni modifique esta etiqueta durante su uso; de lo contrario, podría fallar la creación del volumen.

2. Crear OSSVolumePopulator (OSSVP)

Cree un objeto OSSVolumePopulator en el mismo namespace que su aplicación y PVC para definir el origen de datos de OSS.

apiVersion: storage.alibabacloud.com/v1beta1
kind: OSSVolumePopulator
metadata:
  name: qwen3-32b
  # Must be in the same namespace as the application and PVC
  namespace: bmcpfs-dataflow-demo 
spec:
  bucket: <your-bucket-name>
  region: cn-hangzhou
  endpoint: oss-cn-hangzhou-internal.aliyuncs.com
  path: /Qwen3-32B/
  # Dedicated for CPFS for Lingjun volumes, leveraging its data flow capability
  mode: bmcpfs-dataflow
  
  # Optional advanced configurations for bmcpfs-dataflow mode
  # This example recommends default settings. Ignore if no special requirements.
  # bmcpfsDataflow:
    # Maximum data flow throughput (MB/s). Options: 600, 1200, 1500. Default: 600
    # throughput: 1200
    # Enable encrypted transfer. Default: empty (disabled)
    # sourceSecurityType: SSL
    # Data prefill mode. Default: metadataAndData for full prefill.
    # Set to metadata for metadata-only prefill.
    # dataType: metadataAndData

Parámetros:

Nombre

Descripción

Opcional

Predeterminado

namespace

OSSVolumePopulator debe estar en el mismo namespace que la aplicación y el PVC.

No

N/A

bucket

Nombre del bucket de OSS.

No

N/A

region

region de OSS.

No

N/A

endpoint

endpoint del servicio OSS.

No

N/A

path

Prefijo de ruta dentro del bucket de OSS, por ejemplo, /data/.

Sí

/

mode

Modo de operación. Opciones:

  • generic (predeterminado): Poblado genérico para cualquier volumen dinámico de backend (por ejemplo, discos en la nube, CPFS general-purpose edition). Crea un pod temporal en el namespace ack-volume-populator para descargar datos, lo cual consume recursos de cómputo del clúster.

  • bmcpfs-dataflow: Modo de alto rendimiento exclusivo para volúmenes CPFS for Lingjun. Utiliza el flujo de datos nativo para lograr mayor eficiencia sin consumir recursos de cómputo del clúster.

  • auto: Selecciona el mejor modo según el tipo de almacenamiento de destino, pero generalmente recurre al modo generic. Especifique bmcpfs-dataflow manualmente si es necesario.

Sí

auto

bmcpfsDataflow.throughput

Throughput máximo del flujo de datos de CPFS for Lingjun (MB/s). Valores válidos: 600, 1200, 1500.

Sí

Igual que el valor predeterminado del flujo de datos de CPFS for Lingjun

bmcpfsDataflow.sourceSecurityType

Protocolo de seguridad para la transferencia de datos, como "SSL" para transferencia cifrada.

Sí

Cifrado deshabilitado

bmcpfsDataflow.dataType

Tipo de datos a sincronizar:

  • metadata: Sincroniza únicamente los metadatos de los archivos.

    Con la sincronización exclusiva de metadatos, los datos se extraen de OSS en la primera lectura, lo que puede afectar el rendimiento del acceso inicial.

  • metadataAndData: Sincroniza tanto los metadatos como el contenido de los archivos.

Sí

metadataAndData

3. Preparar StorageClass y PVC

Cree una StorageClass para CPFS for Lingjun y luego cree un PVC que haga referencia al OSSVP mediante dataSourceRef.

Crear 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
# Critical: Ensure CPFS FileSet and data are automatically cleaned up after PVC deletion
reclaimPolicy: Delete
# Recommended: Set to Immediate to start data prefill immediately after PVC creation
volumeBindingMode: Immediate

Cada volumen dinámico generado por esta StorageClass crea un Fileset en el backend de CPFS for Lingjun. Cree distintos recursos OSSVP para precargar diferentes conjuntos de datos de OSS en distintos volúmenes con la misma StorageClass.

Crear PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: qwen3-32b
  namespace: bmcpfs-dataflow-demo
spec:
  accessModes:
    - ReadOnlyMany
  dataSourceRef:
    apiGroup: storage.alibabacloud.com
    kind: OSSVolumePopulator
    # Reference the OSSVP name created above
    name: qwen3-32b
  resources:
    requests:
      # Must be at least the size of the OSS data source referenced by OSSVP
      storage: 80Gi
  storageClassName: bmcpfs-dataflow-demo
  volumeMode: Filesystem

Dado que la StorageClass establece volumeBindingMode: Immediate, storage-operator inicia el flujo de datos de OSS a CPFS for Lingjun inmediatamente después de crear el PVC.

4. Verificar el estado de la precarga de datos

Durante el poblado, el estado del PVC permanece como Pending y cambia a Bound una vez completado el proceso.

Para el modo bmcpfs-dataflow, compruebe el progreso en tiempo real del flujo de datos de CPFS for Lingjun con este comando:

kubectl -n bmcpfs-dataflow-demo describe ossvp qwen3-32b
  • Estado (status) durante el poblado:

      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%
  • Estado (status) tras la finalización:

    Message:  Populated successfully

5. Crear la carga de trabajo y utilizar los datos

Una vez que el PVC esté en estado Bound, cree una carga de trabajo que lo monte.

Este ejemplo utiliza recursos de GPU. Solo para fines de verificación, cree un pod de CPU y utilice kubectl exec para inspeccionar los datos.

Expandir para ver código de ejemplo

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
      # Use ACS HPN instance type to mount CPFS volume
      # alibabacloud.com/compute-class: "gpu-hpn"
    spec:
      # Use ACS HPN instance type to mount CPFS volume
      # nodeSelector: 
      #   alibabacloud.com/node-type: reserved
      # tolerations:
      # - key: "virtual-kubelet.io/provider" 
      #   operator: "Exists"
      #   effect: "NoSchedule"
      volumes:
        - name: model-storage
          persistentVolumeClaim:
            # Specify the created 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

Guía de limpieza de recursos

Una vez finalizadas las tareas de entrenamiento de IA o inference, libere los volúmenes compartidos de CPFS for Lingjun y las cargas de trabajo asociadas.

Recursos por liberar:

  • Cargas de trabajo que utilizan el volumen compartido (en este ejemplo, un StatefulSet)

  • PVC utilizado para la precarga de datos

  • Recursos de almacenamiento backend (FileSet de CPFS for Lingjun) creados automáticamente por el PVC

Pasos de limpieza:

  1. Eliminar la carga de trabajo

    Elimine el StatefulSet que usa el volumen para liberar el PVC.

    kubectl delete statefulset demo-apply-qwen3-32b -n bmcpfs-dataflow-demo
  2. Eliminar el PVC

    Si la StorageClass tiene configurado reclaimPolicy: Delete, al eliminar el PVC también se elimina el FileSet de CPFS en el backend, se libera el almacenamiento y se detiene la facturación.

    kubectl delete pvc qwen3-32b -n bmcpfs-dataflow-demo
  3. Verificar la limpieza de recursos:

    • En la consola de NAS, elija File System > File System List y confirme que el FileSet correspondiente a este PVC se haya eliminado y que la capacidad utilizada haya disminuido.

    • Los datos de origen en OSS no se ven afectados. En la consola de OSS, confirme que el conjunto de datos permanece intacto.

Escenario 2: Precarga de datos en volúmenes aislados de disco en la nube

Para flujos de trabajo de procesamiento por lotes, utilice Argo Workflows para crear y precalentar dinámicamente un disco en la nube independiente por tarea, garantizando así el aislamiento de datos y la elasticidad.

Requisitos previos

  • Habilite VolumePopulatorPodHandler en storage-operator.

    Al habilitarlo, el sistema otorga los permisos RBAC necesarios a los componentes relacionados y a los pods temporales. Evalúe los riesgos de seguridad antes de proceder.

    Permisos RBAC configurados automáticamente

    • Otorga permisos de operación de pods a storage-operator en el namespace ack-volume-populator

      - apiGroups: [""]
        resources: [pods]
        verbs: [get, list, watch, create, delete]
    • Otorga permisos de acceso a nivel de clúster a los pods temporales de tareas

      - apiGroups: [""]
        resources: [events]
        verbs: [create, patch, get, list]
      - apiGroups: [volumepopulators.storage.alibabacloud.com]
        resources: [ossvolumepopulators]
        verbs: [get, list, watch]
  • Argo Workflows está instalado.

    Pasos detallados

    1. Inicie sesión en ACK console. En el panel de navegación izquierdo, haga clic en Clusters.

    2. En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, elija Operations > Add-ons.

    3. En la página Add-ons, busque Argo Workflows e instálelo siguiendo las indicaciones.

  • Este ejemplo utiliza cómputo serverless (ECI) para las tareas de precarga de datos y los flujos de trabajo. Instale ack-virtual-node add-on. Para verificaciones sin serverless, elimine alibabacloud.com/eci: "true" de los recursos.

1. Autorizar tareas de precarga de datos para acceder a OSS

En el modo generic, las tareas de precarga de datos se ejecutan como pods temporales en el namespace ack-volume-populator. Otorgue a estos pods acceso al bucket de OSS que contiene los datos de origen.

  • RRSA method: Asigna dinámicamente roles de RAM temporales con rotación automática a los pods, lo que permite un aislamiento detallado de permisos y mayor seguridad.

  • AccessKey method: Almacena credenciales estáticas de larga duración en un Secret. Es sencillo de configurar, pero menos seguro.

Método RRSA

1. Habilitar RRSA en el clúster

  1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters. En la página Clusters, haga clic en el nombre del clúster destino.

  2. En la pestaña Basic Information, dentro de la sección Security and Auditing, haga clic en Enable junto a RRSA OIDC y siga las instrucciones en pantalla para habilitar RRSA durante horas de baja demanda.

    Cuando el estado del clúster cambie de Updating a Running, RRSA estará habilitado.

    Importante

    Después de habilitar RRSA, el periodo máximo de validez de los tokens de ServiceAccount creados recientemente en el clúster se limita a 12 horas.

2. Crear un rol de RAM y otorgar permisos

Cree un rol de RAM que los pods puedan asumir para acceder a OSS mediante la autenticación RRSA.

Ver pasos

  1. Cree un rol de RAM.

    1. Vaya a la página Consola de RAM - Crear rol, seleccione Principal Type como Identity Provider y luego haga clic en Switch to Policy Editor para ingresar a la página del Visual Editor.

    2. Seleccione Principal como Identity Provider, haga clic en Edit y siga las instrucciones a continuación para completar la configuración.

      Las configuraciones principales son las siguientes. Mantenga los demás parámetros con sus valores predeterminados. Consulte Create a RAM role for an OIDC identity provider para obtener más detalles.

      Configuración

      Descripción

      Identity Provider Type

      OIDC.

      Identity Provider

      Seleccione ack-rrsa-<cluster_id>. Reemplace <cluster_id> con el ID de su clúster.

      Condition

      Agregue manualmente oidc:sub.

      • Key: Seleccione oidc:sub.

      • Operator: Seleccione StringEquals.

      • Value: Introduzca system:serviceaccount:ack-volume-populator:plugin-account.

      Role Name

      Este ejemplo utiliza demo-role-for-rrsa.

  2. Cree una directiva de permisos.

    Siguiendo el principio de privilegio mínimo, create a custom policy para otorgar acceso al bucket de OSS destino (permisos de solo lectura o de lectura y escritura en OSS).

    Vaya a la página Consola de RAM - Crear directiva, cambie al JSON Editor y configure el script de la directiva según las instrucciones.

    Si ya cuenta con un rol de RAM con permisos de OSS, modifique su directiva de confianza para reutilizarlo. Consulte Use an existing RAM role and grant permissions .

    Directiva de solo lectura para OSS

    Reemplace con el nombre real de su bucket.
    {
        "Statement": [
            {
                "Action": [
                    "oss:Get*",
                    "oss:List*"
                ],
                "Effect": "Allow",
                "Resource": [
                    "acs:oss:*:*:<myBucketName>",
                    "acs:oss:*:*:<myBucketName>/*"
                ]
            }
        ],
        "Version": "1"
    }
    1. Vaya a la página Consola de RAM - Usuarios, haga clic en el usuario destino en la lista de usuarios de RAM y luego, en la pestaña AccessKey, haga clic en Create AccessKey.

    2. Siga las instrucciones para crear la AccessKey en el cuadro de diálogo y almacene de forma segura el AccessKey ID y el AccessKey Secret.

Método AccessKey

  1. Cree un usuario de RAM. Omita este paso si ya existe un usuario de RAM. Vaya a la página Consola de RAM - Crear usuario y cree un usuario de RAM según las instrucciones; por ejemplo, establezca el nombre de inicio de sesión y la contraseña.

  2. Cree una directiva de permisos.

    Siguiendo el principio de privilegio mínimo, create a custom policy para otorgar acceso al bucket de OSS destino (permisos de solo lectura o de lectura y escritura en OSS).

    Vaya a la página Consola de RAM - Crear directiva, cambie al JSON Editor y configure el script de la directiva según las instrucciones.

    Directiva de solo lectura para OSS

    Reemplace <myBucketName> con el nombre real de su bucket.
    {
        "Statement": [
            {
                "Action": [
                    "oss:Get*",
                    "oss:List*"
                ],
                "Effect": "Allow",
                "Resource": [
                    "acs:oss:*:*:<myBucketName>",
                    "acs:oss:*:*:<myBucketName>/*"
                ]
            }
        ],
        "Version": "1"
    }
  3. Asocie la directiva al usuario de RAM.

    1. Vaya a la página Consola de RAM - Usuarios. En la lista de usuarios, localice al usuario destino y haga clic en Add Permissions en la columna Actions.

    2. En la sección Policies, busque y seleccione la directiva creada en el paso anterior, y luego complete la autorización.

  4. Cree una AccessKey para el usuario de RAM y almacénela como Secret para la precarga de datos.

    1. Vaya a la página Consola de RAM - Usuarios, haga clic en el usuario destino en la lista de usuarios de RAM y luego, en la pestaña AccessKey, haga clic en Create AccessKey.

    2. Siga las instrucciones para crear la AccessKey en el cuadro de diálogo y almacene de forma segura el AccessKey ID y el AccessKey Secret.

  5. Cree un Secret en el clúster.

    Utilice el siguiente YAML para crear un Secret en el namespace ack-volume-populator y almacenar la AccessKey.

    apiVersion: v1
    kind: Secret
    metadata:
      name: oss-secret
      # The namespace must be set to ack-volume-populator
      namespace: ack-volume-populator
    stringData:
      # Replace with the previously obtained AccessKey ID
      accessKeyId: <your-AccessKey-ID>
      # Replace with the previously obtained AccessKey Secret
      accessKeySecret: <your-AccessKey-Secret>

2. Crear OSSVolumePopulator (OSSVP)

Cree un recurso OSSVolumePopulator en el mismo namespace que su aplicación y PVC. Establezca mode en generic y configure la autorización.

apiVersion: storage.alibabacloud.com/v1beta1
kind: OSSVolumePopulator
metadata:
  name: generic-demo
  # Must be in the same namespace as the application and PVC
  namespace: argo 
spec:
  bucket: my-test-bucket
  region: cn-hangzhou
  endpoint: oss-cn-hangzhou-internal.aliyuncs.com
  path: /many-files/
  # Generic mode for any backend storage volume
  mode: generic
  generic:
    # Add labels to data population task pods for scheduling to ECI pods
    labels:
      alibabacloud.com/eci: "true"
    # Add annotations to data population task pods for configuring ECI specs
    annotations:
      k8s.aliyun.com/eci-use-specs: "2-4Gi"
    # Choose either secretRef or rrsaConfigs
    # secretRef: oss-secret
    rrsaConfigs:
      # ARN of the RAM role used for RRSA authorization
      roleArn: "acs:ram::1234567*****:role/oss-populator"
      # ARN of the cluster's OIDC Provider
      oidcProviderArn: "acs:ram::1234567*****:oidc-provider/my-oidc-provider"
    # Configure affinity for data population task pods to schedule to specific nodes
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
            - matchExpressions:
                - key: "disktype"
                  operator: NotIn
                  values:
                    - "hdd"
    # Configure tolerations for data population task pods
    tolerations:
      - key: "virtual-kubelet.io/provider"
        operator: Equal
        value: "alibabacloud"
        effect: NoSchedule
    # Maximum throughput (MB/s)
    # throughput: 1000

Parámetros:

Nombre

Descripción

Opcional

Predeterminado

namespace

OSSVolumePopulator debe estar en el mismo namespace que la aplicación y la PVC.

No

N/A

bucket

Nombre del bucket de OSS.

No

N/A

region

region de OSS.

No

N/A

endpoint

endpoint del servicio OSS.

No

N/A

path

Prefijo de ruta dentro del bucket de OSS, por ejemplo, /data/.

Sí

/

mode

Modo de operación. Opciones:

  • generic (predeterminado): Llenado genérico para cualquier volumen dinámico de backend (por ejemplo, discos en la nube, edición de uso general de CPFS). Crea un pod temporal en el namespace ack-volume-populator para descargar datos, lo que consume recursos de cómputo del clúster.

  • bmcpfs-dataflow: Modo de alto rendimiento exclusivo para volúmenes CPFS for Lingjun. Utiliza flujo de datos nativo para mayor eficiencia sin consumir recursos de cómputo del clúster.

  • auto: Selecciona el mejor modo según el tipo de almacenamiento destino, pero generalmente recurre al modo generic. Especifique bmcpfs-dataflow manualmente si es necesario.

Sí

auto

generic.labels

Etiquetas para los pods de tarea de llenado de datos que permiten programarlos en ECI.

Sí

N/A

generic.annotations

Anotaciones para los pods de tarea de llenado de datos que permiten configurar especificaciones de ECI.

Sí

N/A

generic.secretRef

Nombre del Secret que almacena la AccessKey. Utilice esta opción o generic.rrsaConfigs.

Sí

N/A

generic.rrsaConfigs.roleArn

ARN del rol de RAM utilizado para la autorización RRSA.

Vaya a la página Consola de RAM - Roles, haga clic en el nombre del rol de RAM y obténgalo en la página de detalles.

Obligatorio al usar RRSA

N/A

generic.rrsaConfigs.oidcProviderArn

ARN del proveedor OIDC del clúster.

Vaya a la página de clústeres de ACK, haga clic en el nombre del clúster destino, seleccione Cluster Information y obténgalo en la pestaña Basic Information bajo RRSA OIDC.

Obligatorio al usar RRSA

N/A

generic.affinity

Reglas de afinidad para programar los pods de tarea de llenado de datos en nodos específicos.

Sí

N/A

generic.tolerations

Tolerancias para los pods de tarea de llenado de datos.

Sí

N/A

generic.throughput

Throughput máximo (MB/s) para los pods de tarea de llenado de datos.

A diferencia de bmcpfs-dataflow, el rendimiento de generic depende de los recursos del nodo (red, CPU) y de la capacidad de escritura del almacenamiento. Esta configuración limita la velocidad de descarga para evitar que las tareas de precarga consuman recursos excesivos del clúster.

Sí

Ilimitado (la tasa real depende de la red del nodo, la CPU y el rendimiento de escritura del almacenamiento)

3. Preparar StorageClass

Este escenario requiere una StorageClass para aprovisionar discos en la nube dinámicamente. ACK proporciona una default StorageClass y admite manually creating a StorageClass.

  • Este ejemplo utiliza alicloud-disk-essd con reclaimPolicy establecido en Delete y volumeBindingMode en Immediate, adecuado para cómputo serverless sin conciencia de zona.

  • Para flujos de trabajo que no son serverless, utilice una StorageClass con volumeBindingMode establecido en WaitForFirstConsumer (como alicloud-disk-topology-alltype) para garantizar que los discos en la nube y los pods de la aplicación se creen en la misma zona.

4. Crear Argo Workflow

Este ejemplo de Workflow utiliza un volumeClaimTemplate ephemeral para crear un disco en la nube independiente con datos precargados para cada tarea paralela.

Expandir para ver código de ejemplo

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: parallel-data-process-with-ossvp-
  namespace: argo
spec:
  # Define input parameters
  arguments:
    parameters:
      - name: number
        value: 2

  entrypoint: main
  # Define volume claim template for each concurrent replica in the Workflow
  volumes:
    - name: scratch-volume
      # Declare as ephemeral volume, automatically deleted after Workflow completion
      ephemeral:
        volumeClaimTemplate:
          metadata:
            labels:
              diskType: scratch-volume
          spec:
            accessModes: [ "ReadWriteOnce" ]
            # For non-serverless compute, replace with alicloud-disk-topology-alltype
            storageClassName: "alicloud-disk-essd"
            resources:
              requests:
                # Must be at least the size of the OSS data source referenced by OSSVP
                storage: 20Gi
            # Reference OSSVP as data source
            dataSourceRef:
              apiGroup: storage.alibabacloud.com
              kind: OSSVolumePopulator
              name: generic-demo

  templates:
    - name: main
      dag:
        tasks:
          # Execute multiple echo tasks in parallel
          - name: echo-task
            template: echo-template
            arguments:
              parameters:
                - name: index
                  value: "{{item}}"
            withSequence:
              count: "{{workflow.parameters.number}}"

    - name: echo-template
      metadata:
        labels:
          # Run tasks on ECI
          alibabacloud.com/eci: "true" 
      container:
        image: mirrors-ssl.aliyuncs.com/busybox:latest
        command:
          - sh
          - -c
        args:
          - |
            echo "Subtask started, ID: {{inputs.parameters.index}}"
            echo "Creating a new log file..."
            touch /scratch-volume/"{{inputs.parameters.index}}-logs"
            echo "Listing contents from the disk populated by OSSVP:"
            ls /scratch-volume
            echo "Subtask completed, ID: {{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

Después de crear el Workflow, revise los registros de cualquier pod de tarea para confirmar que la lectura de los datos precargados se realiza correctamente.

En producción, utilice Argo Workflows Artifact para conservar los resultados finales del cálculo en OSS.
# Replace <your-workflow-pod-name> with the actual pod name
kubectl -n argo logs <your-workflow-pod-name>

Salida esperada:

Subtask started, ID: 1
Creating a new log file...
Listing contents from the disk populated by OSSVP:
1-logs
lost+found
results-2025-04-16T07:48:00Z
...
Subtask completed, ID: 1

Análisis de resultados:

  • 1-logs: Archivo escrito por la tarea, que confirma el acceso de lectura y escritura, así como el almacenamiento aislado entre tareas paralelas.

  • results-2025-04-16T07:48:00Z y archivos similares: Datos precargados desde OSS hacia el disco en la nube.

  • lost+found: Directorio creado durante el formateo del sistema de archivos. Puede ignorarlo.

Guía de limpieza de recursos

Una vez completadas las tareas de procesamiento por lotes, libere los volúmenes de disco en la nube aislados y las instancias de Argo Workflow.

Recursos por liberar:

  • Instancia de Argo Workflow

  • PVC temporales creadas automáticamente por el Workflow

  • Recursos de almacenamiento backend (discos en la nube) creados automáticamente por las PVC.

Pasos para la liberación:

  1. Elimine el Argo Workflow:

    Elimine el recurso Workflow. Con las solicitudes de volumen ephemeral, la eliminación se propaga a todas las PVC. La configuración reclaimPolicy: Delete de la StorageClass elimina posteriormente los discos en la nube del backend, libera los recursos y detiene la facturación.

    # Replace <workflow-name> with the actual Workflow name
    kubectl -n argo delete workflow <workflow-name>
  2. Verifique la limpieza de recursos:

    • Ejecute kubectl -n argo get pvc para confirmar que se eliminaron todas las PVC relacionadas con el workflow.

    • Verifique los recursos de disco en la nube: Vaya a Consola de ECS - Block Storage - Disks y confirme que no quedan recursos de disco en la nube provenientes de este workflow.

    • Los datos de origen en OSS no se ven afectados. En la consola de OSS, confirme que el conjunto de datos permanece intacto.

Aplicación en producción

  • Gestión de costos y recursos:

    • Establezca reclaimPolicy: Delete en la StorageClass para los volúmenes creados dinámicamente, de modo que el almacenamiento de alto rendimiento se limpie automáticamente al finalizar las tareas.

    • En el modo generic, configure affinity y tolerations en OSSVolumePopulator para programar los pods de tarea temporales en cómputo serverless de menor costo (incluidos ACS, ECI) o en instancias preemptible.

    • Solicite un valor de storage en la PVC superior al tamaño de los datos de origen; de lo contrario, el llenado fallará por falta de espacio.

  • Rendimiento y estabilidad:

    • Configure volumeBindingMode de la StorageClass en WaitForFirstConsumer para nodos ECS, de modo que los discos en la nube y los pods de la aplicación se creen en la misma zona.

    • Para CPFS for Lingjun, elija dataType: metadata para lograr una disponibilidad más rápida del PV si la latencia en la primera lectura es aceptable, o bien dataType: metadataAndData para una precarga completa y un alto rendimiento en la primera lectura.

    • Supervise el estado de la precarga con kubectl describe ossvp <name> para resolver problemas rápidamente.

  • Seguridad y permisos:

    • En el modo generic, prefiera RRSA sobre AccessKey al otorgar acceso a OSS a los pods de tarea de llenado de datos.

Facturación

Esta función genera los siguientes cargos:

  • Tarifas de almacenamiento de alto rendimiento basadas en el tipo de volumen creado (como CPFS for Lingjun o cloud disks) y su ciclo de vida.

  • storage fees de OSS para los datos de origen.

  • Tarifas de transferencia de datos: Configure el endpoint interno de OSS en OSSVP para evitar cargos por tráfico. El uso de un endpoint público genera traffic fees.

  • Tarifas de recursos de cómputo (solo para el modo generic): Los pods temporales consumen recursos de cómputo del clúster (CPU, memoria, ancho de banda) y se facturan según las especificaciones y la duración.

  • Para CPFS for Lingjun en modo bmcpfs-dataflow, las tareas de flujo de datos son free to use porque la función de flujo de datos se encuentra en vista previa pública.

Preguntas frecuentes

¿Si actualizo los archivos de origen en OSS después de completar la precarga, los datos del volumen se sincronizan automáticamente?

No. La precarga de datos ocurre una sola vez durante la creación del volumen. Después del llenado, el contenido del volumen se desacopla de los datos de origen en OSS, por lo que los cambios posteriores en OSS no se sincronizan.

¿Por qué mi PVC permanece en estado Pending?

El estado Pending es normal durante la precarga de datos. Si persiste, resuelva el problema de la siguiente manera:

  1. kubectl describe pvc <pvc-name> -n <namespace>: Revise los eventos de la PVC para detectar errores del populator.

  2. kubectl describe ossvp <ossvp-name> -n <namespace>: Consulte el estado y los eventos de OSSVP para verificar el progreso del llenado o posibles fallos.

  3. En el modo generic, revise los pods con errores en el namespace ack-volume-populator y consulte sus registros. Las causas comunes incluyen permisos insuficientes en OSS, problemas de red o espacio de almacenamiento insuficiente.