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 |
|
|
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. |
|
|
Otros tipos de almacenamiento, como discos en la nube o CPFS general-purpose edition |
storage-operator crea un pod temporal en el namespace Este modo consume recursos de cómputo del clúster. |
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 |
|
|
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 |
Utilice almacenamiento aprovisionado dinámicamente, como discos en la nube, con el modo |
|
Características clave |
|
|
Flujo de trabajo
Los pasos principales de VolumePopulator son similares en ambos modos.
|
|
|
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
Complete los pasos descritos en preparations for using CPFS for Lingjun dynamic volumes.
-
Revise la documentación de CPFS for Lingjun data flow (invitational preview) para conocer los detalles y límites de la función.
ImportanteEl flujo de datos de CPFS for Lingjun se encuentra en vista previa por invitación. El rendimiento puede variar en clústeres a gran escala. Si tiene problemas o sugerencias sobre el producto, únase al grupo 35532895 de DingTalk.
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 |
|
|
OSSVolumePopulator debe estar en el mismo namespace que la aplicación y el PVC. |
No |
N/A |
|
|
Nombre del bucket de OSS. |
No |
N/A |
|
|
region de OSS. |
No |
N/A |
|
|
endpoint del servicio OSS. |
No |
N/A |
|
|
Prefijo de ruta dentro del bucket de OSS, por ejemplo, |
Sí |
|
|
|
Modo de operación. Opciones:
|
Sí |
|
|
|
Throughput máximo del flujo de datos de CPFS for Lingjun (MB/s). Valores válidos: |
Sí |
Igual que el valor predeterminado del flujo de datos de CPFS for Lingjun |
|
|
Protocolo de seguridad para la transferencia de datos, como |
Sí |
Cifrado deshabilitado |
|
|
Tipo de datos a sincronizar:
|
Sí |
|
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 |
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 |
Dado que la StorageClass establece |
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.
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:
-
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 -
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 -
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
VolumePopulatorPodHandleren 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.
-
Argo Workflows está instalado.
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
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.
-
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.
ImportanteDespué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.
Método AccessKey
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.
-
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.
-
Asocie la directiva al usuario de RAM.
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.
En la sección Policies, busque y seleccione la directiva creada en el paso anterior, y luego complete la autorización.
-
Cree una AccessKey para el usuario de RAM y almacénela como Secret para la precarga de datos.
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.
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.
-
Cree un Secret en el clúster.
Utilice el siguiente YAML para crear un Secret en el namespace
ack-volume-populatory 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 |
|
|
OSSVolumePopulator debe estar en el mismo namespace que la aplicación y la PVC. |
No |
N/A |
|
|
Nombre del bucket de OSS. |
No |
N/A |
|
|
region de OSS. |
No |
N/A |
|
|
endpoint del servicio OSS. |
No |
N/A |
|
|
Prefijo de ruta dentro del bucket de OSS, por ejemplo, |
Sí |
|
|
|
Modo de operación. Opciones:
|
Sí |
|
|
|
Etiquetas para los pods de tarea de llenado de datos que permiten programarlos en ECI. |
Sí |
N/A |
|
|
Anotaciones para los pods de tarea de llenado de datos que permiten configurar especificaciones de ECI. |
Sí |
N/A |
|
|
Nombre del Secret que almacena la AccessKey. Utilice esta opción o |
Sí |
N/A |
|
|
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 |
|
|
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 |
|
|
Reglas de afinidad para programar los pods de tarea de llenado de datos en nodos específicos. |
Sí |
N/A |
|
|
Tolerancias para los pods de tarea de llenado de datos. |
Sí |
N/A |
|
|
Throughput máximo (MB/s) para los pods de tarea de llenado de datos. A diferencia de |
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-essdconreclaimPolicyestablecido enDeleteyvolumeBindingModeenImmediate, adecuado para cómputo serverless sin conciencia de zona.Para flujos de trabajo que no son serverless, utilice una StorageClass con
volumeBindingModeestablecido enWaitForFirstConsumer(comoalicloud-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.
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:00Zy 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:
-
Elimine el Argo Workflow:
Elimine el recurso
Workflow. Con las solicitudes de volumenephemeral, la eliminación se propaga a todas las PVC. La configuraciónreclaimPolicy: Deletede laStorageClasselimina 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> -
Verifique la limpieza de recursos:
Ejecute
kubectl -n argo get pvcpara 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: Deleteen 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, configureaffinityytolerationsenOSSVolumePopulatorpara programar los pods de tarea temporales en cómputo serverless de menor costo (incluidos ACS, ECI) o en instancias preemptible.Solicite un valor de
storageen 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
volumeBindingModede la StorageClass enWaitForFirstConsumerpara 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: metadatapara lograr una disponibilidad más rápida del PV si la latencia en la primera lectura es aceptable, o biendataType: metadataAndDatapara 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:
kubectl describe pvc <pvc-name> -n <namespace>: Revise los eventos de la PVC para detectar errores del populator.kubectl describe ossvp <ossvp-name> -n <namespace>: Consulte el estado y los eventos de OSSVP para verificar el progreso del llenado o posibles fallos.En el modo
generic, revise los pods con errores en el namespaceack-volume-populatory consulte sus registros. Las causas comunes incluyen permisos insuficientes en OSS, problemas de red o espacio de almacenamiento insuficiente.