アプリケーション Pod のライフサイクル中に、ユーザー空間のファイルシステム (FUSE) デーモンが予期せずクラッシュすることがあります。その結果、アプリケーション Pod は FUSE ファイルシステムを使用してデータにアクセスできなくなります。このトピックでは、FUSE ファイルシステムのマウントポイントの自動回復機能を有効にして、アプリケーション Pod を再起動せずにアプリケーションデータへのアクセスを復元する方法について説明します。
前提条件
non-containerOS を使用する Container Service for Kubernetes (ACK) Pro マネージドクラスターが作成されており、クラスターの Kubernetes バージョンが 1.18 以降であること。詳細については、「ACK Pro マネージドクラスターの作成」をご参照ください。
重要ack-fluid コンポーネントは現在 ContainerOS ではサポートされていません。
クラウドネイティブ AI スイートがインストールされ、ack-fluid コンポーネントがデプロイされていること。
重要オープンソースの Fluid をインストールしている場合は、ack-fluid コンポーネントをデプロイする前に Fluid をアンインストールしてください。
クラウドネイティブ AI スイートをインストールしていない場合: [Fluid] をデプロイし、データキャッシュアクセラレーションを有効にします。詳細については、「クラウドネイティブ AI スイートのデプロイ」をご参照ください。
クラウドネイティブ AI スイートをすでにインストールしている場合は、ACK コンソールの [クラウドネイティブ AI スイート] ページに移動し、[ack-fluid] コンポーネントをデプロイします。
仮想ノードが ACK Pro マネージドクラスターにデプロイされていること。詳細については、「Pod を Elastic Container Instance にスケジューリングする」をご参照ください。
kubectl クライアントが ACK Pro マネージドクラスターに接続されていること。詳細については、「kubectl を使用してクラスターに接続する」をご参照ください。
Object Storage Service (OSS) が有効化され、バケットが作成されていること。詳細については、「OSS の有効化」および「バケットの作成」をご参照ください。
概要
Fluid データセットを使用するアプリケーション Pod は、FUSE ファイルシステムを使用して分散キャッシュシステム内のデータにアクセスします。各 FUSE ファイルシステムは FUSE デーモンプロセスに対応しており、FUSE ファイルシステムに送信されたファイルアクセスリクエストを処理します。
アプリケーション Pod のライフサイクル中に、FUSE デーモンが予期せずクラッシュすることがあります。たとえば、メモリ使用量が上限を超えると、デーモンは強制終了されます。その結果、アプリケーション Pod が FUSE ファイルシステム内のファイルにアクセスすると、「Transport Endpoint is Not Connected」というエラーが表示されます。この問題を解決するには、アプリケーション Pod を手動で再起動または再構築して、FUSE ファイルシステムへのアクセスを復元する必要があります。
Fluid は、FUSE ファイルシステムのマウントポイントの自動回復機能を提供します。ノード上の各アプリケーション Pod にマウントされた FUSE ファイルシステムのステータスを定期的にクエリすることで、Fluid はアプリケーション Pod を再起動または再構築することなく、データアクセスを復元できます。
制限事項
自動回復プロセスには遅延があり、ビジネスアプリケーションのシームレスな自動回復はサポートされていません。ビジネスアプリケーションは、データアクセス障害を許容し、データアクセスが復元されるまでリトライを続ける必要があります。
自動回復は読み取り専用データセットに対してのみ有効にできます。クラスターに読み書き可能なデータセットが含まれている場合は、データセットへの予期しないデータ書き込みを防ぐために、この機能が無効になっていることを確認してください。
この機能では、アプリケーション Pod を subPath モードでデータセットの永続ボリューム要求 (PVC) にマウントすることはできません。
FUSE の自動回復機能は、FUSE デーモンが自動的に再起動された後に有効にする必要があります。FUSE デーモンはコンテナー内で実行されます。FUSE デーモンが頻繁にクラッシュすると、Kubernetes がコンテナーを再起動する間隔が指数関数的に増加します。これにより、FUSE の自動回復にかかる時間が長くなります。
ACK クラスターで FUSE マウントポイントの自動回復を有効にする
ステップ 1: FUSE マウントポイントの自動回復を有効にする
次のコマンドを実行して、FUSE マウントポイントの自動回復を有効にします。
kubectl get ds -n fluid-system csi-nodeplugin-fluid -oyaml | sed 's/FuseRecovery=false/FuseRecovery=true/g' | kubectl apply -f -予想される出力:
daemonset.apps/csi-nodeplugin-fluid configured次のコマンドを実行して、FUSE マウントポイントの自動回復が有効になっているかどうかを確認します。
kubectl get ds -n fluid-system csi-nodeplugin-fluid -oyaml | grep '\- \-\-feature-gates='次の出力が返された場合、FUSE マウントポイントの自動回復が有効になっています。
- --feature-gates=FuseRecovery=trueステップ 2: Fluid データセットを作成する
この例では、JindoFS をデプロイして OSS へのアクセスを高速化します。
secret.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: v1 kind: Secret metadata: name: mysecret stringData: fs.oss.accessKeyId: <YOUR_ACCESS_KEY_ID> fs.oss.accessKeySecret: <YOUR_ACCESS_KEY_SECRET>fs.oss.accessKeyIdとfs.oss.accessKeySecretは、OSS へのアクセスに使用されるAccessKey IDとAccessKey Secretを指定します。次のコマンドを実行して Secret を作成します。
kubectl create -f secret.yamldataset.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: demo-dataset spec: mounts: - mountPoint: oss://<oss_bucket>/<bucket_dir> options: fs.oss.endpoint: <oss_endpoint> name: mybucket 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: demo-dataset spec: replicas: 2 tieredstore: levels: - mediumtype: MEM path: /dev/shm volumeType: emptyDir quota: 2Gi high: "0.99" low: "0.95"次の表にパラメーターを示します。
パラメーター
説明
mountPoint
oss://<oss_bucket>/<bucket_dir> は、マウントされる UFS へのパスを指定します。パスにエンドポイントは必要ありません。
fs.oss.endpoint
OSS バケットのパブリックまたはプライベートエンドポイント。詳細については、「リージョンとエンドポイント」をご参照ください。
replicas
JindoFS クラスター内のワーカー数。
mediumtype
キャッシュのタイプ。JindoRuntime テンプレートを作成する場合、JindoFS は HDD、SSD、MEM のいずれかのキャッシュタイプのみをサポートします。
path
ストレージパス。パスは 1 つだけ指定できます。mediumtype を MEM に設定した場合は、ログなどのデータを保存するためにオンプレミスストレージのパスを指定する必要があります。
quota
キャッシュデータの最大サイズ。単位: GB。
high
ストレージ容量の上限。
low
ストレージ容量の下限。
次のコマンドを実行して、Dataset オブジェクトと JindoRuntime オブジェクトを作成します。
kubectl create -f dataset.yaml
ステップ 3: アプリケーション Pod を作成し、Fluid データセットをマウントする
この例では、Fluid データセットを NGINX Pod にマウントし、その Pod を使用してデータセット内のデータにアクセスします。
app.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: v1 kind: Pod metadata: name: demo-app labels: fuse.serverful.fluid.io/inject: "true" spec: containers: - name: demo image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 volumeMounts: - mountPath: /data name: data-vol volumes: - name: data-vol persistentVolumeClaim: claimName: demo-dataset # このパラメーターの値は、Dataset の名前と同じである必要があります。fuse.serverful.fluid.io/inject=trueラベルは、Pod の FUSE マウントポイントの自動回復を有効にするために使用されます。次のコマンドを実行して、アプリケーションコンテナーを作成します。
kubectl create -f app.yaml次のコマンドを実行して、アプリケーションコンテナーのステータスを表示します。
kubectl get pod demo-appコンテナーの STATUS フィールドが Running の場合、アプリケーションコンテナーは正常に起動しています。
NAME READY STATUS RESTARTS AGE demo-app 1/1 Running 0 16s
ステップ 4: FUSE マウントポイントの自動回復機能を確認する
次のコマンドを実行してアプリケーションコンテナーにログインし、ファイルメタデータを定期的にアクセスするスクリプトを実行します。このスクリプトは、マウントされた Fluid データセット内のファイルを 1 秒ごとにリスト表示します。
kubectl exec -it demo-app -- bash -c 'while true; do ls -l /data; sleep 1; done'前のスクリプトをバックグラウンドで実行し続け、次のコマンドを実行して FUSE コンポーネントのクラッシュをシミュレートします。
# demo-pod が存在するノードを取得します。 demo_pod_node_name=$(kubectl get pod demo-app -ojsonpath='{.spec.nodeName}') # demo-pod と同じノード上の FUSE pod の名前を取得します。 fuse_pod_name=$(kubectl get pod --field-selector spec.nodeName=$demo_pod_node_name --selector role=jindofs-fuse,release=demo-dataset -oname) # FUSE pod のクラッシュをシミュレートします。 kubectl exec -it $fuse_pod_name -- bash -c 'kill 1'demo-app で実行されているスクリプトの出力を表示します。次の出力が返された場合、FUSE マウントポイントは正常に回復しています。
... total 172 -rwxrwxr-x 1 root root 18 Jul 1 15:17 myfile -rwxrwxr-x 1 root root 154 Jul 1 17:06 myfile.txt total 172 -rwxrwxr-x 1 root root 18 Jul 1 15:17 myfile -rwxrwxr-x 1 root root 154 Jul 1 17:06 myfile.txt ls: cannot access '/data/': Transport endpoint is not connected ls: cannot access '/data/': Transport endpoint is not connected ls: cannot access '/data/': Transport endpoint is not connected ls: cannot access '/data/': Transport endpoint is not connected ls: cannot access '/data/': Transport endpoint is not connected ls: cannot access '/data/': Transport endpoint is not connected ls: cannot access '/data/': Transport endpoint is not connected ls: cannot access '/data/': Transport endpoint is not connected total 172 -rwxrwxr-x 1 root root 18 Jul 1 15:17 myfile -rwxrwxr-x 1 root root 154 Jul 1 17:06 myfile.txt total 172 -rwxrwxr-x 1 root root 18 Jul 1 15:17 myfile -rwxrwxr-x 1 root root 154 Jul 1 17:06 myfile.txt ...
サーバーレス環境で FUSE マウントポイントの自動回復を有効にする
ContainerOS 以外のオペレーティングシステムを使用する ACK Serverless Pro クラスター を作成済みで、クラスターのバージョンが 1.18 以降であること。詳細については、「Serverless Kubernetes クラスターの作成」をご参照ください。
ステップ 1: Fluid データセットを作成する
この例では、JindoFS をデプロイして OSS へのアクセスを高速化します。
secret.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: v1 kind: Secret metadata: name: mysecret stringData: fs.oss.accessKeyId: <YOUR_ACCESS_KEY_ID> fs.oss.accessKeySecret: <YOUR_ACCESS_KEY_SECRET>fs.oss.accessKeyIdとfs.oss.accessKeySecretは、OSS へのアクセスに使用されるAccessKey IDとAccessKey Secretを指定します。次のコマンドを実行して Secret を作成します。kubectl create -f secret.yaml
kubectl create -f secret.yamldataset.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: demo-dataset spec: mounts: - mountPoint: oss://<oss_bucket>/<bucket_dir> options: fs.oss.endpoint: <oss_endpoint> name: mybucket 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: demo-dataset spec: replicas: 2 tieredstore: levels: - mediumtype: MEM path: /dev/shm volumeType: emptyDir quota: 2Gi high: "0.99" low: "0.95"次の表にパラメーターを示します。
パラメーター
説明
mountPoint
oss://<oss_bucket>/<bucket_dir> は、マウントされる UFS へのパスを指定します。パスにエンドポイントは必要ありません。
fs.oss.endpoint
OSS バケットのパブリックまたはプライベートエンドポイント。詳細については、「リージョンとエンドポイント」をご参照ください。
replicas
JindoFS クラスター内のワーカー数。
mediumtype
キャッシュのタイプ。JindoRuntime テンプレートを作成する場合、JindoFS は HDD、SSD、MEM のいずれかのキャッシュタイプのみをサポートします。
path
ストレージパス。パスは 1 つだけ指定できます。mediumtype を MEM に設定した場合は、ログなどのデータを保存するためにオンプレミスストレージのパスを指定する必要があります。
quota
キャッシュデータの最大サイズ。単位: GB。
high
ストレージ容量の上限。
low
ストレージ容量の下限。
次のコマンドを実行して、Dataset オブジェクトと JindoRuntime オブジェクトを作成します。
kubectl create -f dataset.yaml
ステップ 2: アプリケーション Pod を作成し、Fluid データセットをマウントする
この例では、Fluid データセットを NGINX Pod にマウントし、その Pod を使用してデータセット内のデータにアクセスします。
app.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: v1 kind: Pod metadata: name: demo-app labels: alibabacloud.com/fluid-sidecar-target: eci annotations: # 仮想ノードベースの Pod スケジューリングポリシーを無効にします。 alibabacloud.com/burst-resource: eci_only # FUSE マウントポイントの自動回復を有効にします alibabacloud.com/fuse-recover-policy: auto spec: containers: - name: demo image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 volumeMounts: - mountPath: /data name: data-vol volumes: - name: data-vol persistentVolumeClaim: claimName: demo-dataset # このパラメーターの値は、Dataset の名前と同じである必要があります。alibabacloud.com/fuse-recover-policy=autoアノテーションは、Pod の FUSE マウントポイントの自動回復を有効にするために使用されます。このアノテーションは、サーバーレス環境で実行されるアプリケーション Pod でのみ有効です。次のコマンドを実行して、アプリケーション Pod を作成します。
kubectl create -f app.yaml次のコマンドを実行して、アプリケーションコンテナーのステータスを表示します。
kubectl get pod demo-appコンテナーの STATUS フィールドが Running の場合、アプリケーションコンテナーは正常に起動しています。
NAME READY STATUS RESTARTS AGE demo-app 2/2 Running 0 110s
ステップ 3: FUSE マウントポイントの自動回復機能を確認する
次のコマンドを実行してアプリケーションコンテナーにログインし、ファイルメタデータを定期的にアクセスするスクリプトを実行します。このスクリプトは、マウントされた Fluid データセット内のファイルを 1 秒ごとにリスト表示します。
kubectl exec -it demo-app -c demo -- bash -c 'while true; do ls -l /data; sleep 1; done'前のスクリプトをバックグラウンドで実行し続け、次のコマンドを実行して FUSE コンポーネントのクラッシュをシミュレートします。
# FUSE pod のクラッシュをシミュレートします。 kubectl exec -it demo-app -c fluid-fuse-0 -- bash -c 'kill 1'demo-app で実行されているスクリプトの出力を表示します。次の出力が返された場合、FUSE マウントポイントは正常に回復しています。
total 172 -rwxrwxr-x 1 root root 18 Jul 1 15:17 myfile -rwxrwxr-x 1 root root 154 Jul 1 17:06 myfile.txt total 172 -rwxrwxr-x 1 root root 18 Jul 1 15:17 myfile -rwxrwxr-x 1 root root 154 Jul 1 17:06 myfile.txt ls: cannot access '/data/demo2': Transport endpoint is not connected ls: cannot access '/data/demo2': Transport endpoint is not connected ls: cannot access '/data/demo2': Transport endpoint is not connected ls: cannot access '/data/demo2': Transport endpoint is not connected total 172 -rwxrwxr-x 1 root root 18 Jul 1 15:17 myfile -rwxrwxr-x 1 root root 154 Jul 1 17:06 myfile.txt total 172 -rwxrwxr-x 1 root root 18 Jul 1 15:17 myfile -rwxrwxr-x 1 root root 154 Jul 1 17:06 myfile.txt