すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:NVM ボリュームの概要

最終更新日:Apr 16, 2025

不揮発性メモリ(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 コンポーネントのデプロイ

  1. PMEM リソースを搭載した Elastic Compute Service(ECS)インスタンスを ACK クラスタに追加します。 たとえば、ecs.ebmre6p.26xlarge の ECS インスタンスを追加できます。 re6p 永続メモリ最適化インスタンスファミリーebmre6p 永続メモリ最適化 ECS ベアメタルインスタンスファミリーは、第 1 世代の PMEM をサポートしています。

  2. 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-ダイレクトメモリメソッドのサポートを有効にします。

  3. PMEM 用の CSI プラグインをデプロイします。

    1. CSI-Plugin をデプロイします。

      展開して CSI-Plugin YAML ファイルのデプロイを表示する

      apiVersion: storage.k8s.io/v1
      kind: CSIDriver
      metadata:
        name: localplugin.csi.alibabacloud.com
      spec:
        attachRequired: false
        podInfoOnMount: true
      ---
      kind: DaemonSet
      apiVersion: apps/v1
      metadata:
        name: csi-local-plugin
        namespace: kube-system
      spec:
        selector:
          matchLabels:
            app: csi-local-plugin
        template:
          metadata:
            labels:
              app: csi-local-plugin
          spec:
            tolerations:
              - operator: Exists
            serviceAccount: admin
            priorityClassName: system-node-critical
            hostNetwork: true
            hostPID: true
            containers:
              - name: driver-registrar
                image: registry.cn-hangzhou.aliyuncs.com/acs/csi-node-driver-registrar:v1.3.0-6e9fff3-aliyun
                imagePullPolicy: Always
                args:
                  - "--v=5"
                  - "--csi-address=/csi/csi.sock"
                  - "--kubelet-registration-path=/var/lib/kubelet/csi-plugins/localplugin.csi.alibabacloud.com/csi.sock"
                env:
                  - name: KUBE_NODE_NAME
                    valueFrom:
                      fieldRef:
                        apiVersion: v1
                        fieldPath: spec.nodeName
                volumeMounts:
                  - name: plugin-dir
                    mountPath: /csi
                  - name: registration-dir
                    mountPath: /registration
      
              - name: csi-localplugin  // CSI ローカルプラグイン
                securityContext:
                  privileged: true
                  capabilities:
                    add: ["SYS_ADMIN"]
                  allowPrivilegeEscalation: true
                image: registry.cn-hangzhou.aliyuncs.com/acs/csi-plugin:v1.20.6-2be29b1-aliyun 
                imagePullPolicy: "Always"
                args :
                  - "--endpoint=$(CSI_ENDPOINT)"
                  - "--v=5"
                  - "--nodeid=$(KUBE_NODE_NAME)"
                  - "--driver=localplugin.csi.alibabacloud.com"
                env:
                  - name: KUBE_NODE_NAME
                    valueFrom:
                      fieldRef:
                        apiVersion: v1
                        fieldPath: spec.nodeName
                  - name: CSI_ENDPOINT
                    value: unix://var/lib/kubelet/csi-plugins/localplugin.csi.alibabacloud.com/csi.sock
                volumeMounts:
                  - name: pods-mount-dir
                    mountPath: /var/lib/kubelet
                    mountPropagation: "Bidirectional"
                  - mountPath: /dev
                    mountPropagation: "HostToContainer"
                    name: host-dev
                  - mountPath: /var/log/
                    name: host-log
            volumes:
              - name: plugin-dir
                hostPath:
                  path: /var/lib/kubelet/csi-plugins/localplugin.csi.alibabacloud.com
                  type: DirectoryOrCreate
              - name: registration-dir
                hostPath:
                  path: /var/lib/kubelet/plugins_registry
                  type: DirectoryOrCreate
              - name: pods-mount-dir
                hostPath:
                  path: /var/lib/kubelet
                  type: Directory
              - name: host-dev
                hostPath:
                  path: /dev
              - name: host-log
                hostPath:
                  path: /var/log/
        updateStrategy:
          rollingUpdate:
            maxUnavailable: 10%
          type: RollingUpdate
      	  
    2. CSI-Provisioner をデプロイします。

      展開して CSI-Provisioner YAML ファイルのデプロイを表示する

      kind: Deployment
      apiVersion: apps/v1
      metadata:
        name: csi-local-provisioner
        namespace: kube-system
      spec:
        selector:
          matchLabels:
            app: csi-local-provisioner
        replicas: 2
        template:
          metadata:
            labels:
              app: csi-local-provisioner
          spec:
            tolerations:
            - operator: "Exists"
            affinity:
              nodeAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                - weight: 1
                  preference:
                    matchExpressions:
                    - key: node-role.kubernetes.io/master
                      operator: Exists
            priorityClassName: system-node-critical
            serviceAccount: admin
            hostNetwork: true
            containers:
              - name: external-local-provisioner // 外部ローカルプロビジョナー
                image: registry.cn-hangzhou.aliyuncs.com/acs/csi-provisioner:v1.6.0-b6f763a43-ack
                args:
                  - "--csi-address=$(ADDRESS)"
                  - "--feature-gates=Topology=True"
                  - "--volume-name-prefix=disk"  // ボリューム名プレフィックス
                  - "--strict-topology=true"
                  - "--timeout=150s"  // タイムアウト
                  - "--extra-create-metadata=true"
                  - "--enable-leader-election=true"  // リーダー選出を有効にする
                  - "--leader-election-type=leases"
                  - "--retry-interval-start=500ms" // 再試行間隔の開始
                  - "--v=5"
                env:
                  - name: ADDRESS
                    value: /socketDir/csi.sock
                imagePullPolicy: "Always"
                volumeMounts:
                  - name: socket-dir
                    mountPath: /socketDir
              - name: external-local-resizer  // 外部ローカルリサイザー
                image: registry.cn-hangzhou.aliyuncs.com/acs/csi-resizer:v0.3.0
                args:
                  - "--v=5"
                  - "--csi-address=$(ADDRESS)"
                  - "--leader-election"  // リーダー選出
                env:
                  - name: ADDRESS
                    value: /socketDir/csi.sock
                imagePullPolicy: "Always"
                volumeMounts:
                  - name: socket-dir
                    mountPath: /socketDir/
            volumes:
              - name: socket-dir
                hostPath:
                  path: /var/lib/kubelet/csi-plugins/localplugin.csi.alibabacloud.com
                  type: DirectoryOrCreate
      	  
    3. StorageClass を作成します。

      展開して StorageClass YAML ファイルのデプロイを表示する

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
          name: csi-pmem-direct
      provisioner: localplugin.csi.alibabacloud.com
      mountOptions:
      - dax
      parameters:
          volumeType: PMEM
          pmemType: "direct"  // PMEM タイプ
      reclaimPolicy: Delete
      volumeBindingMode: WaitForFirstConsumer
      allowVolumeExpansion: true  // ボリューム拡張を許可
      
      ---
      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
          name: pmem-lvm
      provisioner: localplugin.csi.alibabacloud.com
      mountOptions:
      - dax
      parameters:
          volumeType: PMEM
          nodeAffinity: "true"  // ノードアフィニティ
          pmemType: "lvm"  // PMEM タイプ
      reclaimPolicy: Delete
      volumeBindingMode: WaitForFirstConsumer
      allowVolumeExpansion: true  // ボリューム拡張を許可
      	  	  
      	  

AEP をブロックストレージボリュームとして使用する

  1. 次の 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
  2. 次の 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
  3. 結果を表示します。

    • 次のコマンドを実行して、作成された 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
  4. 次のコマンドを実行してアプリケーションにログインし、ボリュームのマウントパスを確認します。

    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 をダイレクトメモリボリュームとして使用する

  1. 次の 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
  2. 次のテンプレートを使用してワークロードをデプロイします。

    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
  3. 結果を表示します。

    • 次のコマンドを実行して、作成された 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
  4. 次のコマンドを実行してアプリケーションにログインし、ボリュームのマウントパスを確認します。

    kubectl exec -ti sts-direct-0 -- df /data

    次の出力は、ブロックストレージボリュームが作成され、アプリケーションポッドにマウントされていることを示しています。

    Filesystem     1K-blocks  Used    Available  Use%  Mounted on
    /dev/pmem0     9076344    36888   9023072    1%    /data