Usar un StorageClass personalizado con tus cargas de trabajo

GKE en Azure despliega automáticamente los controladores de CSI para Azure Disk y Azure File.

Las versiones del controlador de CSI de Azure Disk y del controlador de CSI de Azure File están vinculadas a una versión de Kubernetes de GKE en Azure. La versión del controlador suele ser la más reciente disponible cuando se lanza una versión de GKE. Cuando se actualiza el clúster, los controladores se actualizan automáticamente.

Usar un StorageClass personalizado

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

  1. Elige si vas a usar un volumen de disco de Azure u otro controlador de CSI.

    Volumen de disco de Azure

    Puede crear su propia StorageClass personalizada que especifique un tipo de volumen de disco de Azure, 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
    

    Sustituye CLASS_NAME por el nombre de tu nuevo StorageClass.

    Por ejemplo, el siguiente archivo YAML crea una 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 CSI

    Puedes especificar otro controlador CSI en el campo provisioner.

    Para crear un StorageClass con otro controlador CSI, puedes usar el ejemplo de YAML que se muestra a continuación.

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

    Sustituye los siguientes valores:

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

    A continuación, configura los subcampos de parameters según la documentación de tu controlador CSI.

  2. Aplica el archivo YAML a tu clúster.

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

    Después de crear un StorageClass personalizado, puede especificarlo en un PVC. En el siguiente ejemplo se crea un PVC llamado my-pvc que hace referencia a StorageClass my-custom-class.

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

Definir la clase de almacenamiento predeterminada

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

Para cambiar la clase de almacenamiento predeterminada, sigue estos pasos:

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

    kubectl patch storageclass standard-rwo -p \
      '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
    
  2. Crea un StorageClass 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 Instalar un controlador de CSI.

    Copia el siguiente código 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
    

    Haz los cambios siguientes:

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

    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 my-custom-default-class StorageClass para las nuevas solicitudes de almacenamiento.

Hacer referencia a StorageClass en un StatefulSet

Para usar tu nuevo StorageClass, puedes hacer referencia a él en el volumeClaimTemplates de un StatefulSet.

Cuando haces referencia a una StorageClass en la volumeClaimTemplatesespecificación de un StatefulSet, Kubernetes proporciona almacenamiento estable mediante PersistentVolumes (PVs). Kubernetes llama al aprovisionador definido en StorageClass para crear un nuevo volumen de almacenamiento. Una vez aprovisionado el volumen, Kubernetes crea automáticamente un PV.

El siguiente StatefulSet hace referencia a my-custom-class StorageClass y proporciona 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

Siguientes pasos