Usa una StorageClass personalizada con tus cargas de trabajo

Para definir comportamientos de almacenamiento específicos para tus cargas de trabajo alojadas en contenedores en Google Kubernetes Engine (GKE) en Azure, crea y usa StorageClasses personalizadas. Si personalizas StorageClasses, puedes optimizar el rendimiento y el costo del almacenamiento para tus aplicaciones seleccionando diferentes tipos de discos de Azure, tipos de sistemas de archivos y otros parámetros para tus PersistentVolumes. Esta capacidad te ayuda a ejecutar servicios eficientes, ya que adapta el almacenamiento a las necesidades exactas de tu carga de trabajo.

GKE en Azure implementa y administra automáticamente el controlador de CSI de Azure Disk y el controlador de CSI de Azure File, que son esenciales para controlar el aprovisionamiento de almacenamiento. Las versiones de estos controladores están vinculadas a tu versión de Kubernetes de GKE en Azure y se actualizan automáticamente con las actualizaciones del clúster, lo que garantiza una compatibilidad perfecta para tus StorageClasses personalizadas.

Usa una StorageClass personalizada

Puedes crear StorageClasses adicionales para volúmenes o usar controladores de la interfaz de almacenamiento de contenedores (CSI).

  1. Elige si usas un volumen de disco de Azure o algún otro controlador de CSI.

    Volumen de disco de Azure

    Puedes crear tu propia StorageClass personalizada que especifique un tipo de volumen de Azure Disk, un tipo de sistema de archivos y otros parámetros. Puedes encontrar parámetros adicionales de StorageClass en la página de GitHub del controlador de CSI de Azure Disk de GKE en Azure.

    Para configurar una StorageClass personalizada, copia el siguiente manifiesto YAML en un archivo llamado my-custom-class.yaml.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
     name: CLASS_NAME
    provisioner: disk.csi.azure.com
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    

    Reemplaza CLASS_NAME por el nombre de tu StorageClass nueva.

    Por ejemplo, el siguiente YAML crea una nueva StorageClass que aprovisiona volúmenes en una cuenta de almacenamiento específica y aplica una etiqueta de group=dev a cada volumen nuevo.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
     name: my-custom-class
    provisioner: disk.csi.azure.com
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    parameters:
     storageAccount: my-storage-account
     tags: group=dev
    

    Controlador de CSI

    Puedes especificar un controlador de CSI diferente en el campo provisioner.

    Para crear una StorageClass con otro controlador de CSI, puedes usar el siguiente ejemplo de YAML.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
     name: CLASS_NAME
    provisioner: CSI_DRIVER_NAME
    volumeBindingMode: WaitForFirstConsumer
    parameters:
     ...
    

    Reemplaza los siguientes valores:

    • CLASS_NAME: es el nombre de la StorageClass (por ejemplo, my-custom-class).
    • CSI_DRIVER_NAME: es el nombre del controlador de CSI (por ejemplo, csi.example.com).

    Luego, configura los subcampos en parameters según la documentación del controlador de CSI.

  2. Aplica el YAML a tu clúster.

    kubectl apply -f my-custom-class.yaml
    
  3. Crea un PersistentVolumeClaim con un StorageClass personalizado

    Después de crear una StorageClass personalizada, puedes especificarla en una PVC. En el siguiente ejemplo, se crea una PVC llamada my-pvc que hace referencia a my-custom-class de StorageClass.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
     name: my-pvc
    spec:
     accessModes:
      - ReadWriteOnce
     resources:
      requests:
       storage: 30Gi
     storageclassName: my-custom-class
    

Configura la StorageClass predeterminada

GKE en Azure usa una StorageClass predeterminada llamada standard-rwo que aprovisiona discos SSD estándar de Azure con LRS. Puedes cambiar la StorageClass predeterminada a otra.

Para cambiar la StorageClass predeterminada, haz lo siguiente:

  1. Actualiza la anotación is-default-class para la StorageClass standard-rwo con kubectl patch.

    kubectl patch storageclass standard-rwo -p \
     '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
    
  2. Crea una StorageClass nueva que tenga la anotación storageclass.kubernetes.io/is-default-class: true.

    En el siguiente ejemplo de StorageClass, se usa el controlador disk.csi.azure.com. Para instalar otro controlador de almacenamiento, consulta Instala un controlador CSI.

    Copia el siguiente YAML en un archivo llamado my-custom-class.yaml.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
     name: CLASS_NAME
     annotations:
      storageclass.kubernetes.io/is-default-class: true
    provisioner: disk.csi.azure.com
    volumeBindingMode: WaitForFirstConsumer
    parameters:
     skuName: VOLUME_TYPE
    

    Reemplaza lo siguiente:

    • CLASS_NAME: Es el nombre de tu StorageClass nueva.
    • VOLUME_TYPE: el tipo de volumen de Azure Disk que crea la StorageClass.

    Por ejemplo, el siguiente YAML crea una nueva StorageClass predeterminada que aprovisiona volúmenes de Premium SSD de Azure Disk.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
     name: my-custom-default-class
     annotations:
      storageclass.kubernetes.io/is-default-class: "true"
    provisioner: disk.csi.azure.com
    volumeBindingMode: WaitForFirstConsumer
    parameters:
     skuName: Premium_LRS
    
  3. Aplica la nueva clase personalizada a tu clúster.

    kubectl apply -f my-custom-class.yaml
    

Después de aplicar este manifiesto, GKE en Azure usa la StorageClass my-custom-default-class para las solicitudes de almacenamiento nuevas.

Haz referencia al StorageClass en un StatefulSet

Para usar la StorageClass nueva, puedes hacer referencia a ella en un volumeClaimTemplates de StatefulSet.

Cuando haces referencia a la StorageClass en la especificación volumeClaimTemplates de StatefulSet, Kubernetes proporciona almacenamiento estable mediante PersistentVolumes (PV). Kubernetes llama al aprovisionador definido en la StorageClass para crear un volumen de almacenamiento nuevo. Una vez que se aprovisiona el volumen, Kubernetes crea un PV de forma automática.

El siguiente StatefulSet hace referencia a la StorageClass my-custom-class y aprovisiona un volumen de 1 gibibyte:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates: # This is the specification in which you reference the StorageClass
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
      storageClassName: my-custom-class # This field references the existing StorageClass

¿Qué sigue?