Tous les produits
Search
Centre de documentation

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

Dernière mise à jour :Aug 11, 2026

Dans les applications conteneurisées, la méthode conventionnelle pour monter des données de stockage d'objets consiste à utiliser un système de fichiers FUSE (Filesystem in Userspace), tel qu'ossfs. Toutefois, cette approche montre souvent ses limites dans les scénarios intensifs en lecture impliquant des millions de petits fichiers, comme le chargement de jeux de données pour l'entraînement IA ou l'analyse de journaux de séries temporelles, où un débit élevé et une faible latence sont essentiels. Pour ces cas d'utilisation, nous vous recommandons d'utiliser une solution de périphérique bloc virtuel. En montant directement les données du stockage d'objets via un volume strmvol, vous optimisez considérablement les performances de lecture des petits fichiers.

Remarques sur l'utilisation

Volumes strmvol

  • Utilisez uniquement les endpoints internes pour accéder aux données OSS.

  • Lors de l'initialisation d'un périphérique bloc virtuel, le système construit un index complet des métadonnées de fichiers. Ce processus consomme des ressources du nœud et maintient le pod d'application dans l'état ContainerCreating. Le temps et les ressources requis sont directement proportionnels au nombre de fichiers présents dans le chemin de montage du bucket OSS.

    • Appliquez le principe du moindre privilège lors de la sélection du chemin de montage du bucket OSS.

      Si l'activité A accède au contenu situé sous /app/a/ dans un bucket OSS et que l'activité B accède au contenu situé sous /app/b/, créez des volumes distincts pour l'activité A et l'activité B, avec respectivement les chemins cibles de montage /app/a/ et /app/b/.

    • Pour plus d'informations sur le temps et les frais liés aux ressources lors de l'initialisation, consultez Construction de l'index des métadonnées.

  • Les paramètres définis dans le PersistentVolume (PV) limitent la consommation de ressources du périphérique bloc virtuel pendant son cycle de vie de montage, à l'exclusion de la phase d'initialisation. Réservez suffisamment de ressources sur le nœud.

  • Un seul périphérique bloc virtuel a une capacité de 16 TiB, ce qui signifie que le chemin OSS monté est également limité à 16 TiB de données.

Exigences relatives au cluster et aux nœuds

  • Le cluster doit être un cluster ACK managé Pro ou un cluster ACK dédié exécutant Kubernetes 1.20 ou une version ultérieure. Le plug-in de stockage doit être un plug-in CSI (Container Storage Interface).

  • Les nœuds doivent utiliser une version de noyau 4.19 ou ultérieure. Nous recommandons des spécifications de ressources d'au moins 4 vCPU et 8 GiB de mémoire.

  • Systèmes d'exploitation de nœuds pris en charge : Alibaba Cloud Linux 3, Alibaba Cloud Linux 2 et CentOS 7. Pour optimiser les performances d'accès aux données avec le système d'exploitation erofs, nous vous recommandons d'utiliser Alibaba Cloud Linux 3.

    Remarque

    CentOS 7 et Alibaba Cloud Linux 2 ont atteint leur fin de vie (EOL). Pour plus d'informations, consultez [Modification du produit] Annonce de l'arrêt de la prise en charge d'Alibaba Cloud Linux 2 et de CentOS 7.

  • Vous ne pouvez pas monter de volumes strmvol sur un pod serverless planifié sur un nœud virtuel.

Prérequis

Étape 1 : Déployer le pilote strmvol-csi-driver

Pour utiliser des volumes strmvol, déployez un pilote CSI distinct, le composant strmvol-csi-driver. Une fois déployé, ce pilote CSI fonctionne indépendamment et n'entre pas en conflit avec les composants csi-provisioner et csi-plugin gérés par ACK.

  1. Connectez-vous à la console ACK. Dans le volet de navigation de gauche, accédez à Marketplace > Marketplace.

  2. Sur la page Marketplace, recherchez strmvol-csi-driver et cliquez sur sa vignette.

  3. Sur la page des détails de l'application, cliquez sur Deploy dans le coin supérieur droit.

  4. Dans le panneau qui s'affiche, configurez les informations de base et les paramètres, puis cliquez sur OK.

Étape 2 : Configurer les autorisations d'accès à OSS

  1. Créez un utilisateur RAM et accordez-lui les autorisations requises.

    1. Créez un utilisateur RAM. Vous pouvez ignorer cette étape si vous disposez déjà d'un utilisateur RAM.

      Accédez à la page Create User de la console RAM et suivez les instructions à l'écran pour créer un utilisateur RAM. Vous devez spécifier des paramètres tels que le nom de connexion et le mot de passe.

    2. Créez une stratégie personnalisée pour l'accès à OSS. Pour plus d'informations, consultez Créer une stratégie personnalisée.

      Choisissez parmi les stratégies d'autorisation en lecture seule et en lecture-écriture suivantes selon vos besoins, et remplacez mybucket par le nom de votre bucket.

      • Stratégie de lecture seule OSS

        Cliquez pour afficher la stratégie en lecture seule

        {
            "Statement": [
                {
                    "Action": [
                        "oss:Get*",
                        "oss:List*"
                    ],
                    "Effect": "Allow",
                    "Resource": [
                        "acs:oss:*:*:mybucket",
                        "acs:oss:*:*:mybucket/*"
                    ]
                }
            ],
            "Version": "1"
        }
      • Stratégie de lecture/écriture OSS

        Cliquez pour afficher la stratégie de lecture/écriture

        {
            "Statement": [
                {
                    "Action": "oss:*",
                    "Effect": "Allow",
                    "Resource": [
                        "acs:oss:*:*:mybucket",
                        "acs:oss:*:*:mybucket/*"
                    ]
                }
            ],
            "Version": "1"
        }
    3. (Facultatif) Si vous chiffrez les objets OSS avec une clé maître client (CMK) provenant de Key Management Service (KMS), vous devez également accorder des autorisations KMS à l'utilisateur RAM. Pour plus d'informations, consultez Chiffrer les volumes ossfs 1,0.

    4. Accordez les autorisations OSS à l'utilisateur RAM. Pour plus d'informations, consultez Gérer les autorisations des utilisateurs RAM.

    5. L'AccessKey que vous créez sera stocké en tant que Secret pour le PV.

      1. Accédez à la page Users de la console RAM, cliquez sur le nom de votre utilisateur RAM, puis dans la section AccessKey, cliquez sur Create AccessKey.

      2. Suivez les instructions à l'écran pour créer un AccessKey. Copiez et conservez en lieu sûr l'ID de clé d'accès (AccessKey ID) et le secret de clé d'accès (AccessKey Secret).

  2. Créez un secret pour stocker les identifiants d'authentification permettant d'accéder aux données OSS.

    Voici un exemple de commande. Remplacez akId et akSecret par votre ID de clé d'accès et votre secret de clé d'accès.

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

Monter un volume strmvol

Étape 1 : Créer un volume strmvol

Volume statique

  1. Créez un PersistentVolume (PV).

    1. Créez un fichier nommé strmvol-pv.yaml avec le contenu suivant.

      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"
      • Paramètres dans nodeStageSecretRef

        Parameter

        Required

        Description

        name

        Yes

        Le nom du secret qui stocke les informations AccessKey.

        namespace

        Yes

        L'espace de noms du secret contenant les informations AccessKey.

      • Paramètres dans volumeAttributes

        Parameter

        Required

        Description

        bucket

        Yes

        Le bucket OSS à monter.

        path

        No

        Le chemin du répertoire à monter dans le bucket OSS. Ce chemin est relatif à la racine du bucket.

        Important

        Sélectionnez un chemin de montage en appliquant le principe du moindre privilège.

        url

        Yes

        L'endpoint interne pour OSS. Il doit correspondre à l'endpoint affiché sur la page Overview du bucket dans la console OSS. Les formats courants pour les endpoints internes incluent :

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

        Important

        Le format d'endpoint interne vpc100-oss-{{regionName}}.aliyuncs.com est obsolète. Mettez à jour vers un nouveau format dès que possible.

        umask

        No

        Le masque de permission pour le système de fichiers après le montage du périphérique bloc virtuel.

        Par exemple, pour définir les permissions de fichier par défaut sur 755, définissez umask sur 022.

        directMode

        No

        Spécifie s'il faut activer le mode direct.

        • "true" : Active le mode direct, ce qui désactive la prélecture des données et la mise en cache locale. Cela convient aux scénarios de lecture aléatoire, tels que la lecture par lots aléatoire de jeux de données d'entraînement.

        • "false" : Désactive le mode direct (par défaut). Cela convient aux scénarios à usage général, tels que les lectures séquentielles de petits fichiers ou les lectures de grands fichiers. Si votre application n'a pas de schéma d'accès aux données spécifique, laissez ce mode désactivé.

        resourceLimit

        No

        Les ressources maximales du nœud que le périphérique bloc virtuel peut consommer.

        Par exemple, "2c4g" indique que le périphérique bloc virtuel peut utiliser jusqu'à 2 vCPU et 4 GiB de mémoire du nœud.

        Remarque
        • La mémoire est principalement utilisée pour la prélecture des données et la mise en cache locale. Lorsque le mode direct est activé, l'utilisation de la mémoire est nettement inférieure à la valeur prédéfinie.

        • Pour les systèmes d'exploitation autres qu'Alibaba Cloud Linux 3, les performances de lecture sont similaires quelle que soit la configuration. Par conséquent, des limites de ressources élevées ne sont pas recommandées. Pour plus d'informations, consultez Tests de performances de lecture des données.

    2. Créez le PV.

      kubectl create -f strmvol-pv.yaml
    3. Vérifiez l'état du PV.

      kubectl get pv pv-strmvol

      Sortie attendue :

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

    1. Créez un fichier nommé strmvol-pvc-static.yaml avec le contenu suivant.

      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. Créez le PVC.

      kubectl create -f strmvol-pvc-static.yaml
    3. Vérifiez l'état du PVC.

      kubectl get pvc pvc-strmvol

      La sortie attendue indique que le PVC est désormais lié au PV.

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

Volume dynamique

  1. Créez une StorageClass.

    1. Créez un fichier nommé strmvol-sc.yaml avec le contenu suivant.

      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

      Les paramètres dans parameters sont décrits ci-dessous :

      • Configuration du secret

        Parameter

        Required

        Description

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

        Yes

        Le nom du secret qui stocke les informations AccessKey.

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

        Yes

        L'espace de noms du secret contenant les informations AccessKey.

      • Configuration du volume

        Parameter

        Required

        Description

        bucket

        Yes

        Le bucket OSS à monter.

        path

        No

        Le chemin du répertoire à monter dans le bucket OSS. Ce chemin est relatif à la racine du bucket.

        Important

        Sélectionnez un chemin de montage en appliquant le principe du moindre privilège.

        url

        Yes

        L'endpoint interne pour OSS. Il doit correspondre à l'endpoint affiché sur la page Overview du bucket dans la console OSS. Les formats courants pour les endpoints internes incluent :

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

        Important

        Le format d'endpoint interne vpc100-oss-{{regionName}}.aliyuncs.com est obsolète. Mettez à jour vers un nouveau format dès que possible.

        umask

        No

        Le masque de permission pour le système de fichiers après le montage du périphérique bloc virtuel.

        Par exemple, pour définir les permissions de fichier par défaut sur 755, définissez umask sur 022.

        directMode

        No

        Spécifie s'il faut activer le mode direct.

        • "true" : Active le mode direct, ce qui désactive la prélecture des données et la mise en cache locale. Cela convient aux scénarios de lecture aléatoire, tels que la lecture par lots aléatoire de jeux de données d'entraînement.

        • "false" : Désactive le mode direct (par défaut). Cela convient aux scénarios à usage général, tels que les lectures séquentielles de petits fichiers ou les lectures de grands fichiers. Si votre application n'a pas de schéma d'accès aux données spécifique, laissez ce mode désactivé.

        resourceLimit

        No

        Les ressources maximales du nœud que le périphérique bloc virtuel peut consommer.

        Par exemple, "2c4g" indique que le périphérique bloc virtuel peut utiliser jusqu'à 2 vCPU et 4 GiB de mémoire du nœud.

        Remarque
        • La mémoire est principalement utilisée pour la prélecture des données et la mise en cache locale. Lorsque le mode direct est activé, l'utilisation de la mémoire est nettement inférieure à la valeur prédéfinie.

        • Pour les systèmes d'exploitation autres qu'Alibaba Cloud Linux 3, les performances de lecture sont similaires quelle que soit la configuration. Par conséquent, des limites de ressources élevées ne sont pas recommandées. Pour plus d'informations, consultez Tests de performances de lecture des données.

    2. Créez la StorageClass.

      kubectl create -f strmvol-sc.yaml
  2. Créez un PVC.

    1. Créez un fichier nommé strmvol-pvc-dynamic.yaml avec le contenu suivant.

      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. Créez le PVC.

      kubectl create -f strmvol-pvc-dynamic.yaml
    3. Vérifiez l'état du PVC.

      kubectl get pvc pvc-strmvol

      La sortie attendue indique que le PVC est lié à un PV provisionné automatiquement par le pilote 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

Étape 2 : Créer une application et monter le volume

  1. Créez un fichier nommé strmvol-test.yaml avec le contenu suivant.

    L'exemple YAML suivant crée un StatefulSet avec un pod. Le pod demande des ressources de stockage en utilisant un PVC nommé pvc-strmvol, et le chemin de montage est /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. Créez le StatefulSet.

    kubectl create -f strmvol-test.yaml
  3. Vérifiez l'état de déploiement du pod dans le StatefulSet.

    kubectl get pod -l app=strmvol-test

    Sortie attendue :

    NAME             READY   STATUS    RESTARTS   AGE
    strmvol-test-0   1/1     Running   0          14s
  4. Vérifiez que le point de montage est un périphérique bloc et que l'application peut accéder aux données dans OSS.

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

    Sortie attendue :

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

Documentation connexe

Tests de performances du client strmvol