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.
NotaCentOS 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.
Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, elija .
En la página Marketplace, busque strmvol-csi-driver y haga clic en su tarjeta.
En la página de detalles de la aplicación, haga clic en Deploy en la esquina superior derecha.
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
-
Cree un usuario RAM y otorgue los permisos necesarios.
-
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.
-
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
mybucketcon el nombre de su bucket.-
Política de solo lectura de OSS
-
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" }
-
(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.
Otorgue los permisos de OSS al usuario RAM. Para más información, consulte Manage RAM user permissions.
-
La AccessKey que cree se almacenará como un Secret para el PV.
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.
Siga las instrucciones en pantalla para crear una AccessKey. Copie y almacene de forma segura el AccessKey ID y el AccessKey Secret.
-
-
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
akIdyakSecretcon 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
-
Cree un PersistentVolume (PV).
-
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
nodeStageSecretRefParámetro
Obligatorio
Descripción
nameSí
Nombre del secret que almacena la información de la AccessKey.
namespaceSí
Namespace del secret que contiene la información de la AccessKey.
-
Parámetros en
volumeAttributesParámetro
Obligatorio
Descripción
bucketSí
El bucket de OSS que se va a montar.
pathNo
La ruta del directorio que se va a montar dentro del bucket de OSS. Esta ruta es relativa a la raíz del bucket.
ImportanteSeleccione una ruta de montaje basada en el principio de menor privilegio.
urlSí
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.comohttps://oss-{{regionName}}-internal.aliyuncs.com.ImportanteEl formato de endpoint interno
vpc100-oss-{{regionName}}.aliyuncs.comestá obsoleto. Actualice a un nuevo formato lo antes posible.umaskNo
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, configureumasken022.directModeNo
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.
resourceLimitNo
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.NotaLa 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.
-
-
Cree el PV.
kubectl create -f strmvol-pv.yaml -
Compruebe el estado del PV.
kubectl get pv pv-strmvolSalida esperada:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE pv-strmvol 20Gi ROX Retain Available <unset> 18s
-
-
Cree un PersistentVolumeClaim (PVC).
-
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 -
Cree el PVC.
kubectl create -f strmvol-pvc-static.yaml -
Compruebe el estado del PVC.
kubectl get pvc pvc-strmvolLa 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
-
Cree una StorageClass.
-
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: ImmediateLos parámetros en
parametersse describen a continuación:-
Configuración del secret
Parámetro
Obligatorio
Descripción
csi.storage.k8s.io/node-stage-secret-nameSí
Nombre del secret que almacena la información de la AccessKey.
csi.storage.k8s.io/node-stage-secret-namespaceSí
Namespace del secret que contiene la información de la AccessKey.
-
Configuración del volumen
Parámetro
Obligatorio
Descripción
bucketSí
El bucket de OSS que se va a montar.
pathNo
La ruta del directorio que se va a montar dentro del bucket de OSS. Esta ruta es relativa a la raíz del bucket.
ImportanteSeleccione una ruta de montaje basada en el principio de menor privilegio.
urlSí
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.comohttps://oss-{{regionName}}-internal.aliyuncs.com.ImportanteEl formato de endpoint interno
vpc100-oss-{{regionName}}.aliyuncs.comestá obsoleto. Actualice a un nuevo formato lo antes posible.umaskNo
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, configureumasken022.directModeNo
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.
resourceLimitNo
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.NotaLa 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.
-
-
Cree la StorageClass.
kubectl create -f strmvol-sc.yaml
-
-
Cree un PVC.
-
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 -
Cree el PVC.
kubectl create -f strmvol-pvc-dynamic.yaml -
Compruebe el estado del PVC.
kubectl get pvc pvc-strmvolLa 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
-
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 -
Cree el StatefulSet.
kubectl create -f strmvol-test.yaml -
Compruebe el estado de despliegue del pod en el StatefulSet.
kubectl get pod -l app=strmvol-testSalida esperada:
NAME READY STATUS RESTARTS AGE strmvol-test-0 1/1 Running 0 14s -
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>