Aprovisionar un volumen persistente con EFS

Esta página describe cómo configurar un PersistentVolume basado en EFS para su uso en GKE en AWS mediante el controlador CSI de EFS . El Elastic File System (EFS) es el mecanismo subyacente de AWS que proporciona sistemas de archivos de red a su clúster. Un PersistentVolume basado en EFS es un recurso de clúster que proporciona almacenamiento a sus cargas de trabajo a través de un punto de acceso de EFS y garantiza su persistencia incluso cuando no hay cargas de trabajo conectadas.

Esta página está dirigida a operadores y especialistas en almacenamiento que desean configurar y administrar el almacenamiento. Para obtener más información sobre los roles comunes y las tareas de ejemplo que mencionamos en Google Cloud contenido, consulte Roles y tareas de usuario comunes de GKE Enterprise .

GKE en AWS admite el aprovisionamiento estático y dinámico de volúmenes persistentes. El aprovisionamiento dinámico utiliza una configuración ligeramente diferente, pero requiere menos esfuerzo administrativo posterior.

Antes de empezar

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

Descripción general del aprovisionamiento estático

La creación de un sistema de archivos elástico (EFS) y su puesta a disposición de las cargas de trabajo en su clúster a través del aprovisionamiento estático consta de cuatro pasos:

  • Crea tu recurso EFS
  • Configura tu red
  • Crear un objetivo de montaje
  • Crear un PersistentVolume

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

Descripción general del aprovisionamiento dinámico

La creación de un recurso EFS y su puesta a disposición a través del aprovisionamiento dinámico también consta de cuatro pasos:

  • Crea tu recurso EFS
  • Configura tu red
  • Crear un objetivo de montaje
  • Crear una StorageClass

La creación de la StorageClass se realiza una sola vez. Una vez definida una clase de almacenamiento con las características dadas, la carga de trabajo puede emitir un PersistentVolumeClaim o una solicitud de almacenamiento persistente. Todos los PersistentVolumeClaims para almacenamiento con esas características pueden solicitar la misma StorageClass .

Pasos comunes

Independientemente de si utiliza aprovisionamiento estático o dinámico en su clúster, debe comenzar con los pasos de configuración que se indican aquí y luego continuar con los pasos de aprovisionamiento estático o dinámico, según corresponda. Una vez creado su EFS y habilitado para el acceso, la carga de trabajo debe completar los pasos finales para acceder a él. Los pasos para ello se describen en Usar almacenamiento EFS .

Crear un recurso de AWS EFS

Se requiere un recurso EFS tanto si se utiliza aprovisionamiento estático como dinámico. Si el clúster utiliza ambos, puede crear recursos EFS independientes o usar el mismo para ambos. Consulte "Creación de sistemas de archivos de Amazon EFS" para obtener más información sobre la creación de un recurso EFS.

También puede reutilizar un EFS existente, en cuyo caso puede omitir esta sección y continuar con Crear objetivos de montaje .

  1. Obtenga la región de AWS donde se ejecuta su clúster.

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

    Reemplace lo siguiente:

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

    Reemplace lo siguiente:

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

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

Crear objetivos de montaje

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

Si los grupos de nodos de su clúster se ejecutan en diferentes subredes, debe 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. Según la configuración de su VPC y los requisitos de seguridad, puede 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. Cree un grupo de seguridad dedicado para controlar el acceso al EFS

    Obtenga el ID de la VPC de AWS donde se ejecuta el clúster.

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

    Reemplace lo siguiente:

    • CLUSTER_NAME
    • LOCATION

    La salida incluye el ID de tu VPC. Guarda este valor. Lo necesitarás más adelante.

  2. Cree un grupo de seguridad para controlar el acceso a su destino de montaje EFS.

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

    Reemplace VPC_ID con el ID de la VPC de AWS donde se ejecuta el clúster.

    La salida incluye el ID del nuevo grupo de seguridad. Guarde este valor. Lo necesitará más adelante.

  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"}]}]'
    

    Reemplace SECURITY_GROUP_ID con el ID del grupo de seguridad de AWS.

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

    Enumere las subredes asociadas con todos los grupos de nodos.

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

    Reemplace lo siguiente:

    • CLUSTER_NAME
    • LOCATION

    El resultado es una lista de ID de subred. Guarde este valor. Lo necesitará más adelante.

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

    Reemplace lo siguiente:

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

    Obtenga la lista de todos sus grupos de nodos.

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

    Reemplace lo siguiente:

    • CLUSTER_NAME
    • LOCATION

    La salida incluye los nombres de los grupos de nodos de tu clúster. Guarda este valor. Lo necesitarás más adelante.

  8. Actualice cada grupo de nodos para incluir el nuevo grupo de seguridad EFS.

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

    Reemplace lo siguiente:

    • NODE_POOL_NAME : el nombre del grupo de nodos.
    • CLUSTER_NAME : el nombre de su clúster.
    • LOCATION
    • SECURITY_GROUP_IDS la lista de ID de grupos de seguridad para nodos de trabajo.

Crear un PersistentVolume (estático) o StorageClass (dinámico)

Si usa aprovisionamiento estático, el siguiente paso es crear un PersistentVolume. Si usa aprovisionamiento dinámico, el controlador EFS lo hace automáticamente; en su lugar, usted define una StorageClass para que las cargas de trabajo la especifiquen en su PersistentVolumeClaim. Seleccione la pestaña que corresponda a su método de aprovisionamiento elegido.

Aprovisionamiento estático

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

  1. Seleccione la pestaña adecuada dependiendo de si se está conectando directamente al recurso compartido EFS o a través de un punto de acceso.

    Conectar directamente

    Copie el siguiente manifiesto YAML en un archivo llamado efs-volume.yaml . El manifiesto hace referencia a la clase de almacenamiento EFS que creó 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
    

    Reemplace lo siguiente:

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

    Punto de acceso

    Para crear un volumen basado en un punto de acceso, debe aprovisionarlo manualmente. Consulte "Trabajar con puntos de acceso EFS" para obtener más información.

    Copie el siguiente manifiesto YAML en un archivo llamado efs-volume.yaml . El manifiesto hace referencia a la clase de almacenamiento EFS que creó 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
    

    Reemplace lo siguiente:

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

    kubectl apply -f efs-volume.yaml
    

    La salida confirma la creación de PersistentVolume.

    persistentvolume/VOLUME_NAME created
    
    

Aprovisionamiento dinámico

Esta sección describe cómo crear una clase de almacenamiento que haga referencia al recurso EFS creado anteriormente. Una vez hecho esto, los desarrolladores pueden acceder al recurso EFS siguiendo los pasos descritos en "Usar un recurso EFS" .

  1. Cree una StorageClass que haga referencia al ID del recurso EFS.

    Copie el siguiente fragmento de YAML en un nuevo archivo llamado efs-storage-class.yaml . Para obtener más información sobre cómo ajustar las características de la clase de almacenamiento descrita en este archivo, consulte la documentación sobre los parámetros de la clase de almacenamiento 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"
    
    

    Reemplazar:

    • EFS_STORAGE_CLASS_NAME con el nombre que ha elegido para StorageClass.
    • EFS_ID con su ID de recurso EFS, por ejemplo, fs-12345678a.
  2. Aplique el YAML a su clúster.

    kubectl apply -f efs-storage-class.yaml
    

    Si tiene éxito, la salida de este comando contendrá una línea similar a la siguiente:

    storageclass/ EFS_STORAGE_CLASS_NAME created

Limpiar

Para eliminar los recursos que creó en las secciones anteriores, ejecute los siguientes comandos:

  1. Utilice kubectl para eliminar el recurso de reclamación de EFS de su clúster:

    kubectl delete -f efs-claim.yaml
    
  2. Si utiliza aprovisionamiento estático, utilice kubectl para eliminar los recursos asociados de su clúster:

    kubectl delete -f efs-volume.yaml
    
  3. Si utiliza aprovisionamiento dinámico, utilice kubectl para eliminar los recursos asociados de su clúster:

    kubectl delete -f efs-storage-class.yaml
    
  4. Encuentra el ID del objetivo de tu montura:

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

    Reemplace lo siguiente:

    • EFS_ID : el ID de su recurso EFS
    • AWS_REGION : la región de AWS donde se ejecuta el clúster

    La salida incluye el ID del objetivo de montaje. Guarde este valor. Lo necesitará más adelante.

  5. Eliminar su objetivo de montaje EFS:

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

    Reemplace lo siguiente:

    • MOUNT_TARGET_ID : el ID de su objetivo de montaje EFS
    • AWS_REGION : la región de AWS de su destino de montaje
  6. Elimina cualquier grupo de seguridad que hayas creado.

  7. Elimine el sistema de archivos con el comando de la CLI "delete-file-system". Puede obtener una lista de sus sistemas de archivos con 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
    

    Reemplace lo siguiente:

    • EFS_ID
    • AWS_REGION

¿Qué sigue?