Aprovisiona un volumen persistente con EFS

En esta página, se describe cómo configurar un modelo de PersistentVolume para usar en GKE en AWS con el controlador CSI de EFS. El Elastic File System (EFS) es el mecanismo subyacente de AWS que proporciona sistemas de archivos de red a tu clúster. Un PersistentVolume basado en EFS es un recurso de clúster que hace que el almacenamiento esté disponible para tus cargas de trabajo a través de un punto de acceso de EFS y garantiza que el almacenamiento persista incluso cuando no haya cargas de trabajo conectadas a él.

GKE en AWS admite el aprovisionamiento estático y dinámico de PersistentVolumes. El aprovisionamiento dinámico usa una configuración un poco diferente, pero luego requiere menos esfuerzo administrativo.

Antes de comenzar

Para realizar los pasos de esta página, primero completa lo siguiente:

Descripción general del aprovisionamiento estático

Crear un Elastic File System (EFS) y hacer que esté disponible para las cargas de trabajo en tu clúster a través del aprovisionamiento estático tiene cuatro pasos:

  • Crea tu recurso de EFS
  • Configurar la red
  • Crea un destino de activación
  • Crea una PersistentVolume

El último paso es la carga de trabajo: para solicitar el almacenamiento continuo mediante la emisión de una PersistentVolumeClaim.

Descripción general del aprovisionamiento dinámico

Crear un recurso de EFS y hacer que esté disponible a través del aprovisionamiento dinámico también tiene cuatro pasos:

  • Crea tu recurso de EFS
  • Configurar la red
  • Crea un destino de activación
  • Crea una StorageClass

Crear la StorageClass es una operación que se ejecuta una sola vez. Una vez que se define una clase de almacenamiento con características determinadas, la carga de trabajo puede emitir una PersistentVolumeClaim o una solicitud de almacenamiento continuo. Todas las PersistentVolumeClaims para el almacenamiento con esas características pueden solicitar el mismo StorageClass.

Pasos comunes

Ya sea que uses el aprovisionamiento estático o dinámico en tu clúster, debes comenzar con los pasos de configuración que se enumeran aquí y, luego, continuar con los pasos de aprovisionamiento estático o dinámico según corresponda. Una vez que hayas creado tu EFS y lo hayas hecho accesible, la carga de trabajo debe tomar los pasos finales para acceder a ella. Los pasos para hacerlo se describen en Usa el almacenamiento de EFS.

Crea un recurso de EFS de AWS

Se requiere un recurso EFS ya sea que uses el aprovisionamiento estático o dinámico. Si tu clúster usa ambos, puedes crear recursos de EFS separados para ellos o usar el mismo para ambos. Consulta Crea sistemas de archivos EFS de Amazon para obtener más información sobre cómo crear un recurso de EFS.

También puedes volver a usar un EFS existente, en cuyo caso puedes omitir esta sección y continuar con Crea objetivos de activación.

  1. Obtén la región de AWS en la que se ejecuta tu clúster.

    gcloud container aws clusters describe CLUSTER_NAME \
      --location=LOCATION \
      --format="value(awsRegion)"
    

    Reemplaza lo siguiente:

    • CLUSTER_NAME: es el nombre del clúster de AWS.
    • LOCATION: es la ubicación de Google Cloud del clúster de AWS
  2. Crea un sistema de archivos EFS en la misma región de AWS con el siguiente comando.

    aws efs create-file-system \
      --region AWS_REGION \
      --performance-mode generalPurpose \
      --query 'FileSystemId' \
      --output text
    

    Reemplaza lo siguiente:

    • AWS_REGION: es la región de AWS en la que se ejecuta el clúster

El resultado incluye el ID del sistema de archivos. Guarda este valor. Lo necesitarás más tarde.

Crea objetivos de activación

El controlador de CSI para EFS accede a los sistemas de archivos a través de destinos de activación de EFS. Un destino de activación es una dirección IP privada que usa grupos de seguridad de AWS para controlar el acceso al EFS subyacente.

Si los grupos de nodos de tu clúster se ejecutan en subredes diferentes, debes crear un destino de activación separado en cada subred de grupo de nodos.

En este ejemplo, un grupo de seguridad único que incluye los destinos de activación y las máquinas del grupo de nodos protege el acceso a cada destino de activación. Según la configuración de VPC y los requisitos de seguridad, puedes dividir esta configuración en dos (o más) grupos de seguridad; por ejemplo, uno para los destinos de activación y otro para los nodos trabajadores del grupo de nodos.

  1. Crea un grupo de seguridad dedicado para controlar el acceso al EFS

    Obtén el ID de la VPC de AWS en la que se ejecuta el clúster.

    gcloud container aws clusters describe CLUSTER_NAME \
      --location=LOCATION \
      --format="value(networking.vpcId)"
    

    Reemplaza lo siguiente:

    • CLUSTER_NAME
    • LOCATION

    El resultado incluye el ID de tu VPC. Guarda este valor. Lo necesitarás más tarde.

  2. Crea un grupo de seguridad para controlar el acceso a tu destino de activación de EFS.

    aws ec2 create-security-group \
      --group-name gke-efs-security-group \
      --description "EFS security group" \
      --vpc-id VPC_ID \
      --output text
    

    Reemplaza VPC_ID por el ID de la VPC de AWS en la que se ejecuta el clúster.

    El resultado incluye el ID del grupo de seguridad nuevo. Guarda este valor. Lo necesitarás más tarde.

  3. De forma predeterminada, AWS crea grupos de seguridad con una regla predeterminada que permite todo el tráfico saliente. Quita la regla de salida predeterminada.

    aws ec2 revoke-security-group-egress \
      --group-id SECURITY_GROUP_ID
      --ip-permissions '[{"IpProtocol":"-1","FromPort":-1,"ToPort":-1,"IpRanges":[{"CidrIp":"0.0.0.0/0"}]}]'
    

    Reemplaza SECURITY_GROUP_ID por el ID del grupo de seguridad de AWS.

  4. Autoriza el tráfico de entrada y salida de EFS (puerto 2049).

    aws ec2 authorize-security-group-ingress \
        --group-id SECURITY_GROUP_ID \
        --protocol tcp \
        --port 2049 \
        --source-group SECURITY_GROUP_ID
    
    aws ec2 authorize-security-group-egress \
        --group-id SECURITY_GROUP_ID \
        --protocol tcp \
        --port 2049 \
        --source-group SECURITY_GROUP_ID
    
  5. Crea un destino de activación de EFS en cada subred del grupo de nodos.

    Enumera las subredes asociadas con todos los grupos de nodos.

    gcloud container aws node-pools list \
      --cluster=CLUSTER_NAME \
      --location=LOCATION \
      --format="value(subnetId)"
    

    Reemplaza lo siguiente:

    • CLUSTER_NAME
    • LOCATION

    El resultado es una lista de ID de subredes. Guarda este valor. Lo necesitarás más tarde.

  6. Por cada subred, crea un objetivo de activación de EFS asociado con el grupo de seguridad aplicado.

    aws efs create-mount-target \
        --file-system-id EFS_ID \
        --subnet-id SUBNET_ID \
        --security-groups SECURITY_GROUP_ID
    

    Reemplaza lo siguiente:

    • EFS_ID: es el ID del recurso de EFS.
    • SUBNET_ID: es el ID de la subred del grupo de nodos.
    • SECURITY_GROUP_ID
  7. Agrega el grupo de seguridad de EFS a todos los grupos de nodos del clúster.

    Obtén la lista de todos tus grupos de nodos.

    gcloud container aws node-pools list \
      --cluster=CLUSTER_NAME \
      --location=LOCATION
    

    Reemplaza lo siguiente:

    • CLUSTER_NAME
    • LOCATION

    El resultado incluye los nombres de los grupos de nodos del clúster. Guarda este valor. Lo necesitarás más tarde.

  8. Actualiza cada grupo de nodos para que incluya el grupo de seguridad EFS nuevo.

    gcloud container aws node-pools update NODE_POOL_NAME \
      --cluster=CLUSTER_NAME \
      --location=LOCATION  \
      --security-group-ids=SECURITY_GROUP_IDS
    

    Reemplaza lo siguiente:

    • NODE_POOL_NAME: el nombre del grupo de nodos
    • CLUSTER_NAME: El nombre de tu clúster.
    • LOCATION
    • SECURITY_GROUP_IDS es la lista de los ID de los grupos de seguridad para los nodos trabajadores.

Crea un PersistentVolume (estático) o una StorageClass (dinámica)

Si usas aprovisionamiento estático, el siguiente paso es crear un PersistentVolume. Si usas aprovisionamiento dinámico, el controlador EFS lo hace por ti. en su lugar, defines una StorageClass para que las cargas de trabajo especifiquen en su PersistentVolumeClaim. Elige la pestaña que coincide con tu método de aprovisionamiento elegido.

Aprovisionamiento estático

Si usas el aprovisionamiento estático, el siguiente paso es crear un PersistentVolume que active un recurso compartido de EFS.

  1. Elige la pestaña adecuada según si te conectas directamente al recurso compartido de EFS o a través de un punto de acceso.

    Conexión directa

    Copia el siguiente YAML en un archivo llamado efs-volume.yaml. El manifiesto hace referencia a la clase de almacenamiento de EFS que creaste antes.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: VOLUME_NAME
    spec:
      capacity:
        # Note: storage capacity is not used by the EFS CSI driver.
        # It is required by the PersistentVolume spec.
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      storageClassName: "" # storageClassName is not required, see note in the following section.
      claimRef:
        name: CLAIM_NAME
        namespace: default
      csi:
        driver: efs.csi.aws.com
        volumeHandle: EFS_ID
    

    Reemplaza lo siguiente:

    • VOLUME_NAME con un nombre para el volumen persistente.
    • CLAIM_NAME con el nombre que deseas usar para la PersistentVolumeClaim.
    • EFS_ID con tu ID de recurso de EFS. Por ejemplo, fs-12345678a.

    Punto de acceso

    Para crear un volumen basado en puntos de acceso, debes aprovisionarlo de forma manual. Consulta Trabaja con puntos de acceso de EFS para obtener más información.

    Copia el siguiente YAML en un archivo llamado efs-volume.yaml. El manifiesto hace referencia a la clase de almacenamiento de EFS que creaste antes.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: VOLUME_NAME
    spec:
      capacity:
        # Note: storage capacity is not used by the EFS CSI driver.
        # It is required by the PersistentVolume spec.
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      # Set storageClassName to empty string for static provisioning. See [Use an EFS resource](/kubernetes-engine/multi-cloud/docs/aws/how-to/use-efs)
      storageClassName: ""
      claimRef:
        name: CLAIM_NAME
        namespace: default
      csi:
        driver: efs.csi.aws.com
        volumeHandle: EFS_ID::ACCESS_POINT_ID
    

    Reemplaza lo siguiente:

    • VOLUME_NAME con un nombre para el volumen persistente.
    • CLAIM_NAME con el nombre que deseas usar para la PersistentVolumeClaim.
    • EFS_ID con tu ID de recurso de EFS. Por ejemplo, fs-12345678a.
    • ACCESS_POINT_ID con el ID de tu punto de acceso. Por ejemplo, fsap-1234567890abcde
  2. Aplica el YAML a tu clúster.

    kubectl apply -f efs-volume.yaml
    

    El resultado confirma la creación de PersistentVolume.

    persistentvolume/VOLUME_NAME created
    
    

Aprovisionamiento dinámico

En esta sección, se describe cómo crear una StorageClass que haga referencia al recurso EFS que creaste antes. Una vez hecho esto, los desarrolladores pueden acceder al recurso de EFM si siguen los pasos descritos en Usa un recurso de EFS.

  1. Crea una StorageClass que haga referencia al ID de recurso de EFS.

    Copia el siguiente fragmento de yaml en un archivo nuevo llamado efs-storage-class.yaml. Para obtener más información sobre cómo ajustar las características de StorageClass que se describen en este archivo, consulta la documentación sobre los parámetros de StorageClass de EFM.

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

    Reemplaza lo siguiente:

    • EFS_STORAGE_CLASS_NAME con el nombre que elegiste para la StorageClass.
    • EFS_ID por el ID de recurso de EFS, por ejemplo, fs-12345678a.
  2. Aplica el YAML a tu clúster.

    kubectl apply -f efs-storage-class.yaml
    

    Si se ejecuta de forma correcta, el resultado de este comando contendrá una línea similar a la siguiente:

    storageclass/EFS_STORAGE_CLASS_NAME created

Realiza una limpieza

Para quitar los recursos que creaste en las secciones anteriores, ejecuta los siguientes comandos:

  1. Usa kubectl para quitar el recurso de la reclamación de EFS de tu clúster:

    kubectl delete -f efs-claim.yaml
    
  2. Si usas el aprovisionamiento estático, usa kubectl para quitar los recursos asociados del clúster:

    kubectl delete -f efs-volume.yaml
    
  3. Si usas el aprovisionamiento dinámico, usa kubectl para quitar los recursos asociados del clúster:

    kubectl delete -f efs-storage-class.yaml
    
  4. Encuentra el ID de tu destino de activación:

    aws efs describe-mount-targets \
    --file-system-id EFS_ID \
    --profile adminuser \
    --region AWS_REGION
    

    Reemplaza lo siguiente:

    • EFS_ID: el ID de tu recurso de EFS
    • AWS_REGION: es la región de AWS en la que se ejecuta el clúster

    El resultado incluye el ID del destino de activación. Guarda este valor. Lo necesitarás más tarde.

  5. Borra tu destino de activación de EFS:

    aws efs delete-mount-target \
    --mount-target-id MOUNT_TARGET_ID \
    --profile adminuser \
    --region AWS_REGION
    

    Reemplaza lo siguiente:

    • MOUNT_TARGET_ID: es el ID del destino de activación de EFS
    • AWS_REGION: Es la región de AWS de tu destino de activación.
  6. Borra cualquier grupo de seguridad que hayas creado.

  7. Borra el sistema de archivos mediante el comando delete-file-system de la CLI. Puedes obtener una lista de tus sistemas de archivos mediante el comando describe-file-systems de la CLI. El ID del sistema de archivos se encuentra en la respuesta.

    aws efs delete-file-system \
      --file-system-id EFS_ID \
      --profile adminuser \
      --region AWS_REGION
    

    Reemplaza lo siguiente:

    • EFS_ID
    • AWS_REGION

¿Qué sigue?