Usa StorageClass con tus cargas de trabajo

GKE en AWS implementa automáticamente Container Storage Interface (CSI) para 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 en el momento en que se lanza una versión de GKE. Cuando se actualiza el clúster, los controladores se actualizan de forma automática.

Usa la StorageClass predeterminada

La creación de un PersistentVolumeClaim sin el campo spec.storageClassName aprovisiona un volumen de volúmenes de uso general SSD (gp2) con la StorageClass predeterminada del controlador de CSI de EBS de GKE on AWS.

El siguiente YAML crea una PersistentVolumeClaim (PVC) llamada mypvc con un tamaño de 30 gibibytes.

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

Usa una StorageClass preinstalada diferente

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

Puedes usarlo si lo especificas en el spec.storageClassName de la PVC.

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

Usa una StorageClass personalizada

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

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

    Volumen de EBS

    En esta pestaña, se describe cómo crear tu propia StorageClass personalizada que especifica 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
    

    Reemplaza CLASS_NAME por el nombre de tu StorageClass nueva.

    Por ejemplo, el siguiente YAML crea una nueva StorageClass que aprovisiona volúmenes de EBS de HDD con capacidad de procesamiento optimizada 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 personalizada

    En esta pestaña, se describe cómo crear una StorageClass personalizada para el aprovisionador del controlador CSI de EFS. Consulta Usa un recurso de EFS para obtener una lista de los requisitos previos para este StorageClass. En la página del controlador de CSI de EFS, se enumeran parámetros adicionales de StorageClass, además de los que se indican en el siguiente manifiesto.

    Copia el siguiente 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"
    

    Reemplaza lo siguiente:

    • EFS_STORAGE_CLASS_NAME por el nombre de StorageClass.
    • EFS_ID por el ID del sistema de archivos EFS, por ejemplo, fs-12345678a.

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

    Reemplaza lo siguiente:

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

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

  2. Aplica el YAML a tu clúster.

    kubectl apply -f my-custom-class.yaml
    

Crea un PersistentVolumeClaim con una StorageClass personalizada

  1. Una vez que se crea una StorageClass personalizada, puedes especificarla en una PVC. En el siguiente ejemplo, se crea una PVC llamada my-pvc que hace referencia a la StorageClass my-custom-class.

    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 AWS usa una StorageClass predeterminada llamada standard-rwo que aprovisiona volúmenes de EBS gp2. 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 ebs.csi.aws.com. Para instalar otro controlador de almacenamiento, consulta Instala controladores de CSI adicionales.

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

    Reemplaza lo siguiente:

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

    Por ejemplo, el siguiente YAML crea una nueva StorageClass predeterminada que aprovisiona volúmenes de 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 en AWS 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, debes 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?