Container Service for Kubernetes (ACK) サーバーレス環境で Fluid をデプロイし、OSS データをローカルにキャッシュすることで、繰り返し実行されるジョブの読み取り時間を 1 秒未満に短縮できます。Fluid コントローラー、キャッシュシステム、アプリケーションポッドはすべてサーバーレス環境上で実行可能です。
Fluid をデプロイし、OSS バケットをバックエンドとする Dataset および JindoRuntime を構成して、キャッシュされたデータを読み取るジョブを実行します。
前提条件
以下の要件を満たしていることを確認してください。
-
ACK サーバーレスクラスター(Kubernetes 1.18 以降、CoreDNS 搭載)が実行中であること。
-
kubectl がクラスターへの接続用に構成済みであること。
-
有効化済みの OSS インスタンスと、バケットが準備済みであること。
制限事項
Fluid は ACK サーバーレスクラスターの仮想ノードスケジューリング機能と競合するため、両方を同時に使用することはできません。詳細については、「クラスターの仮想ノードスケジューリングポリシーを有効化する」をご参照ください。
この問題を回避するには、すべての JindoRuntime キャッシュワーカーポッドおよびアプリケーションポッドに alibabacloud.com/burst-resource: eci_only アノテーションを含める必要があります。このアノテーションは、以下の YAML の例に記載されています。
Fluid コントロールプレーンのデプロイ
オープンソース版 Fluid がインストール済みの場合は、ack-fluid をデプロイする前にアンインストールしてください。
-
ACK コンソールで、ナビゲーションウィンドウのクラスターをクリックします。
-
クラスター名をクリックします。ナビゲーションウィンドウで、アプリケーション > Helm をクリックします。
-
Helm ページで、デプロイをクリックします。
-
基本情報で以下のパラメーターを設定し、次へをクリックします。
デフォルトのリリース名は
ack-fluidで、名前空間はfluid-systemです。これらを変更すると、[確認] ダイアログが表示されます。[はい] をクリックして復元します。パラメーター 値 ソース マーケットプレイス チャート ack-fluid -
パラメーターで、OK をクリックします。
-
Fluid コントロールプレーンが実行中であることを確認します。
-
Dataset Controller — Dataset CR のライフサイクルを管理します。
-
Fluid Webhook — サーバーレスシナリオでの透過的なデータアクセスのために、アプリケーションポッドにキャッシングサイドカーを注入します。
Fluid コントロールプレーンには、JindoFS、JuiceFS、Alluxio 向けのコントローラーも含まれます。これらのコンポーネントは、各キャッシュシステムを構成した際にオンデマンドでスケーリングされます。
kubectl get pod -n fluid-system期待される出力:
NAME READY STATUS RESTARTS AGE dataset-controller-d99998f79-dgkmh 1/1 Running 0 2m48s fluid-webhook-55c6d9d497-dmrzb 1/1 Running 0 2m49s上記の 2 つのコンポーネントはそれぞれ異なる役割を担っています。
-
データアクセスの高速化
OSS へのテストデータのアップロード
-
サンプルデータセットなどの 2 GB のテストファイルを作成します。
-
ossutil を使用して、ファイルをご利用の OSS バケットにアップロードします。
Dataset および JindoRuntime リソースの作成
この例では、キャッシュバックエンドとして JindoFS(JindoRuntime)を使用します。Fluid では、外部データソースを次の 2 つのカスタムリソース(CR)として表現します。
-
Dataset — 外部ストレージシステム内のデータを指します。
-
JindoRuntime — キャッシュシステムの構成を定義します。
Fluid は遅延読み込みを採用しています。初回アクセス時に OSS からローカルキャッシュへデータをフェッチし、それ以降の読み取りはキャッシュから行われます。初回実行時のレイテンシーを排除するには、ジョブを送信する前にキャッシュを事前ウォームアップしてください。
-
OSS 認証情報を格納するためのシークレットを作成します。
kubectl create secret generic oss-access-key \ --from-literal=fs.oss.accessKeyId=<access_key_id> \ --from-literal=fs.oss.accessKeySecret=<access_key_secret> -
dataset.yamlという名前のファイルを作成します。パラメーター 説明 mountPointoss://<bucket_name>/<bucket_path>形式の OSS マウントパス。単一のマウントポイントを使用する場合は、pathを/に設定します。fs.oss.endpointOSS バケットのエンドポイント。同一リージョンからのアクセスには内部エンドポイント(例: oss-cn-hangzhou-internal.aliyuncs.com)を使用し、それ以外の場合はパブリックエンドポイント(例:oss-cn-hangzhou.aliyuncs.com)を使用します。replicasキャッシュワーカーポッドの数。合計キャッシュ容量を決定します。 alibabacloud.com/burst-resource: eci_onlyキャッシュワーカーポッドでの仮想ノードスケジューリングを無効化します。必須項目です — Fluid は仮想ノードスケジューリングと競合します(制限事項を参照)。 k8s.aliyun.com/eci-use-specsECI インスタンス仕様 (各キャッシュワーカー Pod 用) k8s.aliyun.com/eci-image-cacheポッド起動を高速化するためにインスタンスイメージキャッシュを有効化します。 tieredstore.levels.mediumtypeキャッシュメディア。有効な値: MEM(メモリ)、SSD、HDD。キャッシュメディアの選択をご参照ください。tieredstore.levels.volumeTypeボリュームタイプ。メモリまたはシステムディスクの場合は emptyDirを使用します(ノードの可用性に影響を与える残留キャッシュを防止)。データディスクの場合はhostPathを使用し、pathをマウントポイントに設定します。デフォルト:hostPath。tieredstore.levels.pathキャッシュパス。1 つのパスのみサポートされます。 tieredstore.levels.quotaワーカーあたりの最大キャッシュ容量(例: 10Gi)。tieredstore.levels.high/lowキャッシュエビクションの高・低ウォーターマーク。 apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: demo-dataset spec: mounts: - mountPoint: oss://<bucket_name>/<bucket_path> name: demo path: / options: fs.oss.endpoint: oss-<region>.aliyuncs.com encryptOptions: - name: fs.oss.accessKeyId valueFrom: secretKeyRef: name: oss-access-key key: fs.oss.accessKeyId - name: fs.oss.accessKeySecret valueFrom: secretKeyRef: name: oss-access-key key: fs.oss.accessKeySecret --- apiVersion: data.fluid.io/v1alpha1 kind: JindoRuntime metadata: name: demo-dataset spec: # キャッシュワーカーノードの数 replicas: 2 worker: podMetadata: annotations: # 必須:仮想ノードスケジューリングを無効化(Fluid と競合 — 制限事項を参照) alibabacloud.com/burst-resource: eci_only # JindoFS キャッシュワーカーポッド向けの ECI インスタンス仕様 k8s.aliyun.com/eci-use-specs: <eci_instance_spec> # ポッド起動を高速化するためにインスタンスイメージキャッシュを有効化 k8s.aliyun.com/eci-image-cache: "true" tieredstore: levels: # ワーカーノードあたり 10 GiB のメモリキャッシュ - mediumtype: MEM volumeType: emptyDir path: /dev/shm quota: 10Gi high: "0.99" low: "0.99"主なパラメーター:
-
マニフェストを適用します。
kubectl create -f dataset.yaml -
キャッシュシステムのデプロイが完了するまで 1~2 分待ち、Dataset のステータスを確認します。
PHASEがNotBoundの場合、キャッシュシステムはまだ初期化中です。1~2 分待って再度確認してください。kubectl get dataset demo-dataset期待される出力:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE demo-dataset 1.16GiB 0.00B 20.00GiB 0.0% Bound 2m58sPHASE: Boundは正常にデプロイされたことを示します。その他の列には、OSS データサイズ、キャッシュ済み量、合計キャッシュ容量が表示されます。
キャッシュの事前ウォームアップ(任意)
Fluid は遅延読み込みを採用しているため、大規模なデータセットの場合、初回ジョブ実行時は OSS からデータをフェッチする必要があり、数十秒かかることがあります。初回実行時のレイテンシーを排除するには、キャッシュを事前にウォームアップしてください。
-
dataload.yamlという名前のファイルを作成します。apiVersion: data.fluid.io/v1alpha1 kind: DataLoad metadata: name: data-warmup spec: dataset: name: demo-dataset namespace: default loadMetadata: true -
事前ウォームアップジョブを開始します。
kubectl create -f dataload.yamlステータスが
Completeになるまで待ちます。NAME DATASET PHASE AGE DURATION data-warmup demo-dataset Complete 99s 58sキャッシュウォームアップは約
58sで完了しました。
ジョブアプリケーションの作成
アプリケーションコンテナまたは機械学習ジョブを使用して、JindoFS 経由で高速化されたデータにアクセスします。demo-dataset PVC は自動的に JindoFS キャッシュから読み取られるため、コードの変更は不要です。alibabacloud.com/fluid-sidecar-target: eci ラベルにより、Fluid Webhook がキャッシングサイドカーを注入します。
-
job.yamlという名前のファイルを作成します。apiVersion: batch/v1 kind: Job metadata: name: demo-app spec: template: metadata: labels: alibabacloud.com/fluid-sidecar-target: eci annotations: # 必須:仮想ノードスケジューリングを無効化(Fluid と競合 — 制限事項を参照) alibabacloud.com/burst-resource: eci_only # アプリケーションポッド向けの ECI インスタンス仕様 k8s.aliyun.com/eci-use-specs: ecs.g7.4xlarge spec: containers: - name: demo image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 command: - /bin/bash args: - -c - du -sh /data && time cp -r /data/ /tmp volumeMounts: - mountPath: /data name: demo restartPolicy: Never volumes: - name: demo persistentVolumeClaim: claimName: demo-dataset backoffLimit: 4 -
ジョブを送信します。
kubectl create -f job.yaml -
ジョブ完了後にログを確認します。
kubectl logs demo-app-jwktf -c demo期待される出力:
1.2G /data real 0m0.992s user 0m0.004s sys 0m0.674sファイルコピーの
real時間は0m0.992sでした。
クリーンアップ
不要な課金を回避するために、リソースをクリーンアップします。
-
ジョブを削除します。
kubectl delete job demo-app -
Dataset を削除します。これにより、関連するキャッシュシステムコンポーネントも削除されます。
重要クリーンアップには約 1 分かかります。次の手順に進む前に、すべてのキャッシュポッドが削除されるのをお待ちください。
kubectl delete dataset demo-dataset -
Fluid コントロールプレーンをスケールダウンします。
kubectl get deployments.apps -n fluid-system | awk 'NR>1 {print $1}' | xargs kubectl scale deployments -n fluid-system --replicas=0データアクセスを再度有効にするには、新しい Dataset および JindoRuntime リソースを作成する前に、コントロールプレーンを再度スケールアップしてください。
kubectl scale -n fluid-system deployment dataset-controller --replicas=1 kubectl scale -n fluid-system deployment fluid-webhook --replicas=1