Uso de sistemas de archivos EFS

GKE en AWS, versiones 1.6 y posteriores, es compatible con el sistema de archivos elástico (EFS) de AWS mediante el controlador CSI de EFS . En este tema se explica cómo montar un sistema de archivos EFS existente como un volumen persistente en los clústeres de usuarios.

Antes de empezar

Para realizar los pasos de este tema, necesitará lo siguiente:

  • Un sistema de archivos EFS existente en la misma VPC de AWS que su instalación de GKE en AWS.
  • Al menos un destino de montaje EFS en la misma VPC de AWS que su instalación de GKE en AWS.
  • Todos los objetivos de montura EFS deben pertenecer a lo siguiente:
    • Las subredes privadas de su 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 del 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 del clúster de usuario.
  • Desde su directorio anthos-aws , use anthos-gke para cambiar el contexto a su clúster de usuarios.
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Reemplace CLUSTER_NAME con el nombre de su clúster de usuarios.

Uso de un volumen persistente de EFS

Para utilizar un sistema de archivos EFS como un PersistentVolume con sus clústeres de usuarios, primero debe crear un PersistentVolume y luego crear un PersistentVolumeClaim al que haga referencia en su carga de trabajo.

Creando un volumen persistente

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

  1. Desde su directorio anthos-aws , use anthos-gke para cambiar el contexto a su clúster de usuarios.

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Reemplace CLUSTER_NAME con el nombre de su clúster de usuarios.

  2. La configuración de PersistentVolume que utilice dependerá de si se conecta directamente al Elastic File System o a través de un punto de acceso. Seleccione si se conecta directamente al Elastic File System 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_FILE_SYSTEM_ID
    

    Reemplace lo siguiente:

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

    Punto de acceso

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

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

    La salida confirma la creación de PersistentVolume.

    persistentvolume/VOLUME_NAME created
    

Creación de un PersistentVolumeClaim

Para utilizar su sistema de archivos EFS con sus cargas de trabajo, cree un PersistentVolumeClaim.

  1. Para crear PersistentVolumeClaim, copie 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
    

    Reemplace CLAIM_NAME con un nombre para su PersistentVolumeClaim. Por ejemplo, efs-claim1 .

  2. Aplique el YAML a su clúster de usuarios.

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

    La salida confirma la creación de PersistentVolumeClaim.

    persistentvolumeclaim/CLAIM_NAME created
    

Crear un conjunto con estado

Después de crear un PersistentVolumeClaim, puede usarlo en una carga de trabajo. Los pasos de esta sección crean un StatefulSet de ejemplo con su sistema de archivos EFS montado. También puede usar un PersistentVolumeClaim con otros tipos de carga de trabajo, como pods e implementaciones, haciendo referencia al reclamo en spec.volumes .

Para crear un StatefulSet que monte el sistema de archivos EFS al que se hace referencia en su PersistentVolumeClaim, realice los siguientes pasos.

  1. Copie el siguiente manifiesto YAML en un archivo llamado efs-statefulset.yaml . Este manifiesto de ejemplo inicia un contenedor de Ubuntu Linux que monta su sistema de archivos EFS en /efs-data . El contenedor escribe cada cinco segundos en un archivo de su 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
    

    Reemplace lo siguiente:

    • CLAIM_NAME con el nombre del PersistentVolumeClaim especificado anteriormente. Por ejemplo, efs-claim1 .
  2. Aplique el YAML a su clúster de usuarios.

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

    La salida confirma la creación del StatefulSet.

    statefulset.apps/efs-shell created
    

    El StatefulSet puede tardar varios minutos en descargar la imagen del contenedor y ejecutarse.

  3. Confirme que el pod de StatefulSet esté en 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. Una vez que el Pod esté en estado de ejecución, use kubectl exec para conectarse al Pod que aloja el StatefulSet.

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

    El comando kubectl lanza un shell en el Pod.

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

    tail /efs-data/out.txt
    

    La salida contiene horas recientes en UTC.

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

    exit
    

    Su shell regresa a su máquina local.

  7. Para eliminar el StatefulSet, utilice kubectl delete .

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

Limpiando

Para eliminar los recursos que creó en las secciones anteriores, ejecute 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?