Container Network File System (CNFS) クライアントを使用すると、複数の接続を介してデータにアクセスし、メタデータとデータを分散方式でキャッシュして、読み取り速度を向上させることができます。 CNFS クライアントは、パフォーマンスの監視とサービス品質 (QoS) もサポートしています。 このトピックでは、CNFS クライアントの分散キャッシュ機能を有効にする方法と、CNFS クライアントの分散キャッシュ機能を使用して読み取り速度を向上させる方法について説明します。
前提条件
カーネルバージョンが 4.19.91-23 から 4.19.91-26 の Alibaba Cloud Linux 2 が使用されています。 分散キャッシュ機能は、Alibaba Cloud Linux 2 をサポートしています。
Kubernetes 1.20 以降を実行する Container Service for Kubernetes (ACK) クラスタが作成されます。 Container Storage Interface (CSI) プラグインは、ボリュームプラグインとして使用されます。 詳細については、「ACK マネージドクラスターを作成する」をご参照ください。
csi-plugin と csi-provisioner のバージョンは、v1.22.11-abbb810e-aliyun 以降です。 csi-plugin と csi-provisioner を更新する方法の詳細については、「CSI プラグインをインストールおよび更新する」をご参照ください。
storage-operator のバージョンは、v1.22.86-041b094-aliyun 以降です。 storage-operator を更新する方法の詳細については、「コンポーネントを管理する」をご参照ください。
kubectl クライアントがクラスターに接続されています。 詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
分散キャッシュ機能の主要なパフォーマンス指標
指標 | ベンチマークシナリオ① | 分散キャッシュ無効 | 分散キャッシュ有効 |
メタデータの読み取りおよび書き込みパフォーマンス | 100 万個のディレクトリをトラバースする時間 | 18 分 | < 60 秒 |
サイズ 4 KB のファイルを作成する時間 | 3,000 マイクロ秒 | < 200 マイクロ秒 | |
サイズ 4 KB のファイルを 2 回目に読み取る時間 | 400 マイクロ秒 | < 100 マイクロ秒 | |
読み取りおよび書き込みスループット | シングルノードの読み取りおよび書き込みスループット② | 200 ~ 500 MB/秒 | > 800 MB/秒 |
包括的なシナリオでの全体的なパフォーマンス | それぞれ 150 KB のサイズの 5,000 個の画像を抽出する時間 | 52 秒 | 約 15 秒 |
Redis プロジェクトを作成する時間 | 27 秒 | 約 21 秒 |
上記の表に示されている値は理論値 (参照値) のみです。 実際の値は、動作環境によって異なります。
注 ①: ベンチマークテストの実行に使用される Elastic Compute Service (ECS) インスタンスタイプは ecs.hfg6.4xlarge です。 ベンチマークデータは、環境によって異なる場合があります。
注 ②: ECS インスタンスの帯域幅と File Storage NAS (NAS) ファイルシステムのタイプは、ノードの読み取りおよび書き込みスループットに影響します。
手順 1: 分散キャッシュが有効になっている NAS ファイルシステムをマウントする
次のコマンドを実行して、クラスターに csi-plugin の ConfigMap を作成およびデプロイし、CNFS クライアントをインストールします。
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ConfigMap metadata: name: csi-plugin namespace: kube-system data: cnfs-client-properties: | nas-efc=true // 分散キャッシュを有効にする nas-efc-cache: | enable=true container-number=3 // DaemonSet がキャッシュ機能用に作成するコンテナーの数 volume-type=memory // Pod の emptyDir ボリュームが使用するメディア volume-size=15Gi // キャッシュするボリュームのサイズ node-selector: | cache=true // 分散キャッシュ機能の DaemonSet によって作成された Pod がスケジュールされるノードのラベル EOFパラメーター
説明
cnfs-client-properties
分散キャッシュを有効にするかどうかを指定します。
nas-efc=trueを指定すると、分散キャッシュ機能が有効になり、読み取り速度が向上します。nfs-efc-cache.
container-number
分散キャッシュを有効にする場合は、このパラメーターが必要です。
このパラメーターは、DaemonSet がキャッシュ機能用に作成するコンテナーの数を指定します。 キャッシュ機能がパフォーマンスのボトルネックに達した場合は、このパラメーターの値を増やすことができます。
nfs-efc-cache.
volume-type
分散キャッシュを有効にする場合は、このパラメーターが必要です。
DaemonSet によって作成された Pod の emptyDir ボリュームによって使用されるメディア。 有効な値:
diskmemory
nfs-efc-cache.
volume-size
分散キャッシュを有効にする場合は、このパラメーターが必要です。 キャッシュするボリュームのサイズ。 単位: GiB。
node-selector
分散キャッシュ機能の DaemonSet によって作成された Pod は、ラベルに基づいてスケジュールされます。 このパラメーターを指定しない場合、DaemonSet はクラスター内の各ノードにスケジュールされます。
重要メディアをディスクまたはメモリに設定した後、ノードのデータディスクまたはメモリリソースが使用されます。 これがワークロードに悪影響を与えないことを確認してください。
この例では、分散キャッシュ機能の DaemonSet は、それぞれが 5 GiB のサイズの tmpfs ボリュームにマウントされている 3 つのコンテナーを作成します。 コンテナーは、
cache=trueラベルが付いているノードにのみスケジュールできます。
ConfigMap が構成されると、システムは ConfigMap に基づいて DaemonSet と Service を自動的にデプロイします。
次のコマンドを実行して、CSI-Plugin を再起動し、依存関係をインストールします。
kubectl get pod -nkube-system -owide | grep csi-plugin | awk '{print $1}' | xargs kubectl -nkube-system delete pod次のコマンドを実行して、CNFS クライアントの分散キャッシュ機能を有効にします。
CNFS によって管理される NAS ファイルシステムを作成します。 StatefulSet は、CNFS によって高速化された NAS ボリュームを動的にプロビジョニングされたボリュームとしてマウントします。 この例では、busybox イメージが使用されています。 Pod が起動されると、システムは
ddコマンドを実行して、サイズ 1 GB のファイルを/dataパスに書き込みます。 このファイルは、分散キャッシュ機能が有効になっているかどうかを確認するために使用されます。次のコマンドを実行して、分散キャッシュが有効になっている NAS ボリュームがマウントされているかどうかを確認します。
kubectl exec cnfs-nas-sts-0 -- mount | grep /data予期される出力:
xxx.cn-xxx.nas.aliyuncs.com:/nas-6b9d1397-6542-4410-816b-4dfd0633****:2fMaQdxU on /data type alifuse.aliyun-alinas-eac (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other)出力にマウントポイントが表示されます。 これは、分散キャッシュが有効になっている NAS ボリュームがマウントされていることを示します。
次のコマンドを実行して、分散キャッシュ機能の DaemonSet が起動されているかどうかを確認します。
kubectl get ds/cnfs-cache-ds -n kube-system -owide予期される出力:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR cnfs-cache-ds 3 3 3 3 3 <none> 19d alinas-dadi-container registry-vpc.cn-shenzhen.aliyuncs.com/acs/nas-cache:20220420 app=cnfs-cache-dsこの例では、クラスターには 3 つのノードが含まれています。 DaemonSet によって作成された 3 つの Pod は準備完了です。 これは、分散キャッシュ機能の DaemonSet が起動されていることを示します。
次のコマンドを実行して、分散キャッシュ Service がバックエンド Pod を検出できるかどうかを確認します。
kubectl get ep cnfs-cache-ds-service -n kube-system -owide予期される出力:
NAME ENDPOINTS AGE cnfs-cache-ds-service 10.19.1.130:6500,10.19.1.40:6500,10.19.1.66:6500 19d出力は、Service がバックエンド Pod を検出したことを示しています。 Pod のエンドポイントは 10.19.1.130、10.19.1.40、および 10.19.1.66 です。 ポートは 6500 です。
手順 2: キャッシュ機能を確認する
次のコマンドを実行して、tmpfile を
/dataディレクトリから/ディレクトリにコピーし、消費された時間を確認します。 ファイルのサイズは 1 GB です。kubectl exec cnfs-nas-sts-0 -- time cp /data/1G.tmpfile /予期される出力:
real 0m 5.66s user 0m 0.00s sys 0m 0.75s出力は、分散キャッシュ機能が無効になっている場合、ファイルのコピーに必要な時間が約 5 秒であることを示しています。
次のコマンドを複数回実行して、ファイルのコピーに必要な時間を確認します。
kubectl exec cnfs-nas-sts-0 -- time cp /data/1G.tmpfile /予期される出力:
real 0m 0.79s user 0m 0.00s sys 0m 0.58s出力は、ファイルに複数回アクセスした場合、ファイルのコピーに必要な時間が 6 ~ 7 倍短縮されることを示しています。