Usa sistemas de archivos EFS

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

Antes de comenzar

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

  • Un sistema de archivos EFS existente en la misma VPC de AWS que tu instalación de GKE on AWS.
  • Al menos un objetivo de activación de EFS en la misma VPC de AWS que tu instalación de GKE on AWS.
  • Todos tus objetivos de activación de EFS deben pertenecer a lo siguiente:
    • Las subredes privadas para la instalación de GKE on AWS. De forma predeterminada, GKE on AWS crea subredes llamadas gke-CLUSTER_ID-private-AWS_ZONE, en las que CLUSTER_ID es tu ID de 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 on AWS crea grupos de nodos llamados gke-CLUSTER_ID-nodepool, en los que CLUSTER_ID es el ID de tu clúster de usuario.
  • Desde tu directorio de anthos-aws, usa anthos-gke para cambiar el contexto a tu clúster de usuario.
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Reemplaza CLUSTER_NAME por el nombre de tu clúster de usuario.

Usa un PersistentVolume de EFS

Para usar un sistema de archivos FFS como PersistentVolume con tus clústeres de usuario, primero debes crear un PersistentVolume y, luego, crear una PersistentVolumeClaim a la que harás referencia en tu carga de trabajo.

Crea un PersistentVolume

Para crear un PersistentVolume con el controlador CSI de EFS, realiza los siguientes pasos.

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

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

  2. La configuración de PersistentVolume que usas depende de si te conectas de forma directa al Elastic File System o a través de un punto de acceso. Selecciona si te conectas de forma directa a Elastic File System 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_FILE_SYSTEM_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_FILE_SYSTEM_ID con el ID del sistema de archivos EFS. Por ejemplo, fs-12345678a.

    Punto de acceso

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

Crea una PersistentVolumeClaim

Para usar el sistema de archivos EFS con tus cargas de trabajo, crea una PersistentVolumeClaim.

  1. Para crear la 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
    

    Reemplaza CLAIM_NAME por un nombre para tu PersistentVolumeClaim. Por ejemplo, efs-claim1.

  2. Aplica el 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 la PersistentVolumeClaim.

    persistentvolumeclaim/CLAIM_NAME created
    

Cree un StatefulSet

Después de crear una PersistentVolumeClaim, puedes usarla en una carga de trabajo. En los pasos de esta sección, se crea un StatefulSet de ejemplo con el sistema de archivos EFS activado. También puedes usar una PersistentVolumeClaim con otros tipos de cargas de trabajo, como pods e implementaciones, si haces referencia al reclamo en spec.volumes.

Para crear un StatefulSet que active el sistema de archivos EFS al que se hace referencia en tu PersistentVolumeClaim, realiza los siguientes pasos.

  1. Copia el siguiente YAML en un archivo llamado efs-statefulset.yaml. En este manifiesto de ejemplo, se inicia un contenedor de Ubuntu Linux que activa el sistema de archivos EFS en /efs-data. El contenedor escribe cada cinco segundos en un archivo de tu sistema de archivos 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
    

    Reemplaza lo siguiente:

    • CLAIM_NAME por el nombre de la PersistentVolumeClaim que especificaste antes. Por ejemplo, efs-claim1.
  2. Aplica el 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 del 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 tenga el estado Running con kubectl get pods.

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

    El resultado 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. Una vez que el pod esté en estado de ejecución, 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 tu sistema de archivos EFS está activado, verifica el contenido del archivo out.txt con el comando tail.

    tail /efs-data/out.txt
    

    El resultado contiene las horas recientes en UTC.

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

    exit
    

    La shell vuelve a la máquina local.

  7. Para quitar el StatefulSet, usa kubectl delete.

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

Realice una limpieza

Para quitar los recursos que creaste 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

¿Qué sigue?