複数のチームが個別の Kubernetes 名前空間で AI/ML ワークロードを実行する場合、各チームが独自のキャッシュを作成すると、ストレージを浪費し、データアクセスが遅くなります。Fluid を使用すると、ソース名前空間にデータセットを一度キャッシュし、そのキャッシュを任意の数の参照名前空間と共有できます。これにより、キャッシュの重複や余分なランタイムのオーバーヘッドがなくなります。
この設定では、2つの名前空間ロールを使用します:
ソース名前空間 (
share):Dataset とキャッシュランタイム (JindoRuntime または JuiceFSRuntime) を保持します。実際のデータキャッシュはここに存在します。参照名前空間 (
ref):dataset://マウントポイントを使用してソース Dataset を指す参照 Dataset を保持します。この名前空間の Pod は、独自のキャッシュランタイムを実行せずに共有キャッシュから読み取ります。
仕組み
Fluid は ThinRuntime を使用して、ある名前空間の Dataset を別の名前空間の Dataset にリンクします。参照名前空間の Pod がデータを読み取ると、リクエストはソース名前空間のキャッシュランタイムにルーティングされます。参照名前空間に追加のキャッシュランタイムは作成されません。
前提条件
開始する前に、以下が準備できていることを確認してください:
Kubernetes 1.18 以降を実行している ACK Pro マネージドクラスターで、ContainerOS 以外のノードプールを使用していること(ack-fluid コンポーネントは ContainerOS をサポートしていません)。詳細については、「ACK Pro マネージドクラスターの作成」をご参照ください。
ack-fluid コンポーネントがデプロイされたクラウドネイティブ AI スイートがインストールされていること:
クラウドネイティブ AI スイートをまだインストールしていない場合は、インストール時に [Fluid アクセラレーション] を有効にします。詳細については、「クラウドネイティブ AI スイートをデプロイする」をご参照ください。
クラウドネイティブ AI スイートがすでにインストールされている場合は、ACK コンソールの [Cloud-native AI Suite] ページに移動し、ack-fluid コンポーネントをデプロイします。
オープンソースの Fluid がすでにインストールされている場合は、ack-fluid コンポーネントをデプロイする前にアンインストールしてください。
お使いの ACK Pro マネージドクラスターに接続された kubectl クライアント。詳細については、「kubectl を使用したクラスターへの接続」をご参照ください。
ステップ 1:テストデータセットの OSS へのアップロード
テストデータセット (約 2 GB) をダウンロードします。
データセットを ossutil を使用して Object Storage Service (OSS) バケットにアップロードします。詳細については、「ossutil のインストール」をご参照ください。
ステップ 2:共有データセットとランタイムの作成
共有 Dataset とランタイムを保持するために、share という名前の名前空間を作成します。ご利用のストレージ設定に合ったランタイムタイプを選択してください。
JindoRuntime
share名前空間を作成します:kubectl create ns shareご利用の OSS バケットの AccessKey ペアを保存するための Secret を作成します:
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<YourAccessKey ID>と<YourAccessKey Secret>をご利用の AccessKey ID と AccessKey Secret に置き換えてください。詳細については、「AccessKey ペアの取得」をご参照ください。以下の内容で
shared-dataset.yamlという名前のファイルを作成します:# Dataset: OSS (基盤となるファイルシステム、UFS) に保存されているデータを記述します。 apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: shared-dataset namespace: share spec: mounts: - mountPoint: oss://<oss_bucket>/<bucket_dir> # ご利用の OSS バケット内のデータへのパス。 options: fs.oss.endpoint: <oss_endpoint> # ご利用の OSS バケットのエンドポイント。 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: クラスター内で JindoFS ベースのデータキャッシングを有効にします。 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"Dataset と JindoRuntime の設定に関する詳細については、「JindoFS を使用した OSS へのアクセス高速化」をご参照ください。
構成を適用します:
kubectl apply -f shared-dataset.yaml期待される出力:
dataset.data.fluid.io/shared-dataset created jindoruntime.data.fluid.io/shared-dataset created数分待ってから、Dataset がバインドされ、JindoRuntime が準備完了であることを確認します:
kubectl get dataset,jindoruntime -n share期待される出力:
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すべてのフェーズが
Readyと表示されたら、Dataset はバインドされ、JindoRuntime は準備完了です。
JuiceFSRuntime
share名前空間を作成します:kubectl create ns shareご利用の OSS バケットと JuiceFS ボリュームの認証情報を保存するための Secret を作成します:
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<OSS_ACCESS_KEY>と<OSS_SECRET_KEY>をご利用の AccessKey ID と AccessKey Secret に置き換えてください。詳細については、「AccessKey ペアの取得」をご参照ください。以下の内容で
shared-dataset.yamlという名前のファイルを作成します:# Dataset: OSS (基盤となるファイルシステム、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:/// # JuiceFS ファイルシステムのマウントポイント。 options: bucket: https://<OSS_BUCKET_NAME>.oss-<REGION_ID>.aliyuncs.com # 例:https://mybucket.oss-cn-beijing-internal.aliyuncs.com --- # JuiceFSRuntime: クラスター内で JuiceFS ベースのデータキャッシングを有効にします。 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"構成を適用します:
kubectl apply -f shared-dataset.yaml期待される出力:
dataset.data.fluid.io/shared-dataset created juicefsruntime.data.fluid.io/shared-dataset created数分待ってから、Dataset がバインドされていることを確認します:
kubectl get dataset,juicefsruntime -n share期待される出力:
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
ステップ 3:参照データセットと Pod の作成
ref名前空間を作成します:kubectl create ns ref以下の内容で
ref-dataset.yamlという名前のファイルを作成します:dataset://— この Dataset が別の Dataset を参照することを示すプロトコルプレフィックス。share— ソース Dataset が存在する名前空間。shared-dataset— ソース Dataset の名前。
重要mountPointの値はdataset://プロトコルプレフィックスを使用する必要があります。他のフォーマットを使用するとデータセットの作成が失敗し、specセクションのフィールドは効果がありません。apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: ref-dataset namespace: ref spec: mounts: - mountPoint: dataset://share/shared-datasetmountPointの値はdataset://<namespace>/<dataset-name>のフォーマットに従います:参照 Dataset を適用します:
kubectl apply -f ref-dataset.yaml以下の内容で
app.yamlという名前のファイルを作成します。これにより、ref名前空間に Pod が作成され、参照 Dataset が/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-datasetPod をデプロイします:
kubectl apply -f app.yamlPod が実行中であることを確認します:
kubectl get pods -n ref -o widePod のステータスが
Runningと表示されたら、準備完了です。
ステップ 4:データ共有とキャッシングのテスト
両方の名前空間の Pod を確認します:
kubectl get pods -n share kubectl get pods -n ref期待される出力:
# share 名前空間の Pod 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 # ref 名前空間の Pod NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 118sshare名前空間では3つのキャッシュ関連 Pod が実行されています。ref名前空間にはnginxPod のみがあり、キャッシュランタイム Pod は作成されていません。nginxPod にログインします:kubectl exec nginx -n ref -it -- sh/dataディレクトリ内のファイルをクエリして、データ共有をテストします:du -sh /data/wwm_uncased_L-24_H-1024_A-16.zip期待される出力:
1.3G /data/wwm_uncased_L-24_H-1024_A-16.zip名前空間
ref内のnginxPod は、名前空間shareに保存されたファイルにアクセスできます。ファイルを2回読み取ってデータキャッシングをテストします:
以下のレイテンシ値は参考用です。実際の結果はご利用の環境によって異なります。
# 1回目の読み取り — データは OSS からフェッチされ、キャッシュに書き込まれます time cat /data/wwm_uncased_L-24_H-1024_A-16.zip > /dev/null real 0m1.166s user 0m0.007s sys 0m1.154s # 2回目の読み取り — データはキャッシュから提供されます time cat /data/wwm_uncased_L-24_H-1024_A-16.zip > /dev/null real 0m0.289s user 0m0.011s sys 0m0.274s2回目の読み取りは、1回目の読み取りの 1.166 秒に対して 0.289 秒で完了し、最初のアクセス後にファイルがキャッシュされたことを確認できます。