Aprovisionar un volumen persistente con EFS

En esta página se describe cómo configurar un PersistentVolume basado en EFS para usarlo 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 pone el almacenamiento a disposición de tus cargas de trabajo a través de un punto de acceso de EFS y garantiza que el almacenamiento se conserve aunque no haya cargas de trabajo conectadas a él.

Esta página está dirigida a operadores y especialistas en almacenamiento que quieran configurar y gestionar el almacenamiento. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido de Google Cloud , consulta Roles y tareas de usuario habituales de GKE.

GKE on AWS admite el aprovisionamiento estático y dinámico de PersistentVolumes. El aprovisionamiento dinámico usa una configuración ligeramente diferente, pero requiere menos esfuerzo administrativo después.

Antes de empezar

Para seguir los pasos de esta página, primero debes hacer lo siguiente:

Descripción general del aprovisionamiento estático

Para crear un sistema de archivos elástico (EFS) y ponerlo a disposición de las cargas de trabajo de tu clúster mediante el aprovisionamiento estático, sigue estos cuatro pasos:

  • Crear un recurso de EFS
  • Configurar la red
  • Crear un destino de montaje
  • Crear un PersistentVolume

El último paso es por carga de trabajo: solicitar almacenamiento persistente emitiendo un PersistentVolumeClaim.

Descripción general del aprovisionamiento dinámico

Para crear un recurso de EFS y hacerlo disponible mediante el aprovisionamiento dinámico, también hay que seguir cuatro pasos:

  • Crear un recurso de EFS
  • Configurar la red
  • Crear un destino de montaje
  • Crear un StorageClass

La creación del StorageClass es una operación que se realiza una sola vez. Una vez que se ha definido una clase de almacenamiento con unas características determinadas, la carga de trabajo puede emitir un PersistentVolumeClaim o una solicitud de almacenamiento persistente. Todos los PersistentVolumeClaims de almacenamiento con esas características pueden solicitar el mismo StorageClass.

Pasos habituales

Tanto si usas el aprovisionamiento estático como el dinámico en tu clúster, debes empezar con los pasos de configuración que se indican aquí y, a continuación, seguir 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 seguir los pasos finales para acceder a él. Los pasos para hacerlo se describen en Usar almacenamiento de EFS.

Crear un recurso de AWS EFS

Se necesita un recurso de EFS tanto si usas el aprovisionamiento estático como el dinámico. Si tu clúster usa ambos, puedes crear recursos de EFS independientes para cada uno o usar el mismo para ambos. Consulta Crear sistemas de archivos de Amazon EFS para obtener más información sobre cómo crear un recurso de EFS.

También puede reutilizar un EFS que ya tenga. En ese caso, puede saltarse esta sección y pasar a Crear objetivos de montaje.

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

    Haz los cambios siguientes:

    • CLUSTER_NAME: el nombre del clúster de AWS.
    • LOCATION: la Google Cloud ubicación del clúster de AWS
  2. Crea un sistema de recursos de 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
    

    Haz los cambios siguientes:

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

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

Crear destinos de montaje

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

Si los grupos de nodos de tu clúster se ejecutan en subredes diferentes, debes crear un destino de montaje independiente en cada subred del grupo de nodos.

En este ejemplo, el acceso a cada destino de montaje está protegido por un único grupo de seguridad que incluye tanto los destinos de montaje como las máquinas del grupo de nodos. En función de la configuración de tu VPC y de tus requisitos de seguridad, puedes dividir esta configuración en dos o más grupos de seguridad. Por ejemplo, uno para los destinos de montaje y otro para los nodos de trabajo del grupo de nodos.

  1. Crea un grupo de seguridad específico 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)"
    

    Haz los cambios siguientes:

    • 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 montaje de EFS.

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

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

    La salida incluye el ID del nuevo grupo de seguridad. 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. Elimine 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"}]}]'
    

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

  4. Autoriza el tráfico entrante y saliente 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 montaje de EFS en cada subred del grupo de nodos.

    Lista de subredes asociadas a todos los grupos de nodos.

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

    Haz los cambios siguientes:

    • CLUSTER_NAME
    • LOCATION

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

  6. Para cada subred, cree un destino de montaje 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
    

    Haz los cambios siguientes:

    • EFS_ID: el ID de tu recurso de EFS.
    • SUBNET_ID: el ID de la subred del grupo de nodos.
    • SECURITY_GROUP_ID
  7. Añade 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
    

    Haz los cambios siguientes:

    • CLUSTER_NAME
    • LOCATION

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

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

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

    Haz los cambios siguientes:

    • NODE_POOL_NAME: el nombre del grupo de nodos.
    • CLUSTER_NAME: el nombre de tu clúster.
    • LOCATION
    • SECURITY_GROUP_IDS la lista de IDs de grupos de seguridad de los nodos de trabajo.

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

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

Aprovisionamiento estático

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

  1. Elige la pestaña adecuada en función de si te vas a conectar directamente al recurso compartido de EFS o a través de un punto de acceso.

    Conectar directamente

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

    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
    

    Haz los cambios siguientes:

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

    Punto de acceso

    Para crear un volumen basado en un punto de acceso, debes aprovisionarlo manualmente. Consulta más información sobre cómo trabajar con puntos de acceso de EFS.

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

    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
    

    Haz los cambios siguientes:

    • VOLUME_NAME con un nombre para el volumen persistente.
    • CLAIM_NAME con el nombre que quieras usar para el PersistentVolumeClaim.
    • EFS_ID con el 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 archivo 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 un StorageClass que haga referencia al recurso de EFS que ha creado anteriormente. Una vez hecho esto, los desarrolladores pueden acceder al recurso de EFS siguiendo los pasos que se describen en Usar un recurso de EFS.

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

    Copia el siguiente fragmento de código 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 descritas en este archivo, consulta la documentación sobre los parámetros de StorageClass de EFS.

    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"
    
    

    Sustituye:

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

    kubectl apply -f efs-storage-class.yaml
    

    Si la acción se realiza correctamente, el resultado de este comando contendrá una línea similar a la siguiente:

    storageclass/EFS_STORAGE_CLASS_NAME created

Limpieza

Para eliminar los recursos que has creado en las secciones anteriores, ejecuta los siguientes comandos:

  1. Usa kubectl para eliminar el recurso de 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 de tu clúster:

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

    kubectl delete -f efs-storage-class.yaml
    
  4. Busca el ID de tu destino de montaje:

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

    Haz los cambios siguientes:

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

    La salida incluye el ID del destino de montaje. Guarda este valor. Lo necesitarás más tarde.

  5. Elimina tu destino de montaje de EFS:

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

    Haz los cambios siguientes:

    • MOUNT_TARGET_ID: el ID de tu destino de montaje de EFS
    • AWS_REGION: la región de AWS de tu objetivo de montaje
  6. Elimina los grupos de seguridad que hayas creado.

  7. Elimina el sistema de archivos con el comando de la CLI delete-file-system. Puedes obtener una lista de tus sistemas de archivos mediante el comando de la CLI describe-file-systems. 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
    

    Haz los cambios siguientes:

    • EFS_ID
    • AWS_REGION

Siguientes pasos