Creación y uso de un volumen con Azure Disks en Azure Kubernetes Service (AKS)

Un volumen persistente representa un fragmento de almacenamiento aprovisionado para su uso con pods de Kubernetes. Puede usar un volumen persistente con uno o varios pods, y puede aprovisionarlo de forma dinámica o estática. En este artículo, se muestra cómo crear volúmenes persistentes de manera dinámica con discos de Azure en un clúster de Azure Kubernetes Service (AKS).

Nota

Un disco de Azure solo se puede montar con el tipo de Modo de acceso establecido en ReadWriteOnce, lo que hace que esté disponible para un nodo en AKS. Este modo de acceso todavía permite que varios pods accedan al volumen cuando los pods se ejecutan en el mismo nodo. Para más información, consulte Modos acceso PersistentVolume de Kubernetes.

En este artículo aprenderá a:

  • Trabaje con un volumen persistente dinámico (PV) mediante la instalación del controlador de Container Storage Interface (CSI) y la creación dinámica de uno o más discos administrados de Azure para conectarlos a un pod.
  • Trabaje con un PV estático mediante la creación de uno o más discos administrados de Azure, o bien use uno existente y adjúntelo a un pod.

Para más información sobre los volúmenes de Kubernetes, consulte Opciones de almacenamiento para aplicaciones en AKS.

Antes de empezar

  • Debe tener una cuenta de almacenamiento de Azure.

  • Asegúrese de que tiene instalada y configurada la versión 2.0.59 de la CLI de Azure o una versión posterior. Ejecute az --version para encontrar la versión. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.

  • El controlador CSI para disco de Azure tiene un límite de volumen por nodo. El número de volúmenes cambia en función del tamaño del nodo o grupo de nodos. Ejecute el siguiente comando kubectl get para determinar el número de volúmenes que se pueden asignar por nodo:

    kubectl get CSINode <nodename> -o yaml
    

Aprovisionar un volumen dinámicamente

En esta sección se proporcionan instrucciones para los administradores de clústeres que desean aprovisionar uno o varios volúmenes persistentes que incluyen detalles de Azure Disks Storage para que lo use una carga de trabajo. Una notificación de volumen persistente (PVC) usa el objeto de clase de almacenamiento para aprovisionar de forma dinámica un contenedor de Azure Disks Storage.

Parámetros de clase de almacenamiento para PersistentVolumes dinámicos

En la siguiente tabla se incluyen parámetros que puede usar para definir una clase de almacenamiento personalizada para PersistentVolumeClaim.

Nombre Significado Valor disponible Mandatory Valor predeterminado
skuName Tipo de cuenta de almacenamiento del disco de Azure (alias: storageAccountType) Standard_LRS, Premium_LRS, StandardSSD_LRS, PremiumV2_LRS, UltraSSD_LRS, Premium_ZRS, StandardSSD_ZRS No StandardSSD_LRS
fsType Tipo de sistema de archivos ext4, ext3, ext2, xfs, btrfs para Linux, ntfs para Windows No ext4 para Linux, ntfs para Windows
cachingMode Configuración de caché de host del disco de datos de Azure None, ReadOnly, ReadWrite No ReadOnly
resourceGroup Especifique el grupo de recursos para los discos de Azure Nombre del grupo de recursos existente No Si está vacío, el controlador usará el mismo nombre de grupo de recursos que el clúster de AKS actual
DiskIOPSReadWrite Disco UltraSSD Funcionalidad de IOPS (mínimo: 2 IOPS/GiB) 100~160000 No 500
DiskMBpsReadWrite Disco UltraSSD Funcionalidad de rendimiento (mínimo: 0,032/GiB) 1~2000 No 100
LogicalSectorSize Tamaño del sector lógico en bytes para el disco Ultra. Los valores admitidos son 512 y 4096. El valor predeterminado es 4096. 512, 4096 No 4096
etiquetas Etiquetas del disco de Azure Formato de etiqueta: key1=val1,key2=val2 No ""
diskEncryptionSetID ResourceId del conjunto de cifrado de disco que se va a usar para habilitar el cifrado en reposo Formato: /subscriptions/{subs-id}/resourceGroups/{rg-name}/providers/Microsoft.Compute/diskEncryptionSets/{diskEncryptionSet-name} No ""
diskEncryptionType Tipo de cifrado del conjunto de cifrado de disco. EncryptionAtRestWithCustomerKey (de manera predeterminada), EncryptionAtRestWithPlatformAndCustomerKeys No ""
writeAcceleratorEnabled Acelerador de escritura en discos de Azure true, false No ""
networkAccessPolicy Propiedad NetworkAccessPolicy para evitar la generación del identificador URI de SAS de un disco o una instantánea AllowAll, DenyAll, AllowPrivate No AllowAll
diskAccessID Id. de Azure Resource del recurso DiskAccess para usar puntos de conexión privados en discos No ``
enableBursting Habilite la expansión a petición más allá del destino de rendimiento aprovisionado del disco. La expansión a petición solo se debe aplicar a discos Premium y cuando el tamaño del disco sea de > 512 GB. No se admiten discos Ultra y compartidos. La expansión está deshabilitada de manera predeterminada. true, false No false
useragent Agente de usuario utilizado para la atribución de uso del cliente No Agente de usuario generado con formato driverName/driverVersion compiler/version (OS-ARCH)
subscriptionID Especifique el id. de suscripción de Azure donde se van a crear los discos de Azure. Identificador de suscripción de Azure No Si no está vacío, se debe proporcionar resourceGroup.
--- Los parámetros siguientes solo son para v2 --- --- ---
maxShares Número total de montajes de disco compartido permitidos para el disco. Si se establece el valor en 2 o más, se habilitan las réplicas de datos adjuntos. Los valores admitidos dependen del tamaño del disco. Consulte Uso compartido de un disco administrado de Azure para conocer los valores admitidos. No 1
maxMountReplicaCount Número de datos adjuntos de réplicas que se van a mantener. Este valor debe estar en el intervalo de [0..(maxShares - 1)]. No Si accessMode es ReadWriteMany, el valor predeterminado es 0. De lo contrario, el valor predeterminado es maxShares - 1.

Clases de almacenamiento integradas

Las clases de almacenamiento se usan para definir cómo se crea dinámicamente una unidad de almacenamiento con un volumen persistente. Para obtener más información sobre las clases de almacenamiento de Kubernetes, vea Clases de almacenamiento de Kubernetes.

Cada clúster de AKS incluye cuatro clases de almacenamiento creadas previamente, dos de las cuales están configuradas para funcionar con discos de Azure:

  1. La clase de almacenamiento predeterminada aprovisiona un disco SSD estándar de Azure.
    • SSD estándar respalda el almacenamiento estándar y ofrece un almacenamiento rentable, al tiempo que proporciona un rendimiento fiable.
  2. La clase de almacenamiento managed-csi-premium aprovisiona un disco prémium de Azure.
    • Los discos de baja latencia, de alto rendimiento y basados en SSD respaldan los discos Premium. Son ideales para máquinas virtuales que ejecutan cargas de trabajo de producción. Cuando se usa el controlador CSI para disco de Azure en AKS, también puede usar la clase de almacenamiento managed-csi, respaldada por el almacenamiento con redundancia local (LRS) de SSD estándar.

No se permite reducir el tamaño de una PVC (para evitar la pérdida de datos). Puede editar una clase de almacenamiento existente usando el comando kubectl edit sco puede crear su propia clase de almacenamiento personalizada. Por ejemplo, si desea usar un disco de 4 TiB de tamaño, debe crear una clase de almacenamiento que defina cachingmode: None, porque el almacenamiento en caché de discos no se admite en discos de 4 TiB y más grandes. Para más información sobre las clases de almacenamiento y la creación de la suya propia, consulte Opciones de almacenamiento de aplicaciones en AKS.

Puede ver las clases de almacenamiento creadas previamente con el comando kubectl get sc. El ejemplo siguiente, muestra las clases de almacenamiento creadas previamente disponibles dentro de un clúster de AKS:

kubectl get sc

La salida del comando es similar al ejemplo siguiente:

NAME                PROVISIONER                AGE
default (default)   disk.csi.azure.com         1h
managed-csi         disk.csi.azure.com         1h

Nota

Las notificaciones de volumen persistente se especifican en GiB, pero los discos administrados de Azure se facturan por SKU para un tamaño específico. Estas SKU varían de 32 GiB para discos S4 o P4 a 32 TiB para discos S80 o P80 (en versión preliminar). El rendimiento de transferencia de datos de red y el rendimiento IOPS de un disco administrado Premium depende de la SKU y del tamaño de instancia de los nodos en el clúster de AKS. Para obtener más información, consulte Precios de Managed Disks.

Creación de una notificación de volumen persistente

Una notificación de volumen persistente (PVC) aprovisiona automáticamente el almacenamiento en función de una clase de almacenamiento. En ese caso, una PVC puede usar una de las clases de almacenamiento creadas previamente para crear un disco administrado de Azure estándar o premium.

  1. Cree un archivo denominado azure-pvc.yaml y cópielo en el siguiente código manifiesto. La notificación solicita un disco llamado azure-managed-disk que tiene un tamaño de 5 GB con acceso ReadWriteOnce. La clase de almacenamiento managed-csise especifica como la clase de almacenamiento.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
        name: azure-managed-disk
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: managed-csi
      resources:
        requests:
          storage: 5Gi
    

Sugerencia

Para crear un disco que usa almacenamiento prémium, use storageClassName: managed-csi-premium en lugar de managed-csi.

  1. Cree la notificación del volumen persistente mediante el comando kubectl apply y especifique su archivo azure-pvc.yaml.

    kubectl apply -f azure-pvc.yaml
    

    La salida del comando es similar al ejemplo siguiente:

    persistentvolumeclaim/azure-managed-disk created
    

Uso del volumen persistente

Después de crear la notificación de volumen persistente, deberá comprobar que tenga un estado de Pending. El estado Pending indica que está listo para ser utilizado por un pod.

  1. Compruebe el estado de la PVC con el comando kubectl describe pvc.

    kubectl describe pvc azure-managed-disk
    

    La salida del comando es similar al ejemplo comprimido siguiente:

    Name:            azure-managed-disk
    Namespace:       default
    StorageClass:    managed-csi
    Status:          Pending
    [...]
    
  2. Cree un archivo denominado azure-pvc-disk.yaml y cópielo en el siguiente código manifiesto. El manifiesto crea un pod NGINX básico que utiliza la notificación de volumen persistente llamado azure-managed-disk para montar el disco de Azure en la ruta de acceso /mnt/azure. Para los contenedores de Windows Server, especifique un elemento mountPath con la convención de ruta de acceso de Windows, como "D:" .

    kind: Pod
    apiVersion: v1
    metadata:
      name: mypod
    spec:
      containers:
        - name: mypod
          image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi
          volumeMounts:
            - mountPath: "/mnt/azure"
              name: volume
              readOnly: false
      volumes:
        - name: volume
          persistentVolumeClaim:
            claimName: azure-managed-disk
    
  3. Cree el pod mediante el comando kubectl apply.

     kubectl apply -f azure-pvc-disk.yaml
    

    La salida del comando es similar al ejemplo siguiente:

    pod/mypod created
    
  4. Ahora tiene un pod en ejecución con el disco de Azure montado en el directorio /mnt/azure. Verifique la configuración del pod usando el comando kubectl describe.

     kubectl describe pod mypod
    

    La salida del comando es similar al ejemplo siguiente:

    [...]
    Volumes:
      volume:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  azure-managed-disk
        ReadOnly:   false
       default-token-smm2n:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-smm2n
        Optional:    false
    [...]
     Events:
      Type    Reason                 Age   From                               Message
      ----    ------                 ----  ----                               -------
      Normal  Scheduled              2m    default-scheduler                  Successfully assigned mypod to aks-nodepool1-79590246-0
      Normal  SuccessfulMountVolume  2m    kubelet, aks-nodepool1-79590246-0  MountVolume.SetUp succeeded for volume "default-token-smm2n"
      Normal  SuccessfulMountVolume  1m    kubelet, aks-nodepool1-79590246-0  MountVolume.SetUp succeeded for volume "pvc-faf0f176-8b8d-11e8-923b-deb28c58d242"
    [...]
    

Uso de discos Ultra de Azure

Para utilizar el almacenamiento en discos Ultra de Azure, consulte Uso de discos Ultra en Azure Kubernetes Service (AKS).

Uso de etiquetas de Azure

Para obtener más información sobre el uso de etiquetas de Azure, consulte Uso de etiquetas de Azure en Azure Kubernetes Service (AKS).

Aprovisionar un volumen estáticamente

En esta sección se proporcionan instrucciones para los administradores de clústeres que desean crear uno o varios volúmenes persistentes que incluyen detalles de Azure Disks Storage para que lo use una carga de trabajo.

Parámetros de aprovisionamiento estáticos para PersistentVolume

En la siguiente tabla se incluyen parámetros que se pueden usar para definir PersistentVolume.

Nombre Significado Valor disponible Mandatory Valor predeterminado
volumeHandle URI de disco de Azure /subscriptions/{sub-id}/resourcegroups/{group-name}/providers/microsoft.compute/disks/{disk-id} N/D
volumeAttributes.fsType Tipo de sistema de archivos ext4, ext3, ext2, xfs, btrfs para Linux, ntfs para Windows No ext4 para Linux, ntfs para Windows
volumeAttributes.partition Número de partición del disco existente (solo se admite en Linux) 1, 2, 3 No Vacío (sin partición):
asegúrese de que el formato de partición es similar a -part1
volumeAttributes.cachingMode Configuración de caché del host de disco None, ReadOnly, ReadWrite No ReadOnly

Creación de un disco de Azure

Cuando crea un disco de Azure para usarlo con AKS, puede crear el recurso de disco en el grupo de recursos del nodo. Este enfoque permite que el clúster AKS acceda y administre el recurso de disco. Si en cambio crea el disco en un grupo de recursos distinto, debe conceder a la identidad administrada de Azure Kubernetes Service (AKS) del clúster el rol Contributor en el grupo de recursos del disco.

  1. Identifique el nombre del grupo de recursos con el comando az aks show y agregue el parámetro de consulta --query nodeResourceGroup.

    az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
    
    # Output
    MC_myResourceGroup_myAKSCluster_eastus
    
  2. Cree un disco mediante el comando az disk create. Especifique el nombre del grupo de recursos del nodo y un nombre para el recurso de disco, como miDiscoAKS. En el ejemplo siguiente, se crea un disco de 20 GiB y se obtiene como salida el identificador del disco una vez creado. Si tiene que crear un disco para su uso con contenedores de Windows Server, agregue el parámetro --os-type windows para formatear correctamente el disco.

    az disk create \
      --resource-group MC_myResourceGroup_myAKSCluster_eastus \
      --name myAKSDisk \
      --size-gb 20 \
      --query id --output tsv
    

    Nota

    Azure Disks se factura por SKU de un tamaño específico. Estas SKU varían de 32 GiB para discos S4 o P4 a 32 TiB para discos S80 o P80 (en versión preliminar). El rendimiento de transferencia de datos de red y el rendimiento IOPS de un disco administrado Premium depende de la SKU y del tamaño de instancia de los nodos en el clúster de AKS. Consulte Precios y rendimiento de Managed Disks.

    El identificador de recurso de disco se muestra una vez que se ha completado correctamente el comando, como se muestra en la siguiente salida de ejemplo. Use el identificador de disco para montar el disco en el paso siguiente.

    /subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk
    

Montaje del disco como un volumen

  1. Cree un archivo pv-azuredisk.yaml con un elemento PersistentVolume. Actualice volumeHandle con el identificador de recurso de disco del paso anterior. Para los contenedores de Windows Server, especifique ntfs para el parámetro fsType.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/provisioned-by: disk.csi.azure.com
      name: pv-azuredisk
    spec:
      capacity:
        storage: 20Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      storageClassName: managed-csi
      csi:
        driver: disk.csi.azure.com
        volumeHandle: /subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk
        volumeAttributes:
          fsType: ext4
    
  2. Cree un archivo pvc-azuredisk.yaml con un elemento PersistentVolumeClaim que utilice el elemento PersistentVolume.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-azuredisk
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      volumeName: pv-azuredisk
      storageClassName: managed-csi
    
  3. Cree PersistentVolume y PersistentVolumeClaim con el comando kubectl apply y haga referencia a los dos archivos YAML que creó.

    kubectl apply -f pv-azuredisk.yaml
    kubectl apply -f pvc-azuredisk.yaml
    
  4. Compruebe que PersistentVolumeClaim se creó y enlazó a PersistentVolume con el comando kubectl get pvc.

    kubectl get pvc pvc-azuredisk
    

    La salida del comando es similar al ejemplo siguiente:

    NAME            STATUS   VOLUME         CAPACITY    ACCESS MODES   STORAGECLASS   AGE
    pvc-azuredisk   Bound    pv-azuredisk   20Gi        RWO                           5s
    
  5. Cree un archivo azure-disk-pod.yaml para hacer referencia al elemento PersistentVolumeClaim. Para los contenedores de Windows Server, especifique un elemento mountPath con la convención de ruta de acceso de Windows, como "D:" .

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
      - image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
        name: mypod
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 250m
            memory: 256Mi
        volumeMounts:
          - name: azure
            mountPath: /mnt/azure
      volumes:
        - name: azure
          persistentVolumeClaim:
            claimName: pvc-azuredisk
    
  6. Aplique la configuración y monte el volumen mediante el comando kubectl apply.

    kubectl apply -f azure-disk-pod.yaml
    

Limpieza de recursos

Cuando haya terminado con los recursos creados en este artículo, puede quitarlos mediante el comando kubectl delete.

# Remove the pod
kubectl delete -f azure-pvc-disk.yaml

# Remove the persistent volume claim
kubectl delete -f azure-pvc.yaml

Pasos siguientes