全部产品
Search
文档中心

Container Service for Kubernetes:Ikhtisar volume NVM

更新时间:Jul 02, 2025

Volume memori non-volatile (NVM) dapat diprovision berdasarkan produk memori persisten (PMEM) yang disediakan oleh Intel. Anda dapat menggunakan NVM untuk memperluas kapasitas memori dengan biaya lebih rendah dan mengakses data persisten dengan latensi lebih rendah. NVM memberikan manfaat dari produk memori dan penyimpanan. Topik ini menjelaskan cara menggunakan volume NVM dalam klaster Container Service for Kubernetes (ACK) serta menyediakan contoh-contohnya.

Informasi latar belakang

PMEM menyediakan memori berperforma tinggi yang mendukung persistensi data. PMEM berada pada bus memori dan memungkinkan Anda mengakses data dengan cara yang sama seperti saat menggunakan dynamic random access memory (DRAM). PMEM menawarkan kecepatan dan latensi hampir sama dengan DRAM serta non-volatilitas NAND flash. Berikut adalah manfaat PMEM:

  • Latensi lebih rendah dibandingkan SSD flash saat mengakses data.

  • Throughput lebih tinggi dibandingkan penyimpanan flash.

  • Biaya lebih rendah dibandingkan DRAM.

  • Peng-caching data. Ini menyelesaikan masalah bahwa data yang ditransmisikan melalui Peripheral Component Interconnect Express (PCIe) tidak dapat di-cache di CPU.

  • Akses real-time ke data dan akses ultra-cepat ke dataset besar.

  • Data tetap tersimpan di memori setelah mesin dimatikan, memberikan manfaat yang sama seperti memori flash.

Cara menggunakan volume NVM

Anda dapat menggunakan driver Container Storage Interface (CSI) yang disediakan oleh Alibaba Cloud untuk mengelola siklus hidup perangkat NVM dalam klaster ACK. Ini memungkinkan Anda mengalokasikan, memasang, dan menggunakan sumber daya NVM dengan menggunakan klaim deklaratif.

Berikut adalah metode yang dapat digunakan untuk menggunakan volume NVM dalam klaster ACK:

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

    Sumber daya NVM dapat digunakan sebagai penyimpanan blok atau sistem file. Anda dapat langsung mengklaim sumber daya NVM tanpa perlu memodifikasi aplikasi Anda. Anda dapat menggunakan Logical Volume Manager (LVM) untuk memvirtualisasi sumber daya PMEM pada node menjadi grup volume (VG). Kemudian, Anda dapat membuat persistent volume claim (PVC) dengan tipe dan kapasitas yang diperlukan.

    Metode ini cocok untuk aplikasi serverless, aplikasi komputasi data berlatensi rendah dan throughput tinggi, serta aplikasi periode CI/CD pendek yang memerlukan penyimpanan sementara berkecepatan tinggi. Ini memungkinkan peningkatan throughput I/O sebesar 2 hingga 10 kali. Untuk lebih banyak contoh, lihat Gunakan memori non-volatile AEP untuk meningkatkan performa baca/tulis.

  • PMEM-direct memory

    Sumber daya NVM dapat digunakan sebagai memori langsung. Anda dapat menggunakan PMEM sebagai memori langsung dengan melakukan modifikasi tertentu pada fungsi alokasi memori berdasarkan PMEM SDK. Ini memungkinkan Anda memprovision sumber daya NVM sebagai memori langsung yang memberikan throughput dan latensi seperti memori.

    Metode ini cocok untuk database in-memory seperti Redis dan SAP HANA dalam hal memori besar dan efisiensi biaya. Metode ini mengurangi biaya memori sebesar 30% hingga 50%. Untuk lebih banyak contoh, lihat Deploy instance Redis dengan volume NVM yang dipasang sebagai memori langsung.

Tabel berikut menjelaskan detail perbandingan antara metode berbeda dalam menggunakan volume NVM.

Metode

Dukungan untuk penyimpanan terfragmentasi

Dukungan untuk ekspansi online

Dukungan untuk persistensi memori

Dukungan untuk modifikasi aplikasi

Latensi (4K/RW)

Throughput (4K/RW)

Kapasitas maksimum per instance ECS tunggal (ecs.ebmre6p.26xlarge)

PMEM-LVM

Tidak

Ya

Ya

Tidak

10 us

10W

1.536 GB

PMEM-Direct

Ya

Tidak

Tidak

Ya

1,2 us

56W

768 GB

SSD

Tidak

Ya

Ya

Tidak

100 us

1W

32 TB

Deploy komponen CSI

Pengenalan komponen CSI

Untuk menggunakan NVM dalam klaster ACK, Anda harus menerapkan komponen-komponen berikut:

  • CSI-Plugin: menginisialisasi perangkat PMEM dan membuat, menghapus, memasang, serta melepas volume.

  • CSI-Provisioner: mendeteksi dan memulai permintaan pembuatan serta penghapusan volume.

  • CSI-Scheduler: menjadwalkan penyimpanan (Scheduler ACK adalah komponen yang sudah diinstal sebelumnya).

Deploy komponen CSI

  1. Tambahkan instance Elastic Compute Service (ECS) yang dilengkapi dengan sumber daya PMEM ke klaster ACK Anda. Sebagai contoh, Anda dapat menambahkan instance ECS tipe ecs.ebmre6p.26xlarge. Keluarga instans re6p yang dioptimalkan untuk memori persisten dan keluarga instans ECS Bare Metal ebmre6p yang dioptimalkan untuk memori persisten mendukung generasi pertama PMEM.

  2. Untuk memastikan plugin CSI dapat digunakan untuk memasang sumber daya PMEM, tambahkan label berikut ke instance ECS yang dilengkapi dengan sumber daya PMEM:

    • pmem.csi.alibabacloud.com: mengaktifkan O&M otomatis untuk perangkat NVM.

    • pmem.csi.alibabacloud.com/type: lvm: mengaktifkan dukungan untuk metode PMEM-LVM.

    • pmem.csi.alibabacloud.com/type: direct: mengaktifkan dukungan untuk metode memori langsung PMEM.

  3. Deploy plugin CSI untuk PMEM.

    1. Deploy CSI-Plugin.

      Perluas untuk melihat deployment file YAML CSI-Plugin

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

      Perluas untuk melihat deployment file YAML CSI-Provisioner

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

      Perluas untuk melihat deployment file YAML StorageClass

      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
      	  	  
      	  

Contoh

Use AEP as block storage volumes

  1. Buat PVC dengan template YAML berikut.

    Untuk menjadwalkan PVC ke node NVM tertentu, tambahkan anotasi 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. Deploy beban kerja dengan template YAML berikut:

    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. Lihat hasilnya.

    • Jalankan perintah berikut untuk menanyakan PVC yang telah dibuat:

      kubectl get pvc 

      Output yang diharapkan:

      NAME               STATUS    VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS              AGE
      pmem-lvm           Bound    disk-****   10Gi       RWO            pmem-lvm                  10m
    • Jalankan perintah berikut untuk menanyakan pod yang telah dibuat:

      kubectl get pod

      Output yang diharapkan:

      NAME                                READY   STATUS    RESTARTS   AGE
      sts-lvm-0                           1/1     Running   0          10m
  4. Jalankan perintah berikut untuk masuk ke aplikasi dan memeriksa jalur pemasangan volume:

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

    Output berikut menunjukkan bahwa volume penyimpanan blok telah dibuat dan dipasang ke pod aplikasi:

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

Use NVM as direct memory volumes

  1. Buat PVC dengan template YAML berikut.

    Untuk menjadwalkan PVC ke node NVM tertentu, tambahkan anotasi 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. Deploy beban kerja dengan template berikut:

    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. Lihat hasilnya.

    • Jalankan perintah berikut untuk menanyakan PVC yang telah dibuat:

      kubectl get pvc pmem-direct

      Output yang diharapkan:

      NAME          STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
      pmem-direct   Bound    disk-****   9Gi        RWO            pmem-direct    17m
    • Jalankan perintah berikut untuk menanyakan pod yang telah dibuat:

      kubectl get pod

      Output yang diharapkan:

      NAME                                READY   STATUS    RESTARTS   AGE
      sts-direct-0                        1/1     Running   0          17m
  4. Jalankan perintah berikut untuk masuk ke aplikasi dan memeriksa jalur pemasangan volume:

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

    Output berikut menunjukkan bahwa volume penyimpanan blok telah dibuat dan dipasang ke pod aplikasi:

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