Usar StorageClasses con tus cargas de trabajo

GKE on AWS despliega automáticamente la interfaz de almacenamiento de contenedores (CSI) Amazon Elastic Block Store (EBS) y Amazon Elastic File Store (EFS).

Las versiones del controlador de CSI de EBS y del controlador de CSI de EFS están vinculadas a una versión de Kubernetes de GKE en AWS. 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 la clase de almacenamiento predeterminada

Si creas un PersistentVolumeClaim sin el campo spec.storageClassName, se aprovisiona un volumen de SSD de uso general (gp2) con la StorageClass predeterminada del controlador CSI de EBS de GKE en AWS.

El siguiente archivo YAML crea una reclamación de volumen persistente (PVC) llamada mypvc con un tamaño de 30 gibibytes.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi

Usar un StorageClass preinstalado diferente

El controlador de CSI de EBS de GKE en AWS también incluye la premium-rwo StorageClass, que aprovisiona volúmenes de SSD con IOPS aprovisionados (io1) con un mayor rendimiento.

Para usarlo, especifícalo en el spec.storageClassName del PVC.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi
  storageClassName: premium-rwo

Usar un StorageClass personalizado

Si ni la clase de almacenamiento predeterminada ni la premium-rwo StorageClass se ajustan a tus necesidades, puedes crear StorageClasses adicionales para volúmenes de EBS o usar controladores de interfaz de almacenamiento de contenedores (CSI).

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

    Volumen de EBS

    En esta pestaña se describe cómo crear tu propia StorageClass personalizada que especifique un tipo de volumen de EBS, 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 EBS de GKE en AWS.

    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: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    

    Sustituye CLASS_NAME por el nombre de tu nuevo StorageClass.

    Por ejemplo, el siguiente archivo YAML crea una StorageClass que aprovisiona volúmenes de EBS HDD optimizado para el rendimiento formateados con el sistema de archivos XFS.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: my-custom-class
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      csi.storage.k8s.io/fsType: xfs
      type: st1
    

    StorageClass de EFS personalizado

    En esta pestaña se describe cómo crear un StorageClass personalizado para el aprovisionador del controlador CSI de EFS. Consulta la sección Usar un recurso de EFS para ver una lista de los requisitos previos de esta StorageClass. En la página del controlador CSI de EFS se enumeran parámetros de StorageClass adicionales a los que se incluyen en el siguiente manifiesto.

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

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: <var>EFS_STORAGE_CLASS_NAME</var>
    provisioner: efs.csi.aws.com
    mountOptions:
      - tls
    parameters:
      provisioningMode: efs-ap
      fileSystemId: EFS_ID
      directoryPerms: "700"
    

    Sustituye:

    • EFS_STORAGE_CLASS_NAME con el nombre de StorageClass.
    • EFS_ID con el ID de tu sistema de archivos EFS (por ejemplo, fs-12345678a).

    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
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      ...
    

    Haz los cambios siguientes:

    • CSI_DRIVER_NAME con el nombre del controlador de CSI. Por ejemplo,csi.example.com
    • CLASS_NAME con el nombre de StorageClass. Por ejemplo, my-custom-class

    Configura los subcampos de parameters según tu controlador de CSI.

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

    kubectl apply -f my-custom-class.yaml
    

Crear un PersistentVolumeClaim con un StorageClass personalizado

  1. Una vez que se haya creado un StorageClass personalizado, puedes especificarlo en un PVC. En el ejemplo siguiente 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 on AWS usa una StorageClass predeterminada llamada standard-rwo que aprovisiona volúmenes de EBS gp2. 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 ebs.csi.aws.com. Para instalar otro controlador de almacenamiento, consulta Instalar otros controladores 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: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      type: EBS_VOLUME_TYPE
    

    Haz los cambios siguientes:

    • EBS_VOLUME_TYPE: el tipo de volumen de EBS de AWS que crea StorageClass.
    • CLASS_NAME con el nombre de tu nuevo StorageClass

    Por ejemplo, el siguiente archivo YAML crea una clase de almacenamiento predeterminada que aprovisiona volúmenes SSD de uso general (gp3).

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

    kubectl apply -f my-custom-class.yaml
    

Después de aplicar este manifiesto, GKE on AWS 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, debes 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