Tous les produits
Search
Centre de documentation

Container Service for Kubernetes:Share a Dataset across namespaces

Dernière mise à jour :Aug 11, 2026

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 montage dataset://. 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

  1. Téléchargez le jeu de données de test (environ 2 Go).

  2. 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

  1. Créez le namespace share :

    kubectl create ns share
  2. 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>
    EOF

    Remplacez <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.

  3. Créez un fichier nommé shared-dataset.yaml avec 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.

  4. Appliquez la configuration :

    kubectl apply -f shared-dataset.yaml

    Résultat attendu :

    dataset.data.fluid.io/shared-dataset created
    jindoruntime.data.fluid.io/shared-dataset created
  5. Attendez quelques minutes, puis vérifiez que le Dataset est lié et que JindoRuntime est prêt :

    kubectl get dataset,jindoruntime -n share

    Ré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        15m

    Le Dataset est lié et JindoRuntime est prêt lorsque toutes les phases indiquent Ready.

JuiceFSRuntime

  1. Créez le namespace share :

    kubectl create ns share
  2. 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>
    EOF

    Remplacez <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.

  3. Créez un fichier nommé shared-dataset.yaml avec 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"
  4. Appliquez la configuration :

    kubectl apply -f shared-dataset.yaml

    Résultat attendu :

    dataset.data.fluid.io/shared-dataset created
    juicefsruntime.data.fluid.io/shared-dataset created
  5. Attendez quelques minutes, puis vérifiez que le Dataset est lié :

    kubectl get dataset,juicefsruntime -n share

    Ré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

  1. Créez le namespace ref :

    kubectl create ns ref
  2. Créez un fichier nommé ref-dataset.yaml avec 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.

    Important

    La valeur mountPoint doit utiliser le préfixe de protocole dataset://. Tout autre format entraîne l'échec de la création du Dataset, et les champs de la section spec n'ont aucun effet.

    apiVersion: data.fluid.io/v1alpha1
    kind: Dataset
    metadata:
      name: ref-dataset
      namespace: ref
    spec:
      mounts:
      - mountPoint: dataset://share/shared-dataset

    La valeur mountPoint suit le format dataset://<namespace>/<dataset-name> :

  3. Appliquez le Dataset de référence :

    kubectl apply -f ref-dataset.yaml
  4. Créez un fichier nommé app.yaml avec le contenu suivant. Cette opération crée un pod dans le namespace ref qui 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
  5. Déployez le pod :

    kubectl apply -f app.yaml
  6. Vérifiez que le pod est en cours d'exécution :

    kubectl get pods -n ref -o wide

    Le pod est prêt lorsque son statut indique Running.

Étape 4 : Test du partage et de la mise en cache des données

  1. Consultez les pods dans les deux namespaces :

    kubectl get pods -n share
    kubectl get pods -n ref

    Ré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          118s

    Trois pods liés au cache s'exécutent dans le namespace share. Le namespace ref ne contient que le pod nginx ; aucun pod de runtime de mise en cache n'y est créé.

  2. Connectez-vous au pod nginx :

    kubectl exec nginx -n ref -it -- sh
  3. 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.zip

    Résultat attendu :

    1.3G    /data/wwm_uncased_L-24_H-1024_A-16.zip

    Le pod nginx du namespace ref peut accéder au fichier stocké dans le namespace share.

  4. 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.274s

    La 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.