不揮発性メモリ(NVM)ボリュームは、Intel が提供するパーシステントメモリ(PMEM)製品に基づいてプロビジョニングできます。 NVM を使用すると、より低いコストでメモリ容量を拡張し、より低いレイテンシで永続データにアクセスできます。 NVM は、メモリ製品とストレージ製品の利点を提供します。 このトピックでは、Container Service for Kubernetes(ACK)クラスタで NVM ボリュームを使用する方法について説明し、例を示します。
背景情報
PMEM は、データの永続性をサポートする高性能メモリを提供します。 PMEM はメモリバス上にあり、ダイナミックランダムアクセスメモリ(DRAM)を使用する場合と同じ方法でデータにアクセスできます。 PMEM は、DRAM とほぼ同じ速度とレイテンシ、および NAND フラッシュの不揮発性を提供します。 PMEM には次の利点があります。
データアクセス時のレイテンシがフラッシュ SSD よりも低い。
フラッシュストレージよりも高いスループット。
DRAM よりも低いコスト。
データキャッシング。 これにより、Peripheral Component Interconnect Express(PCIe)を介して送信されるデータが CPU でキャッシュできないという問題が解決されます。
データへのリアルタイムアクセスと、大規模なデータセットへの超高速アクセス。
マシンが電源オフになった後も、データはメモリに保持されます。 これにより、フラッシュメモリと同じ利点が得られます。
NVM ボリュームの使用方法
Alibaba Cloud が提供する Container Storage Interface(CSI)ドライバを使用して、ACK クラスタ内の NVM デバイスのライフサイクルを管理できます。 これにより、宣言的な要求を使用して NVM リソースを割り当て、マウント、および使用できます。
次のいずれかの方法を使用して、ACK クラスタで NVM ボリュームを使用できます。
PMEP-LVM(NVM を非侵入型ブロックストレージとして使用する)
NVM リソースは、ブロックストレージまたはファイルシステムとして使用できます。 アプリケーションを変更することなく、NVM リソースを直接要求できます。 論理ボリュームマネージャ(LVM)を使用して、ノード上の PMEM リソースをボリュームグループ(VG)に仮想化できます。 その後、必要なタイプと容量の永続ボリューム要求(PVC)を作成できます。
この方法は、サーバーレス アプリケーション、低レイテンシおよび高スループットのデータコンピューティング アプリケーション、および高速一時ストレージを必要とする短い CI/CD 期間のアプリケーションに適しています。 これにより、I/O スループットを 2 ~ 10 倍向上させることができます。 詳細な例については、「AEP 不揮発性メモリを使用して読み取りおよび書き込みパフォーマンスを向上させる」をご参照ください。
PMEM-ダイレクトメモリ
NVM リソースは、ダイレクトメモリとして使用できます。 PMEM SDK に基づいてメモリ割り当て関数に特定の数の変更を加えることで、PMEM をダイレクトメモリとして使用できます。 これにより、メモリのようなスループットとレイテンシを提供するダイレクトメモリとして NVM リソースをプロビジョニングできます。
この方法は、大容量メモリと費用対効果の点で、Redis や SAP HANA などのインメモリデータベースに適しています。 この方法により、メモリコストが 30% ~ 50% 削減されます。 詳細な例については、「NVM ボリュームをダイレクトメモリとしてマウントした Redis インスタンスをデプロイする」をご参照ください。
次の表に、NVM ボリュームを使用するさまざまな方法の比較の詳細を示します。
方法 | 断片化ストレージのサポート | オンライン拡張のサポート | メモリ永続性のサポート | アプリケーション変更のサポート | レイテンシ (4K/RW) | スループット (4K/RW) | 単一 ECS インスタンスの最大容量 (ecs.ebmre6p.26xlarge) |
PMEM-LVM | いいえ | はい | はい | いいえ | 10 μs | 10W | 1536 GB |
PMEM-Direct | はい | いいえ | いいえ | はい | 1.2 μs | 56W | 768 GB |
SSD | いいえ | はい | はい | いいえ | 100 μs | 1W | 32 TB |
CSI コンポーネントのデプロイ
CSI コンポーネントの概要
ACK クラスタで NVM を使用するには、次のコンポーネントをデプロイする必要があります。
CSI-Plugin:PMEM デバイスを初期化し、ボリュームの作成、削除、マウント、およびマウント解除を行います。
CSI-Provisioner:ボリュームの作成および削除リクエストを検出し、開始します。
CSI-Scheduler:ストレージをスケジュールします(ACK スケジューラはプリインストールされたコンポーネントです)。
CSI コンポーネントのデプロイ
PMEM リソースを搭載した Elastic Compute Service(ECS)インスタンスを ACK クラスタに追加します。 たとえば、ecs.ebmre6p.26xlarge の ECS インスタンスを追加できます。 re6p 永続メモリ最適化インスタンスファミリーとebmre6p 永続メモリ最適化 ECS ベアメタルインスタンスファミリーは、第 1 世代の PMEM をサポートしています。
CSI プラグインを使用して PMEM リソースをマウントできるようにするには、PMEM リソースを搭載した ECS インスタンスに次のラベルを追加します。
pmem.csi.alibabacloud.com:NVM デバイスの自動 O&M を有効にします。pmem.csi.alibabacloud.com/type: lvm:PMEM-LVM メソッドのサポートを有効にします。pmem.csi.alibabacloud.com/type: direct:PMEM-ダイレクトメモリメソッドのサポートを有効にします。
PMEM 用の CSI プラグインをデプロイします。
CSI-Plugin をデプロイします。
CSI-Provisioner をデプロイします。
StorageClass を作成します。
例
AEP をブロックストレージボリュームとして使用する
次の YAML テンプレートを使用して PVC を作成します。
PVC を特定の NVM ノードにスケジュールするには、
annotations: volume.kubernetes.io/selected-nodeアノテーションを追加します。apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: volume.kubernetes.io/selected-node: cn-zhangjiakou.192.168.XX.XX name: pmem-lvm spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: pmem-lvm次の YAML テンプレートを使用してワークロードをデプロイします。
apiVersion: apps/v1 kind: StatefulSet metadata: name: sts-lvm labels: app: busybox-lvm spec: selector: matchLabels: app: busybox-lvm serviceName: "busybox" template: metadata: labels: app: busybox-lvm spec: containers: - name: busybox image: busybox command: ["sh", "-c"] args: ["sleep 10000"] volumeMounts: - name: pmem-pvc mountPath: "/data" volumes: - name: pmem-pvc persistentVolumeClaim: claimName: pmem-lvm結果を表示します。
次のコマンドを実行して、作成された PVC をクエリします。
kubectl get pvc予期される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pmem-lvm Bound disk-**** 10Gi RWO pmem-lvm 10m次のコマンドを実行して、作成されたポッドをクエリします。
kubectl get pod予期される出力:
NAME READY STATUS RESTARTS AGE sts-lvm-0 1/1 Running 0 10m
次のコマンドを実行してアプリケーションにログインし、ボリュームのマウントパスを確認します。
kubectl exec -ti sts-lvm-0 -- df /data次の出力は、ブロックストレージボリュームが作成され、アプリケーションポッドにマウントされていることを示しています。
Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/pmemvgregion0-disk--**** 10255636 36888 10202364 1% /data
NVM をダイレクトメモリボリュームとして使用する
次の YAML テンプレートを使用して PVC を作成します。
PVC を特定の NVM ノードにスケジュールするには、
annotations: volume.kubernetes.io/selected-nodeアノテーションを追加します。apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: volume.kubernetes.io/selected-node: cn-zhangjiakou.192.168.XX.XX name: pmem-direct spec: accessModes: - ReadWriteOnce resources: requests: storage: 9Gi storageClassName: pmem-direct次のテンプレートを使用してワークロードをデプロイします。
apiVersion: apps/v1 kind: StatefulSet metadata: name: sts-direct labels: app: busybox-direct spec: selector: matchLabels: app: busybox-direct serviceName: "busybox" template: metadata: labels: app: busybox-direct spec: containers: - name: busybox image: busybox command: ["sh", "-c"] args: ["sleep 1000"] volumeMounts: - name: pmem-pvc mountPath: "/data" volumes: - name: pmem-pvc persistentVolumeClaim: claimName: pmem-direct結果を表示します。
次のコマンドを実行して、作成された PVC をクエリします。
kubectl get pvc pmem-direct予期される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pmem-direct Bound disk-**** 9Gi RWO pmem-direct 17m次のコマンドを実行して、作成されたポッドをクエリします。
kubectl get pod予期される出力:
NAME READY STATUS RESTARTS AGE sts-direct-0 1/1 Running 0 17m
次のコマンドを実行してアプリケーションにログインし、ボリュームのマウントパスを確認します。
kubectl exec -ti sts-direct-0 -- df /data次の出力は、ブロックストレージボリュームが作成され、アプリケーションポッドにマウントされていることを示しています。
Filesystem 1K-blocks Used Available Use% Mounted on /dev/pmem0 9076344 36888 9023072 1% /data