すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Fluid を使用したエッジノードからの OSS ファイルへのアクセスの高速化

最終更新日:Dec 26, 2025

Fluid は、オープンソースの Kubernetes ネイティブな分散データセットオーケストレーションおよびアクセラレーションエンジンです。ビッグデータや AI アプリケーションなど、クラウドネイティブシナリオにおけるデータ集約型アプリケーション向けに設計されています。エッジシナリオでは、Fluid のデータセットアクセラレーションエンジンにより、エッジノードが Object Storage Service (OSS) ファイルにアクセスする速度を大幅に向上させることができます。このトピックでは、ACK Edge クラスターで Fluid のデータ高速化機能を使用する方法について説明します。

前提条件

  • Kubernetes 1.18 以降を実行する ACK Edge クラスターが作成されていること。詳細については、「ACK Edge クラスターの作成」をご参照ください。

  • エッジノードプールが作成され、エッジノードが追加されていること。詳細については、「エッジノードプールの作成」および「エッジノードの追加」をご参照ください。

  • クラウドネイティブ AI スイートがインストールされ、ack-fluid コンポーネントがデプロイされていること。

    重要

    オープンソースの Fluid がインストールされている場合は、ack-fluid コンポーネントをデプロイする前にアンインストールしてください。

    • クラウドネイティブ AI スイートがインストールされていない場合は、インストール中に [Fluid データ高速化] を選択します。詳細については、「AI Suite コンソールのデプロイ」をご参照ください。

    • クラウドネイティブ AI スイートがすでにインストールされている場合は、[ACK コンソール][クラウドネイティブ AI スイート] ページに移動し、[ack-fluid] をデプロイします。

  • kubectl クライアントが Kubernetes クラスターに接続されていること。詳細については、「kubectl を使用したクラスターへの接続」をご参照ください。

  • OSS が有効化されていること。詳細については、「OSS の有効化」をご参照ください。

ステップ 1:OSS バケットでのデータの準備

  1. 次のコマンドを実行して、ご利用の Elastic Compute Service (ECS) インスタンスにテストデータをダウンロードします。

    wget https://archive.apache.org/dist/spark/spark-3.0.1/spark-3.0.1-bin-hadoop2.7.tgz
  2. ダウンロードしたテストデータを Alibaba Cloud OSS のバケットにアップロードします。

    重要

    以下の手順では、Alibaba Cloud Linux 3.2104 LTS 64 ビットを実行している ECS インスタンスから OSS にデータをアップロードする方法について説明します。他のオペレーティングシステムでの手順については、「ossutil コマンドリファレンス」および「ossutil」をご参照ください。

    1. ossutil をインストールします

    2. examplebucket という名前のバケットを作成します。

      • 次のコマンドを実行して、examplebucket を作成します。

        ossutil mb oss://examplebucket
      • 次の出力は、examplebucket が作成されたことを示します。

        0.668238(s) elapsed
    3. ダウンロードしたテストデータを examplebucket バケットにアップロードします。

      ossutil cp spark-3.0.1-bin-hadoop2.7.tgz oss://examplebucket

ステップ 2:Dataset と JindoRuntime の作成

  1. データセットを作成する前に、ECS インスタンスのルートディレクトリに mySecret.yaml という名前のファイルを作成します。

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    stringData:
      fs.oss.accessKeyId: xxx
      fs.oss.accessKeySecret: xxx

    fs.oss.accessKeyIdfs.oss.accessKeySecret には、「ステップ 1」で OSS へのアクセスに使用した AccessKey IDAccessKey Secret を指定します。

  2. 次のコマンドを実行して Secret を作成します。Kubernetes は作成された Secret を暗号化し、保存された情報がプレーンテキストとして公開されるのを防ぎます。

    kubectl create -f mySecret.yaml
  3. 次のサンプル YAML を使用して、2つの部分からなる resource.yaml という名前のファイルを作成します。

    • リモートデータセットと基盤となるファイルシステム (UFS) を記述する Dataset を作成します。

    • キャッシュサービスを提供する JindoFS クラスターを起動するための JindoRuntime を作成します。

    apiVersion: data.fluid.io/v1alpha1
    kind: Dataset
    metadata:
      name: hadoop
    spec:
      nodeAffinity:
        required:
          nodeSelectorTerms:
            - matchExpressions:
              - key: alibabacloud.com/nodepool-id
                operator: In
                values:
                  - npxxxxxxxxxxxxxx
      mounts:
        - mountPoint: oss://<oss_bucket>/<bucket_dir>
          options:
            fs.oss.endpoint: <oss_endpoint>
          name: hadoop
          path: "/"
          encryptOptions:
            - name: fs.oss.accessKeyId
              valueFrom:
                secretKeyRef:
                  name: mysecret
                  key: fs.oss.accessKeyId
            - name: fs.oss.accessKeySecret
              valueFrom:
                secretKeyRef:
                  name: mysecret
                  key: fs.oss.accessKeySecret
    ---
    apiVersion: data.fluid.io/v1alpha1
    kind: JindoRuntime
    metadata:
      name: hadoop
    spec:
      nodeSelector:
        alibabacloud.com/nodepool-id: npxxxxxxxxxxxxxx
      replicas: 2
      tieredstore:
        levels:
          - mediumtype: MEM
            path: /dev/shm
            volumeType: emptyDir
            quota: 2Gi
            high: "0.99"
            low: "0.95"
    説明
    • ACK Edge クラスターでは、nodeAffinitynodeSelector を使用して、Dataset と JindoRuntime を同じノードプールにデプロイする必要があります。これにより、ノードプール内のノード間のネットワーク接続が確保されます。

    • エッジノードの管理と OSS へのアクセスの両方で、クラウドからエッジへのネットワーク接続が必要です。管理チャネルの安定性を確保するために、十分なネットワーク帯域幅を確保することを推奨します。

    パラメーターの説明を次の表に示します。

    パラメーター

    説明

    mountPoint

    マウントする UFS のパス。フォーマットは oss://<oss_bucket>/<bucket_dir> です。このパスは単一のファイルではなく、ディレクトリを指す必要があります。パスにエンドポイントは不要です。

    fs.oss.endpoint

    OSS バケットのパブリックまたはプライベートエンドポイント。詳細については、「リージョンとエンドポイント」をご参照ください。

    replicas

    JindoFS クラスター内のワーカー数。

    mediumtype

    キャッシュタイプ。このパラメーターは、JindoRuntime テンプレートを作成する際に使用するキャッシュタイプを指定します。有効な値は HDD、SDD、MEM です。

    path

    ストレージパス。パスは 1 つだけ指定できます。mediumtype を MEM に設定した場合は、ログなどのデータを保存するためのローカルパスを指定する必要があります。

    quota

    キャッシュデータの最大サイズ。単位:GB。

    high

    ストレージ容量の上限。

    low

    ストレージ容量の下限。

  4. 次のコマンドを実行して、データセットと JindoRuntime を作成します。

    kubectl create -f resource.yaml
  5. 次のコマンドを実行して、データセットがデプロイされているかを確認します。

    kubectl get dataset hadoop

    想定される出力:

    NAME     UFS TOTAL SIZE   CACHED   CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
    hadoop        210MiB       0.00B    4.00GiB              0.0%          Bound   1h
  6. 次のコマンドを実行して、JindoRuntime がデプロイされているかを確認します。

    kubectl get jindoruntime hadoop

    想定される出力:

    NAME     MASTER PHASE   WORKER PHASE   FUSE PHASE   AGE
    hadoop   Ready          Ready          Ready        4m45s
  7. 次のコマンドを実行して、永続ボリューム (PV) と永続ボリューム要求 (PVC) が作成されているかを確認します。

    kubectl get pv,pvc

    想定される出力:

    NAME                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS   REASON   AGE
    persistentvolume/hadoop   100Gi      RWX            Retain           Bound    default/hadoop                           52m
    
    NAME                           STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    persistentvolumeclaim/hadoop   Bound    hadoop   100Gi      RWX                           52m

上記の結果は、データセットと JindoRuntime が作成されたことを示します。

ステップ 3:アプリケーションコンテナーを作成して高速化効果をテスト

コンテナーにアプリケーションをデプロイして、JindoFS のデータ高速化をテストできます。また、機械学習ジョブを送信して関連機能を使用することもできます。このトピックでは、コンテナーにアプリケーションをデプロイして、同じデータへのアクセスをテストします。このテストでは、アクセス時間を比較することで JindoRuntime の高速化効果を示します。

  1. 次の内容で app.yaml という名前のファイルを作成します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: demo-app
    spec:
      nodeSelector:
        alibabacloud.com/nodepool-id: npxxxxxxxxxxxxx
      containers:
        - name: demo
          image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
          volumeMounts:
            - mountPath: /data
              name: hadoop
      volumes:
        - name: hadoop
          persistentVolumeClaim:
            claimName: hadoop
    説明

    ACK Edge クラスターでは、nodeSelector を使用して、テスト Pod を「ステップ 2」で指定したノードプールにデプロイする必要があります。

  2. 次のコマンドを実行して、アプリケーションをデプロイします。

    kubectl create -f app.yaml
  3. 次のコマンドを実行して、指定したファイルのサイズをクエリします。

    kubectl exec -it demo-app -- bash
    du -sh /data/spark-3.0.1-bin-hadoop2.7.tgz

    想定される出力:

    210M    /data/spark-3.0.1-bin-hadoop2.7.tgz
  4. 次のコマンドを実行して、ファイルのコピーにかかった時間をクエリします。

    time cp /data/spark-3.0.1-bin-hadoop2.7.tgz /dev/null

    想定される出力:

    real    0m18.386s
    user    0m0.002s
    sys    0m0.105s

    出力結果は、ファイルのコピーに 18 秒かかったことを示します。

  5. 次のコマンドを実行して、データセットのキャッシュデータを確認します。

    kubectl get dataset hadoop

    想定される出力:

    NAME     UFS TOTAL SIZE   CACHED   CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
    hadoop   210.00MiB       210.00MiB    4.00GiB        100.0%           Bound   1h

    出力結果は、210 MiB のデータがローカルストレージにキャッシュされたことを示します。

  6. 次のコマンドを実行して、現在のアプリケーションを削除し、同じアプリケーションを再度作成します。

    説明

    このステップは、ページキャッシュなどの他の要因が結果に影響するのを避けるために実行します。

    kubectl delete -f app.yaml && kubectl create -f app.yaml
  7. 次のコマンドを実行して、ファイルのコピーにかかった時間をクエリします。

    kubectl exec -it demo-app -- bash
    time cp /data/spark-3.0.1-bin-hadoop2.7.tgz /dev/null

    想定される出力:

    real    0m0.048s
    user    0m0.001s
    sys     0m0.046s

    出力結果は、ファイルのコピーに 48 ミリ秒かかり、300 倍以上短縮されたことを示します。

    説明

    これは、ファイルが JindoFS によってキャッシュされたためです。

(オプション) 環境のクリーンアップ

データ高速化を今後使用しない場合は、次のコマンドを実行して環境をクリーンアップできます。

次のコマンドを実行して、アプリケーションを削除します。

kubectl delete pod demo-app

次のコマンドを実行して、データセットと JindoRuntime を削除します。

kubectl delete dataset hadoop