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
-
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.
-
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.
-
Despliegue el plugin CSI para PMEM.
-
Despliegue CSI-Plugin.
-
Despliegue CSI-Provisioner.
-
Cree StorageClasses.
-
Ejemplos
Use AEP as block storage volumes
-
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 -
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 -
Consulte los resultados.
-
Ejecute el siguiente comando para consultar la PVC creada:
kubectl get pvcSalida 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 podSalida esperada:
NAME READY STATUS RESTARTS AGE sts-lvm-0 1/1 Running 0 10m
-
-
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 /dataLa 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
-
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 -
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 -
Consulte los resultados.
-
Ejecute el siguiente comando para consultar la PVC creada:
kubectl get pvc pmem-directSalida 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 podSalida esperada:
NAME READY STATUS RESTARTS AGE sts-direct-0 1/1 Running 0 17m
-
-
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 /dataLa 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