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.
RemarqueCentOS 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.
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, accédez à .
Sur la page Marketplace, recherchez strmvol-csi-driver et cliquez sur sa vignette.
Sur la page des détails de l'application, cliquez sur Deploy dans le coin supérieur droit.
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
-
Créez un utilisateur RAM et accordez-lui les autorisations requises.
-
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.
-
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
mybucketpar le nom de votre bucket.-
Stratégie de lecture seule OSS
-
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" }
-
(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.
Accordez les autorisations OSS à l'utilisateur RAM. Pour plus d'informations, consultez Gérer les autorisations des utilisateurs RAM.
-
L'AccessKey que vous créez sera stocké en tant que Secret pour le PV.
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.
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).
-
-
Créez un secret pour stocker les identifiants d'authentification permettant d'accéder aux données OSS.
Voici un exemple de commande. Remplacez
akIdetakSecretpar 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
-
Créez un PersistentVolume (PV).
-
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
nodeStageSecretRefParameter
Required
Description
nameYes
Le nom du secret qui stocke les informations AccessKey.
namespaceYes
L'espace de noms du secret contenant les informations AccessKey.
-
Paramètres dans
volumeAttributesParameter
Required
Description
bucketYes
Le bucket OSS à monter.
pathNo
Le chemin du répertoire à monter dans le bucket OSS. Ce chemin est relatif à la racine du bucket.
ImportantSélectionnez un chemin de montage en appliquant le principe du moindre privilège.
urlYes
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.comouhttps://oss-{{regionName}}-internal.aliyuncs.com.ImportantLe format d'endpoint interne
vpc100-oss-{{regionName}}.aliyuncs.comest obsolète. Mettez à jour vers un nouveau format dès que possible.umaskNo
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éfinissezumasksur022.directModeNo
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é.
resourceLimitNo
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.RemarqueLa 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.
-
-
Créez le PV.
kubectl create -f strmvol-pv.yaml -
Vérifiez l'état du PV.
kubectl get pv pv-strmvolSortie attendue :
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE pv-strmvol 20Gi ROX Retain Available <unset> 18s
-
-
Créez un PersistentVolumeClaim (PVC).
-
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 -
Créez le PVC.
kubectl create -f strmvol-pvc-static.yaml -
Vérifiez l'état du PVC.
kubectl get pvc pvc-strmvolLa 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
-
Créez une StorageClass.
-
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: ImmediateLes paramètres dans
parameterssont décrits ci-dessous :-
Configuration du secret
Parameter
Required
Description
csi.storage.k8s.io/node-stage-secret-nameYes
Le nom du secret qui stocke les informations AccessKey.
csi.storage.k8s.io/node-stage-secret-namespaceYes
L'espace de noms du secret contenant les informations AccessKey.
-
Configuration du volume
Parameter
Required
Description
bucketYes
Le bucket OSS à monter.
pathNo
Le chemin du répertoire à monter dans le bucket OSS. Ce chemin est relatif à la racine du bucket.
ImportantSélectionnez un chemin de montage en appliquant le principe du moindre privilège.
urlYes
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.comouhttps://oss-{{regionName}}-internal.aliyuncs.com.ImportantLe format d'endpoint interne
vpc100-oss-{{regionName}}.aliyuncs.comest obsolète. Mettez à jour vers un nouveau format dès que possible.umaskNo
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éfinissezumasksur022.directModeNo
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é.
resourceLimitNo
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.RemarqueLa 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.
-
-
Créez la StorageClass.
kubectl create -f strmvol-sc.yaml
-
-
Créez un PVC.
-
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 -
Créez le PVC.
kubectl create -f strmvol-pvc-dynamic.yaml -
Vérifiez l'état du PVC.
kubectl get pvc pvc-strmvolLa 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
-
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 -
Créez le StatefulSet.
kubectl create -f strmvol-test.yaml -
Vérifiez l'état de déploiement du pod dans le StatefulSet.
kubectl get pod -l app=strmvol-testSortie attendue :
NAME READY STATUS RESTARTS AGE strmvol-test-0 1/1 Running 0 14s -
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>