Todos los productos
Search
Centro de documentos

:NVM volume overview

Última actualización: Sep 04, 2026

Los volúmenes de memoria no volátil (NVM) se pueden aprovisionar con base en el producto de memoria persistente (PMEM) de Intel. Puede utilizar NVM para ampliar la capacidad de memoria a menor costo y acceder a datos persistentes con menor latencia. NVM combina las ventajas de los productos de memoria y almacenamiento. Este tema describe cómo usar volúmenes NVM en clústeres de Container Service for Kubernetes (ACK) e incluye ejemplos prácticos.

Contexto

PMEM ofrece memoria de alto rendimiento compatible con la persistencia de datos. Al residir en el bus de memoria, permite acceder a los datos de la misma forma que con la memoria dinámica de acceso aleatorio (DRAM). PMEM proporciona una velocidad y latencia casi idénticas a las de DRAM, además de la no volatilidad de la memoria flash NAND. Entre sus principales ventajas se encuentran:

  • Menor latencia que las unidades SSD flash al acceder a los datos.

  • Mayor throughput que el almacenamiento flash.

  • Costos inferiores a los de DRAM.

  • Caché de datos. Esto resuelve el problema donde los datos transmitidos mediante Peripheral Component Interconnect Express (PCIe) no se pueden almacenar en caché dentro de la CPU.

  • Acceso a datos en tiempo real y acceso ultrarrápido a grandes conjuntos de datos.

  • Retención de datos en memoria tras apagar el equipo, lo cual ofrece la misma ventaja que la memoria flash.

Cómo usar volúmenes NVM

Puede gestionar el ciclo de vida de dispositivos NVM en clústeres ACK mediante el controlador Container Storage Interface (CSI) proporcionado por Alibaba Cloud. Esto le permite asignar, montar y utilizar recursos NVM a través de solicitudes declarativas.

Para usar volúmenes NVM en clústeres ACK, elija uno de los siguientes métodos:

  • PMEP-LVM (use NVM as non-intrusive block storage)

    Los recursos NVM funcionan como block storage o sistemas de archivos. Es posible solicitar recursos NVM directamente sin modificar sus aplicaciones. Mediante Logical Volume Manager (LVM), virtualice los recursos PMEM de un nodo en grupos de volúmenes (VG). Posteriormente, cree solicitudes de volumen persistente (PVC) con el tipo y la capacidad necesarios.

    Este método es adecuado para aplicaciones serverless, aplicaciones de cómputo de datos con baja latencia y alto throughput, así como aplicaciones con ciclos CI/CD cortos que requieren almacenamiento temporal de alta velocidad. Permite mejorar el throughput de E/S entre 2 y 10 veces. Para consultar más ejemplos, véase Improve read and write performance with non-volatile memory.

  • PMEM-direct memory

    Los recursos NVM también admiten su uso como memoria directa. Para ello, modifique funciones específicas de asignación de memoria según el SDK de PMEM. De esta manera, aprovisiona recursos NVM como memoria directa con latencia y throughput similares a los de la memoria convencional.

    Esta opción resulta ideal para bases de datos en memoria como Redis y SAP HANA, gracias a su gran capacidad y rentabilidad. Reduce los costos de memoria entre un 30 % y un 50 %. Para consultar más ejemplos, véase Deploy a Redis instance with an NVM volume mounted as direct memory.

La siguiente tabla detalla la comparación entre los distintos métodos de uso de volúmenes NVM.

Método

Compatibilidad con almacenamiento fragmentado

Compatibilidad con expansión en línea

Compatibilidad con persistencia de memoria

Requiere modificación de la aplicación

Latencia (4K/RW)

Throughput (4K/RW)

Capacidad máxima por instancia ECS (ecs.ebmre6p.26xlarge)

PMEM-LVM

No

Sí

Sí

No

10 us

10W

1536 GB

PMEM-Direct

Sí

No

No

Sí

1.2 us

56W

768 GB

SSD

No

Sí

Sí

No

100 us

1W

32 TB

Despliegue de componentes CSI

Introducción a los componentes CSI

Para utilizar NVM en clústeres ACK, debe desplegar los siguientes componentes:

  • CSI-Plugin: inicializa dispositivos PMEM; crea, elimina, monta y desmonta volúmenes.

  • CSI-Provisioner: detecta e inicia solicitudes de creación y eliminación de volúmenes.

  • CSI-Scheduler: programa el almacenamiento (el planificador de ACK viene preinstalado).

Desplegar componentes CSI

  1. Agregue instancias de Elastic Compute Service (ECS) equipadas con recursos PMEM a su clúster ACK. Por ejemplo, agregue instancias ECS del tipo ecs.ebmre6p.26xlarge. La re6p persistent memory-optimized instance family y la ebmre6p persistent memory-optimized ECS Bare Metal Instance family admiten la primera generación de PMEM.

  2. Para garantizar que el plugin CSI monte correctamente los recursos PMEM, agregue las siguientes etiquetas a las instancias ECS con recursos PMEM:

    • pmem.csi.alibabacloud.com: habilita la operación y mantenimiento automático de dispositivos NVM.

    • pmem.csi.alibabacloud.com/type: lvm: habilita la compatibilidad con el método PMEM-LVM.

    • pmem.csi.alibabacloud.com/type: direct: habilita la compatibilidad con el método de memoria directa PMEM.

  3. Despliegue el plugin CSI para PMEM.

    1. Despliegue CSI-Plugin.

      Expand to view the deployment of CSI-Plugin YAML file

      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
                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. Despliegue CSI-Provisioner.

      Expand to view the deployment of CSI-Provisioner YAML file

      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. Cree StorageClasses.

      Expand to view the deployment of StorageClass YAML file

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
          name: csi-pmem-direct
      provisioner: localplugin.csi.alibabacloud.com
      mountOptions:
      - dax
      parameters:
          volumeType: PMEM
          pmemType: "direct"
      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"
      reclaimPolicy: Delete
      volumeBindingMode: WaitForFirstConsumer
      allowVolumeExpansion: true
      	  	  
      	  

Ejemplos

Use AEP as block storage volumes

  1. Cree una PVC con la siguiente plantilla YAML.

    Para programar la PVC en un nodo NVM específico, agregue la anotación 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. Despliegue una carga de trabajo con la siguiente plantilla 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. Consulte los resultados.

    • Ejecute el siguiente comando para consultar la PVC creada:

      kubectl get pvc 

      Salida esperada:

      NAME               STATUS    VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS              AGE
      pmem-lvm           Bound    disk-****   10Gi       RWO            pmem-lvm                  10m
    • Ejecute el siguiente comando para consultar el pod creado:

      kubectl get pod

      Salida esperada:

      NAME                                READY   STATUS    RESTARTS   AGE
      sts-lvm-0                           1/1     Running   0          10m
  4. Ejecute el siguiente comando para iniciar sesión en la aplicación y comprobar la ruta de montaje del volumen:

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

    La siguiente salida indica que se creó un volumen de block storage y se montó en el pod de la aplicación:

    Filesystem                            1K-blocks  Used   Available Use% Mounted on
    /dev/mapper/pmemvgregion0-disk--****  10255636   36888  10202364  1%   /data

Use NVM as direct memory volumes

  1. Cree una PVC con la siguiente plantilla YAML.

    Para programar la PVC en un nodo NVM específico, agregue la anotación 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. Despliegue una carga de trabajo con la siguiente plantilla:

    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. Consulte los resultados.

    • Ejecute el siguiente comando para consultar la PVC creada:

      kubectl get pvc pmem-direct

      Salida esperada:

      NAME          STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
      pmem-direct   Bound    disk-****   9Gi        RWO            pmem-direct    17m
    • Ejecute el siguiente comando para consultar el pod creado:

      kubectl get pod

      Salida esperada:

      NAME                                READY   STATUS    RESTARTS   AGE
      sts-direct-0                        1/1     Running   0          17m
  4. Ejecute el siguiente comando para iniciar sesión en la aplicación y comprobar la ruta de montaje del volumen:

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

    La siguiente salida indica que se creó un volumen de block storage y se montó en el pod de la aplicación:

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