Usar sistemas de archivos EFS

Las versiones 1.6 y posteriores de GKE en AWS admiten Elastic File System (EFS) de AWS a través del controlador CSI de EFS. En este tema se explica cómo montar un sistema de archivos EFS como PersistentVolume en tus clústeres de usuario.

Antes de empezar

Para seguir los pasos de este tema, necesitas lo siguiente:

  • Un sistema de archivos de EFS en la misma VPC de AWS que tu instalación de GKE en AWS.
  • Al menos un destino de montaje de EFS en la misma VPC de AWS que tu instalación de GKE en AWS.
  • Todos los destinos de montaje de EFS deben pertenecer a lo siguiente:
    • Las subredes privadas de tu instalación de GKE en AWS. De forma predeterminada, GKE en AWS crea subredes llamadas gke-CLUSTER_ID-private-AWS_ZONE, donde CLUSTER_ID es el ID de tu clúster de usuario y AWS_ZONE es la zona de disponibilidad de AWS.
    • El grupo de seguridad del grupo de nodos. De forma predeterminada, GKE en AWS crea grupos de nodos llamados gke-CLUSTER_ID-nodepool, donde CLUSTER_ID es el ID de tu clúster de usuario.
  • En tu directorio de anthos-aws, usa anthos-gke para cambiar el contexto a tu clúster de usuarios.
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Sustituye CLUSTER_NAME por el nombre de tu clúster de usuario.

Usar un PersistentVolume de EFS

Para usar un sistema de archivos EFS como PersistentVolume con tus clústeres de usuario, primero debes crear un PersistentVolume y, a continuación, un PersistentVolumeClaim al que harás referencia en tu carga de trabajo.

Crear un PersistentVolume

Para crear un PersistentVolume con el controlador CSI de EFS, sigue estos pasos.

  1. En tu directorio de anthos-aws, usa anthos-gke para cambiar el contexto a tu clúster de usuarios.

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Sustituye CLUSTER_NAME por el nombre de tu clúster de usuario.

  2. La configuración de PersistentVolume que utilices dependerá de si te conectas directamente a Elastic File System o a través de un punto de acceso. Selecciona esta opción si te vas a conectar a Elastic File System directamente 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_FILE_SYSTEM_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_FILE_SYSTEM_ID con el ID de tu sistema de archivos de EFS. Por ejemplo, fs-12345678a.

    Punto de acceso

    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_FILE_SYSTEM_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_FILE_SYSTEM_ID con el ID de tu sistema de archivos de EFS. Por ejemplo, fs-12345678a.
    • ACCESS_POINT_ID con el ID de tu punto de acceso. Por ejemplo, fsap-1234567890abcde.
  3. Aplica el archivo YAML a tu clúster de usuario.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f efs-volume.yaml
    

    El resultado confirma la creación de PersistentVolume.

    persistentvolume/VOLUME_NAME created
    

Crear un PersistentVolumeClaim

Para usar tu sistema de archivos EFS con tus cargas de trabajo, crea un PersistentVolumeClaim.

  1. Para crear el PersistentVolumeClaim, copia el siguiente manifiesto YAML en un archivo llamado efs-claim.yaml.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: CLAIM_NAME
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: ""
      resources:
        requests:
          storage: 5Gi
    

    Sustituye CLAIM_NAME por el nombre de tu PersistentVolumeClaim. Por ejemplo, efs-claim1.

  2. Aplica el archivo YAML a tu clúster de usuario.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f efs-claim.yaml
    

    El resultado confirma la creación de PersistentVolumeClaim.

    persistentvolumeclaim/CLAIM_NAME created
    

Crear un StatefulSet

Una vez que hayas creado un PersistentVolumeClaim, podrás usarlo en una carga de trabajo. En los pasos de esta sección se crea un StatefulSet de ejemplo con el sistema de archivos EFS montado. También puedes usar un PersistentVolumeClaim con otros tipos de carga de trabajo, como pods y despliegues, haciendo referencia a la reclamación en spec.volumes.

Para crear un StatefulSet que monte el sistema de archivos EFS al que se hace referencia en tu PersistentVolumeClaim, sigue estos pasos.

  1. Copia el siguiente manifiesto YAML en un archivo llamado efs-statefulset.yaml. Este manifiesto de ejemplo inicia un contenedor de Ubuntu Linux que monta tu sistema de archivos EFS en /efs-data. El contenedor escribe cada cinco segundos en un archivo de su sistema de archivos de EFS llamado out.txt.

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: efs-shell
    spec:
      selector:
        matchLabels:
          app: test-efs
      serviceName: efs-app
      replicas: 1
      template:
        metadata:
          labels:
            app: test-efs
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: linux
            image: ubuntu:bionic
            command: ["/bin/sh"]
            args: ["-c", "while true; do echo $(date -u) >> /efs-data/out.txt; sleep 5; done"]
            volumeMounts:
            - name: efs-volume
              mountPath: /efs-data
          volumes:
          - name: efs-volume
            persistentVolumeClaim:
              claimName: CLAIM_NAME
    

    Haz los cambios siguientes:

    • CLAIM_NAME con el nombre de PersistentVolumeClaim que has especificado anteriormente. Por ejemplo, efs-claim1.
  2. Aplica el archivo YAML a tu clúster de usuario.

    env HTTPS_PROXY=http://localhost:8118 \
     kubectl apply -f efs-statefulset.yaml
    

    El resultado confirma la creación de StatefulSet.

    statefulset.apps/efs-shell created
    

    El StatefulSet puede tardar varios minutos en descargar la imagen del contenedor e iniciarse.

  3. Confirma que el pod de StatefulSet tiene el estado Running con kubectl get pods.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get pods -l app=test-efs
    

    La salida incluye el nombre del pod y su estado. En la siguiente respuesta, el nombre del pod es efs-shell-0.

    NAME          READY   STATUS    RESTARTS   AGE
    efs-shell-0   1/1     Running   0          1m
    
  4. Cuando el pod tenga el estado Running, usa kubectl exec para conectarte al pod que aloja el StatefulSet.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl exec -it efs-shell-0 -- bash
    

    El comando kubectl inicia un shell en el pod.

  5. Para confirmar que el sistema de archivos de EFS está montado, comprueba el contenido del archivo out.txt con el comando tail.

    tail /efs-data/out.txt
    

    El resultado contiene horas recientes en UTC.

  6. Desconéctate del Pod con el comando exit.

    exit
    

    Tu shell vuelve a tu máquina local.

  7. Para quitar el StatefulSet, usa kubectl delete.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl delete -f efs-statefulset.yaml
    

Eliminar los recursos utilizados

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

env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f efs-statefulset.yaml
env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f efs-claim.yaml
env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f efs-volume.yaml

Siguientes pasos