Todos os produtos
Search
Central de documentação

:Visão geral de volumes NVM

Última atualização: Jun 27, 2026

Você pode provisionar volumes de memória não volátil (NVM) com base no produto de memória persistente (PMEM) da Intel. O NVM permite expandir a capacidade de memória com custos reduzidos e acessar dados persistentes com menor latência, reunindo as vantagens de produtos de memória e armazenamento. Este tópico descreve como utilizar volumes NVM em clusters do Container Service for Kubernetes (ACK) e apresenta exemplos práticos.

Informações básicas

O PMEM oferece memória de alto desempenho com suporte à persistência de dados. Por residir no barramento de memória, ele permite o acesso aos dados da mesma forma que a memória dinâmica de acesso aleatório (DRAM). O PMEM proporciona velocidade e latência quase equivalentes às da DRAM, mantendo a não volatilidade da memória flash NAND. Seus principais benefícios incluem:

  • Latência inferior à dos SSDs flash no acesso a dados.

  • Throughput superior ao do armazenamento flash.

  • Custo mais baixo em comparação à DRAM.

  • Cache de dados. Isso resolve a limitação de cache na CPU para dados transmitidos via Peripheral Component Interconnect Express (PCIe).

  • Acesso em tempo real e ultrarrápido a grandes conjuntos de dados.

  • Retenção de dados na memória mesmo após o desligamento da máquina, oferecendo a mesma vantagem da memória flash.

Como usar volumes NVM

Use o driver Container Storage Interface (CSI) fornecido pela Alibaba Cloud para gerenciar o ciclo de vida de dispositivos NVM em clusters ACK. Esse driver possibilita alocar, montar e utilizar recursos NVM por meio de declarações declarativas.

Utilize volumes NVM em clusters ACK de uma das seguintes formas:

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

    Recursos NVM funcionam como armazenamento em bloco ou sistemas de arquivos. Reivindique esses recursos diretamente, sem modificar suas aplicações. Use o Logical Volume Manager (LVM) para virtualizar os recursos PMEM de um nó em grupos de volumes (VGs) e criar persistent volume claims (PVCs) com os tipos e capacidades necessários.

    Essa abordagem é ideal para aplicações serverless, computação de dados com alto throughput e baixa latência, além de pipelines de CI/CD curtos que exigem armazenamento temporário de alta velocidade. O throughput de E/S aumenta de 2 a 10 vezes. Para mais exemplos, consulte Melhorar o desempenho de leitura e gravação com memória não volátil.

  • PMEM-direct memory

    Recursos NVM também atuam como memória direta. Ao ajustar funções de alocação de memória com base no SDK do PMEM, você provisiona recursos NVM como memória direta e obtém throughput e latência similares aos da memória tradicional.

    Esse método é recomendado para bancos de dados em memória, como Redis e SAP HANA, quando se busca grande capacidade de memória com custo-benefício. A redução nos custos de memória varia de 30% a 50%. Para mais exemplos, consulte Implantar uma instância Redis com volume NVM montado como memória direta.

A tabela a seguir detalha a comparação entre os diferentes métodos de uso de volumes NVM.

Método

Suporte a armazenamento fragmentado

Suporte a expansão online

Suporte a persistência de memória

Requer modificação na aplicação

Latência (4K/RW)

Throughput (4K/RW)

Capacidade máxima por instância ECS (ecs.ebmre6p.26xlarge)

PMEM-LVM

Não

Sim

Sim

Não

10 us

10W

1536 GB

PMEM-Direct

Sim

Não

Não

Sim

1,2 us

56W

768 GB

SSD

Não

Sim

Sim

Não

100 us

1W

32 TB

Implantar componentes CSI

Introdução aos componentes CSI

Para utilizar NVM em clusters ACK, implante os seguintes componentes:

  • CSI-Plugin: inicializa dispositivos PMEM e executa operações de criação, exclusão, montagem e desmontagem de volumes.

  • CSI-Provisioner: detecta e inicia solicitações de criação e exclusão de volumes.

  • CSI-Scheduler: gerencia o agendamento de armazenamento (o agendador do ACK já vem pré-instalado).

Implantar componentes CSI

  1. Adicione instâncias do Elastic Compute Service (ECS) equipadas com recursos PMEM ao seu cluster ACK. Por exemplo, adicione instâncias ECS do tipo ecs.ebmre6p.26xlarge. A família de instâncias re6p otimizadas para memória persistente e a família de instâncias bare metal ECS ebmre6p otimizadas para memória persistente suportam a primeira geração de PMEM.

  2. Para garantir que o plug-in CSI monte corretamente os recursos PMEM, adicione os seguintes rótulos às instâncias ECS equipadas com PMEM:

    • pmem.csi.alibabacloud.com: ativa a O&M automática para dispositivos NVM.

    • pmem.csi.alibabacloud.com/type: lvm: habilita o suporte ao método PMEM-LVM.

    • pmem.csi.alibabacloud.com/type: direct: habilita o suporte ao método de memória direta PMEM.

  3. Implante o plug-in CSI para PMEM.

    1. Implante o 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. Implante o 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. Crie 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
      	  	  
      	  

Exemplos

Use AEP as block storage volumes

  1. Crie uma PVC usando o seguinte modelo YAML.

    Para agendar a PVC em um nó NVM específico, adicione a anotação 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. Implante uma carga de trabalho com o seguinte modelo 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. Verifique os resultados.

    • Execute o comando a seguir para consultar a PVC criada:

      kubectl get pvc 

      Saída esperada:

      NAME               STATUS    VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS              AGE
      pmem-lvm           Bound    disk-****   10Gi       RWO            pmem-lvm                  10m
    • Execute o comando a seguir para consultar o pod criado:

      kubectl get pod

      Saída esperada:

      NAME                                READY   STATUS    RESTARTS   AGE
      sts-lvm-0                           1/1     Running   0          10m
  4. Execute o comando a seguir para acessar a aplicação e verificar o caminho de montagem do volume:

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

    A saída a seguir indica que um volume de armazenamento em bloco foi criado e montado no pod da aplicação:

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

Use NVM as direct memory volumes

  1. Crie uma PVC usando o seguinte modelo YAML.

    Para agendar a PVC em um nó NVM específico, adicione a anotação 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. Implante uma carga de trabalho com o seguinte modelo:

    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. Verifique os resultados.

    • Execute o comando a seguir para consultar a PVC criada:

      kubectl get pvc pmem-direct

      Saída esperada:

      NAME          STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
      pmem-direct   Bound    disk-****   9Gi        RWO            pmem-direct    17m
    • Execute o comando a seguir para consultar o pod criado:

      kubectl get pod

      Saída esperada:

      NAME                                READY   STATUS    RESTARTS   AGE
      sts-direct-0                        1/1     Running   0          17m
  4. Execute o comando a seguir para acessar a aplicação e verificar o caminho de montagem do volume:

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

    A saída a seguir indica que um volume de armazenamento em bloco foi criado e montado no pod da aplicação:

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