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 y creado de forma nativa para contenedores. En este artículo se muestra cómo configurar Azure Container Storage para usar el disco NVMe local como almacenamiento back-end para las cargas de trabajo de Kubernetes. NVMe está diseñado para la transferencia de datos de alta velocidad entre el almacenamiento y la CPU, lo que proporciona un alto rendimiento y IOPS.

Importante

Este artículo se aplica a Azure Container Storage (versión 2.x.x), que actualmente solo admite el disco NVMe local para el almacenamiento de respaldo. Para más información sobre las versiones anteriores, consulte la documentación de Azure Container Storage (versión 1.x.x).

¿Qué es NVMe local?

Cuando la aplicación necesita una latencia de almacenamiento de submilisegundos y un alto rendimiento, puede usar discos NVMe locales con Azure Container Storage para satisfacer los 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 pierden en estos discos si detiene o desasigna la VM. Los discos NVMe locales se ofrecen en familias de máquinas virtuales de Azure selectas, como máquinas virtuales optimizadas para almacenamiento .

De forma predeterminada, Azure Container Storage crea volúmenes efímeros genéricos al usar discos NVMe locales. Para los casos de uso que requieren notificaciones de volumen persistentes, puede agregar la anotación localdisk.csi.acstor.io/accept-ephemeral-storage: "true" en la plantilla de notificación de volumen persistente.

Seccionamiento de datos

Para maximizar el rendimiento, Azure Container Storage distribuye automáticamente los datos en todos los discos NVMe locales disponibles en función de cada máquina virtual. El seccionamiento es una técnica en la que los datos se dividen en pequeños fragmentos y se escriben uniformemente en varios discos simultáneamente, lo que aumenta el rendimiento y mejora el rendimiento general de E/S. Este comportamiento está habilitado de forma predeterminada y no se puede deshabilitar.

Debido a que el rendimiento se agrega entre esos dispositivos en banda, los tamaños de VM más grandes que ofrecen más unidades NVMe pueden desbloquear un número significativamente mayor de IOPS y ancho de banda. La selección de una familia de máquinas virtuales más grande permite que las cargas de trabajo se beneficien del rendimiento agregado adicional sin configuración adicional.

Por ejemplo, la serie Lsv3 se escala desde una sola unidad NVMe de 1,92 TB en Standard_L8s_v3 (alrededor de 400 000 IOPS y 2000 MB/s) hasta 10 unidades NVMe en Standard_L80s_v3 (aproximadamente 3,8 millones de IOPS y 20 000 MB/s).

Requisitos previos

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

  • Este artículo requiere la versión más reciente (2.77.0 o posterior) de la CLI de Azure. Consulte Cómo instalar la CLI de Azure. Evite Azure Cloud Shell, ya que az upgrade no está disponible en Cloud Shell. Asegúrese de ejecutar los comandos de este artículo con privilegios administrativos.

  • Revise las instrucciones de instalación y asegúrese de que Azure Container Storage está instalado correctamente.

  • Necesita el cliente de línea de comandos de Kubernetes, kubectl. Para instalarlo localmente, ejecute el az aks install-cli comando .

  • 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

Los discos NVMe locales solo están disponibles en determinados tipos de máquinas virtuales, por ejemplo, máquinas virtuales optimizadas para almacenamiento o máquinas virtuales aceleradas por GPU. Si tiene previsto usar la capacidad nvMe local, elija uno de estos tamaños de máquina virtual.

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

La siguiente salida es un ejemplo:

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

Nota:

En Azure Container Storage (versión 2.x.x), ahora puede usar clústeres con menos de tres nodos.

Creación de una clase de almacenamiento para NVMe local

Si aún no lo ha hecho, instale Azure Container Storage.

Azure Container Storage (versión 2.x.x) presenta NVMe local como una clase de almacenamiento estándar de Kubernetes. Cree la local clase de almacenamiento una vez por clúster y reutilícela para volúmenes efímeros genéricos y reclamaciones de volúmenes persistentes.

  1. Use el editor de texto que prefiera para crear un archivo de manifiesto YAML como storageclass.yamly, a continuación, pegue la especificación siguiente.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: local
    provisioner: localdisk.csi.acstor.io
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    
  2. Aplique el manifiesto para crear la clase de almacenamiento.

    kubectl apply -f storageclass.yaml
    

Como alternativa, puede crear la clase de almacenamiento mediante Terraform.

  1. Use Terraform para administrar la clase de almacenamiento mediante la creación de una configuración como la siguiente main.tf. Actualice la versión del proveedor o la ruta de acceso kubeconfig según sea necesario para su entorno.

    terraform {
      required_version = ">= 1.5.0"
      required_providers {
        kubernetes = {
          source  = "hashicorp/kubernetes"
          version = "~> 3.x"
        }
      }
    }
    
    provider "kubernetes" {
      config_path = "~/.kube/config"
    }
    
    resource "kubernetes_storage_class_v1" "local" {
      metadata {
        name = "local"
      }
    
      storage_provisioner    = "localdisk.csi.acstor.io"
      reclaim_policy         = "Delete"
      volume_binding_mode    = "WaitForFirstConsumer"
      allow_volume_expansion = true
    }
    
  2. Inicialice, revise y aplique la configuración para crear la clase de almacenamiento.

    terraform init
    terraform plan
    terraform apply
    

Comprobación de la clase de almacenamiento

Ejecute el siguiente comando para comprobar que se crea la clase de almacenamiento:

kubectl get storageclass local

Debería mostrarse una salida similar a esta:

NAME    PROVISIONER                RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local   localdisk.csi.acstor.io    Delete          WaitForFirstConsumer   true                   10s

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

Siga estos pasos para crear y adjuntar un volumen efímero genérico mediante Azure Container Storage. Asegúrese de que Azure Container Storage está instalado y de que la local clase de almacenamiento existe antes de continuar.

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

Cree un pod con 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 fiopod.yaml.

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

    kind: Pod
    apiVersion: v1
    metadata:
      name: fiopod
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - name: fio
          image: mayadata/fio
          args: ["sleep", "1000000"]
          volumeMounts:
            - mountPath: "/volume"
              name: ephemeralvolume
      volumes:
        - name: ephemeralvolume
          ephemeral:
            volumeClaimTemplate:
              spec:
                volumeMode: Filesystem
                accessModes: ["ReadWriteOnce"]
                storageClassName: local
                resources:
                  requests:
                    storage: 10Gi
    
  3. Aplique el archivo de manifiesto YAML para implementar el pod.

    kubectl apply -f fiopod.yaml
    

Comprobación de las pruebas comparativas de implementación y ejecución

Compruebe que el pod se está ejecutando:

kubectl get pod fiopod

Debería ver el pod en estado en funcionamiento. Una vez en ejecución, puede ejecutar una prueba comparativa de Fio:

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

Crear y adjuntar volúmenes persistentes con anotación de almacenamiento efímero

Aunque se recomiendan volúmenes efímeros genéricos para el almacenamiento efímero, Azure Container Storage también admite volúmenes persistentes con almacenamiento efímero cuando sea necesario para la compatibilidad con cargas de trabajo existentes.

Nota:

Azure Container Storage (versión 2.x.x) usa la nueva anotación localdisk.csi.acstor.io/accept-ephemeral-storage: "true" en lugar de la anterior acstor.azure.com/accept-ephemeral-storage: "true".

Asegúrese de que Azure Container Storage está instalado y la local clase de almacenamiento que creó anteriormente está disponible antes de implementar cargas de trabajo que la usen.

Implementación de un StatefulSet con volúmenes persistentes

Si necesita usar reclamaciones de volumen persistente que no están vinculadas al ciclo de vida del pod, debe agregar la anotación localdisk.csi.acstor.io/accept-ephemeral-storage: "true". Los datos del volumen son locales para el nodo y se pierden si se elimina el nodo o el pod se mueve a otro nodo.

Este es un ejemplo de un conjunto con estado (stateful set) usando volúmenes persistentes con la anotación de almacenamiento efímero:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-lcd-lvm-annotation
  labels:
    app: busybox
spec:
  podManagementPolicy: Parallel
  serviceName: statefulset-lcd
  replicas: 10
  template:
    metadata:
      labels:
        app: busybox
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - name: statefulset-lcd
          image: mcr.microsoft.com/azurelinux/busybox:1.36
          command:
            - "/bin/sh"
            - "-c"
            - set -euo pipefail; trap exit TERM; while true; do date -u +"%Y-%m-%dT%H:%M:%SZ" >> /mnt/lcd/outfile; sleep 1; done
          volumeMounts:
            - name: persistent-storage
              mountPath: /mnt/lcd
  updateStrategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: busybox
  volumeClaimTemplates:
    - metadata:
        name: persistent-storage
        annotations:
          localdisk.csi.acstor.io/accept-ephemeral-storage: "true"
      spec:
        accessModes: ["ReadWriteOnce"]
        storageClassName: local
        resources:
          requests:
            storage: 10Gi

Guarde y aplique este YAML para crear el StatefulSet con volúmenes persistentes.

kubectl apply -f statefulset-pvc.yaml

Administrar el almacenamiento

En esta sección, aprenderá a comprobar la capacidad del disco efímero del nodo, expandir la capacidad de almacenamiento y eliminar los recursos de almacenamiento.

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, el tamaño debe ser menor que la capacidad disponible del disco efímero del nodo único.

Asegúrese de que exista un StorageClass para localdisk.csi.acstor.io. Ejecute el siguiente comando para comprobar la capacidad disponible del disco efímero para cada nodo.

kubectl get csistoragecapacities.storage.k8s.io -n kube-system -o custom-columns=NAME:.metadata.name,STORAGE_CLASS:.storageClassName,CAPACITY:.capacity,NODE:.nodeTopology.matchLabels."topology\.localdisk\.csi\.acstor\.io/node"

Debería ver una salida similar al ejemplo siguiente:

NAME          STORAGE_CLASS   CAPACITY    NODE
csisc-2pkx4   local           1373172Mi   aks-storagepool-31410930-vmss000001
csisc-gnmm9   local           1373172Mi   aks-storagepool-31410930-vmss000000

Si encuentra una salida de capacidad vacía, confirme que existe una clase StorageClass para localdisk.csi.acstor.io . El recurso csistoragecapacities.storage.k8s.io solo se genera después de que exista una StorageClass para localdisk.csi.acstor.io.

Expansión de la capacidad de almacenamiento

Dado que el almacenamiento en disco efímero usa recursos locales en los nodos del clúster de AKS, la expansión de la capacidad de almacenamiento requiere agregar nodos al clúster.

Para agregar un nodo al clúster, ejecute el siguiente comando. Reemplace <cluster-name>, <nodepool-name>, <resource-group> y <new-count> por sus valores.

az aks nodepool scale --cluster-name <cluster-name> --name <nodepool-name> --resource-group <resource-group> --node-count <new-count>

Eliminación de recursos de almacenamiento

Para limpiar los recursos de almacenamiento, primero debe eliminar todos los elementos PersistentVolumeClaims o PersistentVolumes. Al eliminar Almacenamiento de contenedores de Azure, no se quita automáticamente el objeto PersistentVolumes/PersistentVolumeClaims existente.

Para eliminar una clase de almacenamiento denominada local, ejecute el siguiente comando:

kubectl delete storageclass local

Consulte también