Utilice StorageClasses con sus cargas de trabajo

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

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

Utilice la clase de almacenamiento predeterminada

La creación de un PersistentVolumeClaim sin el campo spec.storageClassName aprovisiona un volumen SSD de propósito general (gp2) utilizando el GKE predeterminado en el controlador CSI StorageClass de AWS EBS.

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

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

Utilice una clase de almacenamiento preinstalada diferente

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

Puede usarlo especificándolo en spec.storageClassName del PVC.

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

Utilice una StorageClass personalizada

Si ni la clase de almacenamiento predeterminada ni la premium-rwo satisfacen sus necesidades, puede crear clases de almacenamiento adicionales para volúmenes EBS o usar controladores de interfaz de almacenamiento de contenedores (CSI).

  1. Elija si está utilizando un volumen EBS u otro controlador CSI.

    Volumen EBS

    Esta pestaña describe cómo crear su propia StorageClass personalizada que especifica un tipo de volumen EBS, un tipo de sistema de archivos y otros parámetros. Puede encontrar parámetros adicionales de StorageClass en la página de GitHub del controlador CSI de GKE en AWS EBS .

    Para configurar una StorageClass personalizada, copie 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
    

    Reemplace CLASS_NAME con el nombre de su nueva StorageClass.

    Por ejemplo, el siguiente YAML crea una nueva StorageClass que aprovisiona volúmenes HDD EBS optimizados para 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
    

    Clase de almacenamiento EFS personalizada

    Esta pestaña describe cómo crear una StorageClass personalizada para el aprovisionador del controlador CSI de EFS. Consulte "Usar un recurso de EFS" para obtener una lista de los requisitos previos de esta StorageClass. La página Controlador CSI de EFS incluye parámetros adicionales de StorageClass, además de los del siguiente manifiesto.

    Copie 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"
    

    Reemplazar:

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

    Conductor de CSI

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

    Para crear una StorageClass con otro controlador CSI, puede utilizar el ejemplo YAML a continuación.

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

    Reemplace lo siguiente:

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

    Configure los subcampos en parameters de acuerdo con su controlador CSI.

  2. Aplique el YAML a su clúster.

    kubectl apply -f my-custom-class.yaml
    

Cree un PersistentVolumeClaim con una StorageClass personalizada

  1. Una vez creada una StorageClass personalizada, puede especificarla en una PVC. El siguiente ejemplo 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
    

Establecer la clase de almacenamiento predeterminada

GKE en AWS usa una StorageClass predeterminada llamada standard-rwo que aprovisiona volúmenes EBS gp2 . Puedes cambiar la StorageClass predeterminada a otra.

Para cambiar la clase de almacenamiento predeterminada:

  1. Actualice 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. Cree una nueva StorageClass que tenga la anotación storageclass.kubernetes.io/is-default-class: true .

    El siguiente ejemplo de StorageClass utiliza el controlador ebs.csi.aws.com . Para instalar otro controlador de almacenamiento, consulte Instalar controladores CSI adicionales .

    Copie 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
    

    Reemplace lo siguiente:

    Por ejemplo, el siguiente YAML crea una nueva StorageClass predeterminada que aprovisiona volúmenes SSD de propósito 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. Aplique la nueva clase personalizada a su clúster.

    kubectl apply -f my-custom-class.yaml
    

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

Hacer referencia a StorageClass en un StatefulSet

Para utilizar su nueva StorageClass, debe hacer referencia a ella en un volumeClaimTemplates de StatefulSet.

Al hacer referencia a una StorageClass en la especificación volumeClaimTemplates de un StatefulSet, Kubernetes proporciona almacenamiento estable mediante PersistentVolumes (PV). Kubernetes llama al aprovisionador definido en la 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 la my-custom-class StorageClass 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?