Compartir a través de


Uso de Azure Container Storage con NVMe local

Azure Container Storage es un servicio de administración, implementación y orquestación de volúmenes basado en la nube creado de forma nativa para contenedores. En este artículo se muestra cómo configurar Azure Container Storage para que use disco efímero con NVMe+ local como almacenamiento back-end para las cargas de trabajo de Kubernetes. Al final, tendrá un pod que usa NVMe local como almacenamiento.

¿Qué es un disco efímero?

Cuando su aplicación necesita una latencia de almacenamiento inferior al milisegundo y no requiere durabilidad de los datos, puede usar Disco efímero con Azure Container Storage para satisfacer sus requisitos de rendimiento. Efímero significa que los discos se implementan en la máquina virtual (VM) local que hospeda el clúster de AKS y no se guardan en un servicio de almacenamiento de Azure. Los datos se perderán en estos discos si detiene o desasigna la máquina virtual.

Hay dos tipos de disco efímero disponibles: NVMe local y SSD temporal. NVMe está diseñado para la transferencia de datos de alta velocidad entre el almacenamiento y la CPU. Elija NVMe cuando la aplicación necesite más IOPS o rendimiento que SSD temporal o requiera más espacio de almacenamiento. Tenga en cuenta que Azure Container Storage solo admite la replicación de datos sincrónica para NVMe local.

Debido a la naturaleza efímera de estos discos, Azure Container Storage admite el uso de volúmenes efímeros genéricos de forma predeterminada al usar disco efímero. Sin embargo, algunos casos de uso pueden requerir volúmenes persistentes incluso si los datos no son duraderos; por ejemplo, si desea usar archivos YAML existentes o plantillas de implementación codificadas de forma rígida para usar volúmenes persistentes, y la carga de trabajo admite la replicación de nivel de aplicación para la durabilidad. En tales casos, puede actualizar la instalación de Almacenamiento de contenedores de Azure y agregar la anotación acstor.azure.com/accept-ephemeral-storage=true en la definición de notificación de volumen persistente para admitir la creación de volúmenes persistentes a partir de grupos de almacenamiento de discos efímeros.

Requisitos previos

  • Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

  • En este artículo se necesita la versión más reciente de la CLI de Azure (2.35.0 o posteriores). Consulte Cómo instalar la CLI de Azure. Si usa el entorno de Bash en Azure Cloud Shell, ya está instalada la versión más reciente. Si tiene previsto ejecutar los comandos localmente en lugar de en Azure Cloud Shell, asegúrese de ejecutarlos con privilegios administrativos. Para más información, consulte Introducción a Azure Cloud Shell.

  • Necesitará el cliente de línea de comandos de Kubernetes, kubectl. Ya está instalado si usa Azure Cloud Shell o puede instalarlo de manera local ejecutando el comando az aks install-cli.

  • Si aún no ha instalado Azure Container Storage, siga las instrucciones de Uso de Azure Container Storage con Azure Kubernetes Service.

  • Compruebe si la región de destino se admite en regiones de Azure Container Storage.

Elección de un tipo de máquina virtual que admita NVMe local

El disco efímero solo está disponible en determinados tipos de máquinas virtuales. Si tiene previsto usar NVMe local, se requiere una máquina virtual optimizada para almacenamiento, como standard_l8s_v3.

Ejecute el siguiente comando para obtener el tipo de máquina virtual que está usando con su grupo de nodos. Reemplace <resource group> y <cluster name> con sus propios valores. No necesita proporcionar valores para PoolName o VmSize, así que mantenga la consulta como se muestra aquí.

az aks nodepool list --resource-group <resource group> --cluster-name <cluster name> --query "[].{PoolName:name, VmSize:vmSize}" -o table

A continuación, se muestra el ejemplo de una salida.

PoolName    VmSize
----------  ---------------
nodepool1   standard_l8s_v3

Se recomienda que cada máquina virtual tenga un mínimo de cuatro CPU virtuales (vCPU) y que cada grupo de nodos tenga al menos tres nodos.

Crear y adjuntar volúmenes efímeros genéricos

Siga estos pasos para crear y adjuntar un volumen efímero genérico.

1. Crear un grupo de almacenamiento

En primer lugar, cree un bloque de almacenamiento, que es una agrupación lógica de almacenamiento para el clúster de Kubernetes, definiéndolo en un archivo de manifiesto YAML.

Si ha habilitado Azure Container Storage mediante los comandos az aks create o az aks update, es posible que ya tenga un bloque de almacenamiento. Use kubectl get sp -n acstor para obtener la lista de bloques de almacenamiento. Si ya tiene un bloque de almacenamiento disponible que quiera usar, puede omitir esta sección y continuar con Representación de las clases de almacenamiento disponibles.

Siga estos pasos para crear un grupo de almacenamiento mediante NVMe local.

  1. Use su editor de texto favorito para crear un archivo de manifiesto YAML, como code acstor-storagepool.yaml.

  2. Pegue el código siguiente y guarde el archivo. El valor de nombre del bloque de almacenamiento puede ser el que quiera.

    apiVersion: containerstorage.azure.com/v1
    kind: StoragePool
    metadata:
      name: ephemeraldisk-nvme
      namespace: acstor
    spec:
      poolType:
        ephemeralDisk:
          diskType: nvme
    
  3. Aplique el archivo de manifiesto YAML para crear el bloque de almacenamiento.

    kubectl apply -f acstor-storagepool.yaml 
    

    Una vez completada la creación del bloque de almacenamiento, verá un mensaje como el siguiente:

    storagepool.containerstorage.azure.com/ephemeraldisk-nvme created
    

    También puede ejecutar este comando para comprobar el estado del bloque de almacenamiento. Reemplace <storage-pool-name> por el valor de nombre del bloque de almacenamiento. Para este ejemplo, el valor sería ephemeraldisk-nvme.

    kubectl describe sp <storage-pool-name> -n acstor
    

Cuando se crea el bloque de almacenamiento, Azure Container Storage creará una clase de almacenamiento en su nombre mediante la convención de nomenclatura acstor-<storage-pool-name>.

2. Mostrar las clases de almacenamiento disponibles

Cuando el bloque de almacenamiento esté listo para usarse, debe seleccionar una clase de almacenamiento para definir cómo se crea dinámicamente el almacenamiento al crear e implementar volúmenes.

Ejecute kubectl get sc para mostrar las clases de almacenamiento disponibles. Debería ver una clase de almacenamiento denominada acstor-<storage-pool-name>.

$ kubectl get sc | grep "^acstor-"
acstor-azuredisk-internal   disk.csi.azure.com               Retain          WaitForFirstConsumer   true                   65m
acstor-ephemeraldisk-nvme        containerstorage.csi.azure.com   Delete          WaitForFirstConsumer   true                   2m27s

Importante

No use la clase de almacenamiento marcada como interna. Es una clase de almacenamiento interna necesaria para que Azure Container Storage funcione.

3. Implementación de un pod con un volumen efímero genérico

Cree un pod mediante Fio (evaluador de E/S flexible) para realizar pruebas comparativas y simulación de carga de trabajo, que use un volumen efímero genérico.

  1. Use su editor de texto favorito para crear un archivo de manifiesto YAML, como code acstor-pod.yaml.

  2. Pegue el código siguiente y guarde el archivo.

    kind: Pod
    apiVersion: v1
    metadata:
      name: fiopod
    spec:
      nodeSelector:
        acstor.azure.com/io-engine: acstor
      containers:
        - name: fio
          image: nixery.dev/shell/fio
          args:
            - sleep
            - "1000000"
          volumeMounts:
            - mountPath: "/volume"
              name: ephemeralvolume
      volumes:
        - name: ephemeralvolume
          ephemeral:
            volumeClaimTemplate:
              metadata:
                labels:
                  type: my-ephemeral-volume
              spec:
                accessModes: [ "ReadWriteOnce" ]
                storageClassName: acstor-ephemeraldisk-nvme # replace with the name of your storage class if different
                resources:
                  requests:
                    storage: 1Gi
    

    Al cambiar el tamaño de almacenamiento de los volúmenes, asegúrese de que sea menor que la capacidad disponible del disco efímero de un solo nodo. Consulte Comprobación de la capacidad del disco efímero del nodo.

  3. Aplique el archivo de manifiesto YAML para implementar el pod.

    kubectl apply -f acstor-pod.yaml
    

    Debería ver un resultado similar al siguiente:

    pod/fiopod created
    
  4. Compruebe que el pod se esté ejecutando y que la notificación de volumen efímero se haya enlazado correctamente al pod:

    kubectl describe pod fiopod
    kubectl describe pvc fiopod-ephemeralvolume
    
  5. Compruebe las pruebas FIO para ver su estado actual:

    kubectl exec -it fiopod -- fio --name=benchtest --size=800m --filename=/volume/test --direct=1 --rw=randrw --ioengine=libaio --bs=4k --iodepth=16 --numjobs=8 --time_based --runtime=60
    

Ahora ha implementado un pod que usa NVMe local como almacenamiento y que puede usar para las cargas de trabajo de Kubernetes.

Creación y asociación de volúmenes persistentes

Para crear un volumen persistente a partir de un grupo de almacenamiento de disco efímero, debe incluir una anotación en las notificaciones de volumen persistentes (PVC) como protección para asegurarse de que piensa usar volúmenes persistentes incluso cuando los datos son efímeros. Además, debe habilitar la marca --ephemeral-disk-volume-type con el valor de PersistentVolumeWithAnnotation en el clúster antes de crear las notificaciones de volumen persistentes.

Siga estos pasos para crear y adjuntar un volumen persistente.

1. Actualización de la instalación de Almacenamiento de contenedores de Azure

Ejecute el comando siguiente para actualizar la instalación de Azure Container Storage para permitir la creación de volúmenes persistentes a partir de grupos de almacenamiento de discos efímeros.

az aks update -n <cluster-name> -g <resource-group> --enable-azure-container-storage ephemeralDisk --storage-pool-option NVMe --ephemeral-disk-volume-type PersistentVolumeWithAnnotation 

2. Crear un grupo de almacenamiento

Cree un grupo de almacenamiento, que es una agrupación lógica de almacenamiento para el clúster de Kubernetes, definiéndolo en un archivo de manifiesto YAML.

Si ha habilitado Azure Container Storage mediante los comandos az aks create o az aks update, es posible que ya tenga un bloque de almacenamiento. Use kubectl get sp -n acstor para obtener la lista de bloques de almacenamiento. Si ya tiene un bloque de almacenamiento disponible que quiera usar, puede omitir esta sección y continuar con Representación de las clases de almacenamiento disponibles.

Siga estos pasos para crear un grupo de almacenamiento mediante NVMe local.

  1. Use su editor de texto favorito para crear un archivo de manifiesto YAML, como code acstor-storagepool.yaml.

  2. Pegue el código siguiente y guarde el archivo. El valor de nombre del bloque de almacenamiento puede ser el que quiera.

    apiVersion: containerstorage.azure.com/v1
    kind: StoragePool
    metadata:
      name: ephemeraldisk-nvme
      namespace: acstor
    spec:
      poolType:
        ephemeralDisk:
          diskType: nvme
    
  3. Aplique el archivo de manifiesto YAML para crear el bloque de almacenamiento.

    kubectl apply -f acstor-storagepool.yaml 
    

    Una vez completada la creación del bloque de almacenamiento, verá un mensaje como el siguiente:

    storagepool.containerstorage.azure.com/ephemeraldisk-nvme created
    

    También puede ejecutar este comando para comprobar el estado del bloque de almacenamiento. Reemplace <storage-pool-name> por el valor de nombre del bloque de almacenamiento. Para este ejemplo, el valor sería ephemeraldisk-nvme.

    kubectl describe sp <storage-pool-name> -n acstor
    

Cuando se crea el bloque de almacenamiento, Azure Container Storage creará una clase de almacenamiento en su nombre mediante la convención de nomenclatura acstor-<storage-pool-name>.

3. Mostrar las clases de almacenamiento disponibles

Cuando el bloque de almacenamiento esté listo para usarse, debe seleccionar una clase de almacenamiento para definir cómo se crea dinámicamente el almacenamiento al crear e implementar volúmenes.

Ejecute kubectl get sc para mostrar las clases de almacenamiento disponibles. Debería ver una clase de almacenamiento denominada acstor-<storage-pool-name>.

$ kubectl get sc | grep "^acstor-"
acstor-azuredisk-internal   disk.csi.azure.com               Retain          WaitForFirstConsumer   true                   65m
acstor-ephemeraldisk-nvme        containerstorage.csi.azure.com   Delete          WaitForFirstConsumer   true                   2m27s

Importante

No use la clase de almacenamiento marcada como interna. Es una clase de almacenamiento interna necesaria para que Azure Container Storage funcione.

4. Creación de una notificación de volumen persistente

Una notificación de volumen persistente se usa para aprovisionar automáticamente el almacenamiento en función de una clase de almacenamiento. Siga estos pasos para crear una PVC mediante la nueva clase de almacenamiento.

  1. Use su editor de texto favorito para crear un archivo de manifiesto YAML, como code acstor-pvc.yaml.

  2. Pegue el código siguiente y guarde el archivo. Puede elegir el valor de name de PCV que quiera.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: ephemeralpvc
      annotations:
        acstor.azure.com/accept-ephemeral-storage: "true"
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: acstor-ephemeraldisk-nvme # replace with the name of your storage class if different
      resources:
        requests:
          storage: 100Gi
    

    Al cambiar el tamaño de almacenamiento de los volúmenes, asegúrese de que sea menor que la capacidad disponible del disco efímero de un solo nodo. Consulte Comprobación de la capacidad del disco efímero del nodo.

  3. Aplique el archivo de manifiesto YAML para crear la PVC.

    kubectl apply -f acstor-pvc.yaml
    

    Debería mostrarse una salida similar a esta:

    persistentvolumeclaim/ephemeralpvc created
    

    Para comprobar el estado de la PVC, ejecute el siguiente comando:

    kubectl describe pvc ephemeralpvc
    

Una vez creada la PVC, está lista para que la use un pod.

5. Implementar un pod y asociar un volumen persistente

Cree un pod mediante Fio (evaluador de E/S flexible) para realizar pruebas comparativas y simulación de carga de trabajo y especifique una ruta de montaje para el volumen persistente. Para claimName, use el valor de nombre que usó al crear la notificación de volumen persistente.

  1. Use su editor de texto favorito para crear un archivo de manifiesto YAML, como code acstor-pod.yaml.

  2. Pegue el código siguiente y guarde el archivo.

    kind: Pod
    apiVersion: v1
    metadata:
      name: fiopod
    spec:
      nodeSelector:
        acstor.azure.com/io-engine: acstor
      volumes:
        - name: ephemeralpv
          persistentVolumeClaim:
            claimName: ephemeralpvc
      containers:
        - name: fio
          image: nixery.dev/shell/fio
          args:
            - sleep
            - "1000000"
          volumeMounts:
            - mountPath: "/volume"
              name: ephemeralpv
    
  3. Aplique el archivo de manifiesto YAML para implementar el pod.

    kubectl apply -f acstor-pod.yaml
    

    Debería ver un resultado similar al siguiente:

    pod/fiopod created
    
  4. Compruebe que el pod se está ejecutando y que la notificación de volumen persistente se ha enlazado correctamente al pod:

    kubectl describe pod fiopod
    kubectl describe pvc ephemeralpvc
    
  5. Compruebe las pruebas FIO para ver su estado actual:

    kubectl exec -it fiopod -- fio --name=benchtest --size=800m --filename=/volume/test --direct=1 --rw=randrw --ioengine=libaio --bs=4k --iodepth=16 --numjobs=8 --time_based --runtime=60
    

Ahora ha implementado un pod que usa NVMe local y puede usarlo para las cargas de trabajo de Kubernetes.

Administración de volúmenes y grupos de almacenamiento

En esta sección, aprenderá a comprobar la capacidad disponible de disco efímero para un único nodo, a expandir o eliminar un grupo de almacenamiento y a optimizar el rendimiento.

Comprobación de la capacidad del disco efímero del nodo

Se asigna un volumen efímero en un solo nodo. Al configurar el tamaño de los volúmenes efímeros, debe ser menor que la capacidad disponible del disco efímero de un solo nodo.

Ejecute el comando siguiente para comprobar la capacidad disponible del disco efímero de un solo nodo.

$ kubectl get diskpool -n acstor
NAME                                CAPACITY      AVAILABLE     USED        RESERVED    READY   AGE
ephemeraldisk-nvme-diskpool-jaxwb   75660001280   75031990272   628011008   560902144   True    21h
ephemeraldisk-nvme-diskpool-wzixx   75660001280   75031990272   628011008   560902144   True    21h
ephemeraldisk-nvme-diskpool-xbtlj   75660001280   75031990272   628011008   560902144   True    21h

En este ejemplo, la capacidad disponible del disco efímero para un solo nodo es de 75031990272 bytes o 69 GiB.

Expansión de un grupo de almacenamiento

Puede expandir los grupos de almacenamiento respaldados por NVMe local para escalar verticalmente rápidamente y sin tiempo de inactividad. Actualmente no se admite la reducción de los grupos de almacenamiento.

Dado que un grupo de almacenamiento respaldado por disco efímero usa recursos de almacenamiento local en los nodos del clúster (VM) de AKS, la expansión del grupo de almacenamiento requiere agregar otro nodo al clúster. Siga estas instrucciones para expandir el bloque de almacenamiento.

  1. Ejecute el siguiente comando para agregar un nodo al clúster de AKS. Reemplace <cluster-name>, <nodepool name> y <resource-group-name> con sus propios valores. Para obtener el nombre del grupo de nodos, ejecute kubectl get nodes.

    az aks nodepool add --cluster-name <cluster name> --name <nodepool name> --resource-group <resource group> --node-vm-size Standard_L8s_v3 --node-count 1 --labels acstor.azure.com/io-engine=acstor
    
  2. Ejecute kubectl get nodes y verá que se ha agregado un nodo al clúster.

  3. Ejecute kubectl get sp -A y debería ver que la capacidad del bloque de almacenamiento ha aumentado.

Crear un grupo de almacenamiento

Si desea eliminar un bloque de almacenamiento, ejecute el siguiente comando. Reemplace <storage-pool-name> por el nombre del bloque de almacenamiento.

kubectl delete sp -n acstor <storage-pool-name>

Optimización del rendimiento al usar NVMe local

En función de los requisitos de rendimiento de la carga de trabajo, puede elegir entre tres niveles de rendimiento diferentes: Básico, Estándar y Premium. La selección afectará al número de vCPU que los componentes de Azure Container Storage consumen en los nodos donde está instalado. Estándar es la configuración predeterminada si no actualiza el nivel de rendimiento.

Estos tres niveles ofrecen un intervalo diferente de IOPS. La tabla siguiente contiene instrucciones sobre lo que podría esperar con cada uno de estos niveles. Usamos FIO, una herramienta de pruebas comparativas popular, para lograr estos números con la siguiente configuración:

  • AKS: SKU de nodo: Standard_L16s_v3;
  • FIO: Tamaño de bloque - 4 kB; Profundidad de cola - 32; Numjobs: número de núcleos asignados a los componentes de almacenamiento de contenedores; Patrón de acceso: aleatorio; Tamaño del conjunto de trabajo: 32G
Nivel Número de vCPU 100 % IOPS de lectura 100 % IOPS de escritura
Basic 12,5 % del total de núcleos de máquina virtual Hasta 120 000 Hasta 90 000
Standard (valor predeterminado) 25 % del total de núcleos de máquina virtual Hasta 220 000 Hasta 180 000
Premium 50 % del total de núcleos de máquina virtual Hasta 550 000 Hasta 360 000

Nota:

El consumo de RAM y macropáginas seguirá siendo coherente en todos los niveles: 1 GiB de RAM y 2 GiB de macropáginas.

Una vez que haya identificado el nivel de rendimiento que se alinea mejor con sus necesidades, puede ejecutar el siguiente comando para actualizar el nivel de rendimiento de la instalación de Almacenamiento de contenedores de Azure. Reemplace <performance tier> por básico, estándar o premium.

az aks update -n <cluster-name> -g <resource-group> --enable-azure-container-storage <storage-pool-type> --ephemeral-disk-nvme-perf-tier <performance-tier>

Consulte también