Lorsque plusieurs équipes exécutent des charges de travail d'IA ou de ML dans des namespaces Kubernetes distincts, la création d'un cache propre à chaque équipe gaspille de l'espace de stockage et ralentit l'accès aux données. Fluid permet de mettre en cache un jeu de données une seule fois dans un namespace source et de partager ce cache avec autant de namespaces de référence que nécessaire, sans dupliquer les caches ni ajouter de surcharge d'exécution.
La configuration repose sur deux rôles de namespace :
Namespace source (
share) : contient le Dataset et un runtime de mise en cache (JindoRuntime ou JuiceFSRuntime). C'est ici que réside le cache de données réel.Namespace de référence (
ref) : contient un Dataset de référence qui pointe vers le Dataset source à l'aide d'un point de montagedataset://. Les pods de ce namespace lisent les données depuis le cache partagé sans exécuter leur propre runtime de mise en cache.
Fonctionnement
Fluid utilise ThinRuntime pour lier un Dataset d'un namespace à un Dataset d'un autre. Lorsqu'un pod du namespace de référence lit des données, les requêtes sont acheminées vers le runtime de mise en cache du namespace source. Aucun runtime de mise en cache supplémentaire n'est créé dans le namespace de référence.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un cluster ACK Pro exécutant Kubernetes 1.18 ou une version ultérieure, avec un pool de nœuds autre que ContainerOS (le composant ack-fluid ne prend pas en charge ContainerOS). Pour plus d'informations, consultez la page Création d'un cluster ACK Pro.
-
La suite d'IA cloud-native installée avec le composant ack-fluid déployé :
Si vous n'avez pas encore installé la suite d'IA cloud-native, activez l'option Fluid acceleration lors de l'installation. Pour plus d'informations, consultez la page Déploiement de la suite d'IA cloud-native.
Si la suite d'IA cloud-native est déjà installée, accédez à la page Cloud-native AI Suite dans la console ACK et déployez le composant ack-fluid.
Si Fluid open source est déjà installé, désinstallez-le avant de déployer le composant ack-fluid.
Un client kubectl connecté à votre cluster ACK Pro. Pour plus d'informations, consultez la page Connexion à un cluster à l'aide de kubectl.
Étape 1 : Téléversement du jeu de données de test vers OSS
Téléchargez le jeu de données de test (environ 2 Go).
Téléversez le jeu de données dans votre bucket Object Storage Service (OSS) à l'aide d'ossutil. Pour plus d'informations, consultez la page Installation d'ossutil.
Étape 2 : Création d'un jeu de données partagé et d'un runtime
Créez un namespace nommé share pour héberger le Dataset partagé et le runtime. Choisissez le type de runtime correspondant à votre configuration de stockage.
JindoRuntime
-
Créez le namespace
share:kubectl create ns share -
Créez un Secret pour stocker la paire AccessKey de votre bucket OSS :
kubectl apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: dataset-secret namespace: share stringData: fs.oss.accessKeyId: <YourAccessKey ID> fs.oss.accessKeySecret: <YourAccessKey Secret> EOFRemplacez
<YourAccessKey ID>et<YourAccessKey Secret>par votre AccessKey ID et votre AccessKey Secret. Pour plus d'informations, consultez la section Obtention d'une paire AccessKey. -
Créez un fichier nommé
shared-dataset.yamlavec le contenu suivant :# Dataset: describes the data stored in OSS (the underlying file system, UFS). apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: shared-dataset namespace: share spec: mounts: - mountPoint: oss://<oss_bucket>/<bucket_dir> # Path to the data in your OSS bucket. options: fs.oss.endpoint: <oss_endpoint> # Endpoint of your OSS bucket. name: hadoop path: "/" encryptOptions: - name: fs.oss.accessKeyId valueFrom: secretKeyRef: name: dataset-secret key: fs.oss.accessKeyId - name: fs.oss.accessKeySecret valueFrom: secretKeyRef: name: dataset-secret key: fs.oss.accessKeySecret --- # JindoRuntime: enables JindoFS-based data caching in the cluster. apiVersion: data.fluid.io/v1alpha1 kind: JindoRuntime metadata: name: shared-dataset namespace: share spec: replicas: 1 tieredstore: levels: - mediumtype: MEM path: /dev/shm quota: 4Gi high: "0.95" low: "0.7"Pour plus d'informations sur la configuration d'un Dataset et de JindoRuntime, consultez la section Utilisation de JindoFS pour accélérer l'accès à OSS.
-
Appliquez la configuration :
kubectl apply -f shared-dataset.yamlRésultat attendu :
dataset.data.fluid.io/shared-dataset created jindoruntime.data.fluid.io/shared-dataset created -
Attendez quelques minutes, puis vérifiez que le Dataset est lié et que JindoRuntime est prêt :
kubectl get dataset,jindoruntime -n shareRésultat attendu :
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE dataset.data.fluid.io/shared-dataset 1.16GiB 0.00B 4.00GiB 0.0% Bound 4m1s NAME MASTER PHASE WORKER PHASE FUSE PHASE AGE jindoruntime.data.fluid.io/shared-dataset Ready Ready Ready 15mLe Dataset est lié et JindoRuntime est prêt lorsque toutes les phases indiquent
Ready.
JuiceFSRuntime
-
Créez le namespace
share:kubectl create ns share -
Créez un Secret pour stocker les informations d'identification de votre bucket OSS et de votre volume JuiceFS :
kubectl apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: dataset-secret namespace: share type: Opaque stringData: token: <JUICEFS_VOLUME_TOKEN> access-key: <OSS_ACCESS_KEY> secret-key: <OSS_SECRET_KEY> EOFRemplacez
<OSS_ACCESS_KEY>et<OSS_SECRET_KEY>par votre AccessKey ID et votre AccessKey Secret. Pour plus d'informations, consultez la section Obtention d'une paire AccessKey. -
Créez un fichier nommé
shared-dataset.yamlavec le contenu suivant :# Dataset: describes the data stored in OSS (the underlying file system, UFS). apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: shared-dataset namespace: share spec: accessModes: ["ReadOnlyMany"] sharedEncryptOptions: - name: access-key valueFrom: secretKeyRef: name: dataset-secret key: access-key - name: secret-key valueFrom: secretKeyRef: name: dataset-secret key: secret-key - name: token valueFrom: secretKeyRef: name: dataset-secret key: token mounts: - name: <JUICEFS_VOLUME_NAME> mountPoint: juicefs:/// # Mount point of the JuiceFS file system. options: bucket: https://<OSS_BUCKET_NAME>.oss-<REGION_ID>.aliyuncs.com # Example: https://mybucket.oss-cn-beijing-internal.aliyuncs.com --- # JuiceFSRuntime: enables JuiceFS-based data caching in the cluster. apiVersion: data.fluid.io/v1alpha1 kind: JuiceFSRuntime metadata: name: shared-dataset namespace: share spec: replicas: 1 tieredstore: levels: - mediumtype: MEM path: /dev/shm quota: 1Gi high: "0.95" low: "0.7" -
Appliquez la configuration :
kubectl apply -f shared-dataset.yamlRésultat attendu :
dataset.data.fluid.io/shared-dataset created juicefsruntime.data.fluid.io/shared-dataset created -
Attendez quelques minutes, puis vérifiez que le Dataset est lié :
kubectl get dataset,juicefsruntime -n shareRésultat attendu :
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE dataset.data.fluid.io/shared-dataset 2.32GiB 0.00B 4.00GiB 0.0% Bound 3d16h NAME WORKER PHASE FUSE PHASE AGE juicefsruntime.data.fluid.io/shared-dataset 3m50s
Étape 3 : Création d'un jeu de données de référence et d'un pod
-
Créez le namespace
ref:kubectl create ns ref -
Créez un fichier nommé
ref-dataset.yamlavec le contenu suivant :dataset://: préfixe de protocole indiquant que ce Dataset fait référence à un autre Dataset.share: namespace où réside le Dataset source.shared-dataset: nom du Dataset source.
ImportantLa valeur
mountPointdoit utiliser le préfixe de protocoledataset://. Tout autre format entraîne l'échec de la création du Dataset, et les champs de la sectionspecn'ont aucun effet.apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: ref-dataset namespace: ref spec: mounts: - mountPoint: dataset://share/shared-datasetLa valeur
mountPointsuit le formatdataset://<namespace>/<dataset-name>: -
Appliquez le Dataset de référence :
kubectl apply -f ref-dataset.yaml -
Créez un fichier nommé
app.yamlavec le contenu suivant. Cette opération crée un pod dans le namespacerefqui monte le Dataset de référence sur/data.apiVersion: v1 kind: Pod metadata: name: nginx namespace: ref spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 command: - "bash" - "-c" - "sleep inf" volumeMounts: - mountPath: /data name: ref-data volumes: - name: ref-data persistentVolumeClaim: claimName: ref-dataset -
Déployez le pod :
kubectl apply -f app.yaml -
Vérifiez que le pod est en cours d'exécution :
kubectl get pods -n ref -o wideLe pod est prêt lorsque son statut indique
Running.
Étape 4 : Test du partage et de la mise en cache des données
-
Consultez les pods dans les deux namespaces :
kubectl get pods -n share kubectl get pods -n refRésultat attendu :
# Pods in the share namespace NAME READY STATUS RESTARTS AGE shared-dataset-jindofs-fuse-ftkb5 1/1 Running 0 44s shared-dataset-jindofs-master-0 1/1 Running 0 9m13s shared-dataset-jindofs-worker-0 1/1 Running 0 9m13s # Pods in the ref namespace NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 118sTrois pods liés au cache s'exécutent dans le namespace
share. Le namespacerefne contient que le podnginx; aucun pod de runtime de mise en cache n'y est créé. -
Connectez-vous au pod
nginx:kubectl exec nginx -n ref -it -- sh -
Testez le partage des données en interrogeant le fichier dans le répertoire
/data:du -sh /data/wwm_uncased_L-24_H-1024_A-16.zipRésultat attendu :
1.3G /data/wwm_uncased_L-24_H-1024_A-16.zipLe pod
nginxdu namespacerefpeut accéder au fichier stocké dans le namespaceshare. -
Testez la mise en cache des données en lisant le fichier deux fois :
Les valeurs de latence suivantes sont fournies à titre indicatif uniquement. Les résultats réels varient selon votre environnement.
# First read — data is fetched from OSS and written to cache time cat /data/wwm_uncased_L-24_H-1024_A-16.zip > /dev/null real 0m1.166s user 0m0.007s sys 0m1.154s # Second read — data is served from cache time cat /data/wwm_uncased_L-24_H-1024_A-16.zip > /dev/null real 0m0.289s user 0m0.011s sys 0m0.274sLa seconde lecture s'achève en 0,289 seconde contre 1,166 seconde pour la première, ce qui confirme que le fichier est mis en cache après le premier accès.