Usar StorageClasses con tus cargas de trabajo

GKE en AWS despliega automáticamente el controlador de interfaz de almacenamiento de contenedores (CSI) para Amazon Elastic Block Store (EBS) para aprovisionar y gestionar volúmenes de Amazon EBS en tus clústeres.

La versión del controlador de CSI de EBS de GKE on AWS está vinculada a una versión de Kubernetes de GKE on AWS. La versión del controlador suele ser la más reciente disponible cuando se lanza la versión de GKE. Cuando se actualiza el clúster, los controladores se actualizan automáticamente.

Cómo usar la clase de almacenamiento predeterminada

Si se crea un PersistentVolumeClaim sin definir el campo spec.storageClassName, se aprovisiona un gp2 volumen 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

Cómo usar otro StorageClass preinstalado

El controlador de CSI de EBS de GKE en AWS también incluye la premium-rwo StorageClass, que aprovisiona io1volúmenes 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

Cómo usar un StorageClass personalizado

Puede 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 o un controlador de CSI específico.

    Volumen de EBS

    Puedes 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
    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
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      csi.storage.k8s.io/fsType: xfs
      type: st1
    

    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:
      ...
    

    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
    

Cómo 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
    

Cómo 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 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: ebs.csi.aws.com
    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 StorageClass predeterminada 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-default-class
      annotations:
        storageclass.kubernetes.io/is-default-class: "true"
    provisioner: ebs.csi.aws.com
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      csi.storage.k8s.io/fsType: xfs
      type: st1
    
  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