Ejecutar cargas de trabajo con estado y almacenamiento de datos persistente mediante Amazon EFS en Amazon EKS con AWS Fargate - Recomendaciones de AWS

Ejecutar cargas de trabajo con estado y almacenamiento de datos persistente mediante Amazon EFS en Amazon EKS con AWS Fargate

Ricardo Morais, Rodrigo Bersa y Lucio Pereira, Amazon Web Services

Resumen

Este patrón proporciona orientación para habilitar Amazon Elastic File System (Amazon EFS) como dispositivo de almacenamiento para contenedores que usan Amazon Elastic Kubernetes Service (Amazon EKS), mediante AWS Fargate para aprovisionar sus recursos de computación.

La configuración descrita en este patrón sigue las prácticas recomendadas de seguridad y proporciona seguridad en reposo y seguridad en tránsito de forma predeterminada. Para cifrar su sistema de archivos Amazon EFS, utiliza una clave de AWS Key Management Service (AWS KMS), pero también puede especificar un alias de clave que gestione el proceso de creación de una clave de KMS.

Puede seguir los pasos de este patrón para crear un espacio de nombres y un perfil de Fargate para una aplicación de prueba de concepto (PoC), instalar el controlador Amazon EFS Container Storage Interface (CSI) que se utiliza para integrar el clúster de Kubernetes con Amazon EFS, configurar la clase de almacenamiento e implementar la aplicación PoC. Estos pasos dan como resultado un sistema de archivos Amazon EFS que se comparte entre varias cargas de trabajo de Kubernetes y se ejecuta en Fargate. El patrón va acompañado de scripts que automatizan estos pasos.

Puede utilizar este patrón si quiere garantizar la persistencia de los datos en sus aplicaciones contenerizadas y evitar la pérdida de datos en las operaciones de escalado. Por ejemplo:

  • Herramientas de DevOps: un escenario común es desarrollar una estrategia de integración y entrega continuas (CI/CD). En este caso, puede utilizar Amazon EFS como un sistema de archivos compartido para almacenar configuraciones entre distintas instancias de la herramienta de CI/CD o para almacenar una memoria caché (por ejemplo, un repositorio de Apache Maven) para las etapas de canalización entre distintas instancias de la herramienta de CI/CD.

  • Servidores web: un escenario habitual es utilizar Apache como servidor web HTTP. Puede utilizar Amazon EFS como un sistema de archivos compartidos para almacenar archivos estáticos que se comparten entre distintas instancias del servidor web. En este escenario de ejemplo, las modificaciones se aplican directamente al sistema de archivos en lugar de incluir los archivos estáticos en una imagen de Docker.

Requisitos previos y limitaciones

Requisitos previos

  • Una cuenta de AWS activa

  • Un clúster de Amazon EKS existente con la versión 1.17 o posterior de Kubernetes (probado hasta la versión 1.27)

  • Un sistema de archivos de Amazon EFS existente para vincular una StorageClass de Kubernetes y aprovisionar sistemas de archivos de forma dinámica

  • Permisos de administración de clústeres

  • El contexto está configurado para apuntar al clúster de Amazon EKS deseado

Limitaciones

  • Hay algunas limitaciones que se deben tener en cuenta al utilizar Amazon EKS con Fargate. Por ejemplo, no se admite el uso de algunos constructos de Kubernetes, como los DaemonSets y los contenedores privilegiados. Para obtener más información sobre las limitaciones de Fargate, consulte Consideraciones sobre AWS Fargate en la documentación de Amazon EKS.

  • El código que se proporciona con este patrón es compatible con estaciones de trabajo que ejecutan Linux o macOS.

Versiones de producto

  • Interfaz de la línea de comandos de AWS (AWS CLI) versión 2 o posterior

  • La versión 1.0 o posterior del controlador de CSI de Amazon EFS (probado hasta la versión 2.4.8)

  • La versión 0.24.0 o posterior de eksctl (probado hasta la versión 0.158.0)

  • La versión 1.6 o posterior de jq

  • La versión 1.17 o posterior de kubectl (probado hasta la versión 1.27)

  • La versión 1.17 o posterior de Kubernetes (probado hasta la versión 1.27)

Arquitectura

Diagrama de arquitectura de la puesta en marcha de cargas de trabajo con estado y almacenamiento de datos persistente mediante Amazon EFS

La arquitectura de destino consta de la siguiente infraestructura:

  • Una nube privada virtual (VPC)

  • Dos zonas de disponibilidad.

  • Una subred pública con una puerta de enlace de NAT que proporciona acceso a Internet.

  • Una subred privada con un clúster de Amazon EKS y destinos de montaje de Amazon EFS (también conocidos como puntos de montaje)

  • Amazon EFS para VPC

La siguiente es la infraestructura del entorno del clúster de Amazon EKS:

  • Perfiles de AWS Fargate que admitan los constructos de Kubernetes en el espacio de nombres.

  • Un espacio de nombres de Kubernetes con lo siguiente:

    • Dos pods de aplicaciones distribuidos en las zonas de disponibilidad.

    • Una solicitud de volumen persistente (PVC) vinculada a un volumen persistente (PV) en el clúster.

  • Un PV de todo el clúster que esté enlazado a la PVC del espacio de nombres y que apunte a los destinos de montaje de Amazon EFS en la subred privada, fuera del clúster.

Herramientas

Servicios de AWS

Otras herramientas

  • Docker es un conjunto de productos de plataforma como servicio (PaaS) que utiliza la virtualización a nivel del sistema operativo para entregar software en contenedores.

  • eksctl: es una utilidad sencilla de línea de comandos para crear y administrar clústeres de Kubernetes en Amazon EKS.

  • kubectl: una interfaz de la línea de comandos que le ayuda en la ejecución de comandos en clústeres de Kubernetes.

  • jq es una herramienta de línea de comandos para analizar JSON.

Code

El código de este patrón se proporciona en el repositorio Persistence Configuration with Amazon EFS on Amazon EKS using AWS Fargate de GitHub. Los scripts están organizados por epic, en las carpetas desde epic01 hasta epic06, según el orden de la sección Epics de este patrón.

Prácticas recomendadas

La arquitectura de destino incluye los siguientes servicios y componentes, y sigue las prácticas recomendadas de Marco de AWS Well-Architected:

  • Amazon EFS, que proporciona un sistema de archivos NFS elástico, simple, escalable y completamente administrado. Se utiliza como un sistema de archivos compartido entre todas las replicaciones de la aplicación PoC que se ejecutan en pods, que se distribuyen en las subredes privadas del clúster de Amazon EKS elegido.

  • Un destino de montaje de Amazon EFS para cada subred privada. Esto proporciona redundancia por zona de disponibilidad dentro de la nube privada virtual (VPC) del clúster.

  • Amazon EKS, que ejecuta las cargas de trabajo de Kubernetes. Debe aprovisionar un clúster de Amazon EKS antes de utilizar este patrón, tal y como se describe en la sección Requisitos previos.

  • AWS KMS, que proporciona cifrado en reposo para el contenido almacenado en el sistema de archivos Amazon EFS.

  • Fargate, que administra los recursos informáticos de los contenedores para que pueda centrarse en los requisitos empresariales y no en la carga de la infraestructura. El perfil de Fargate se crea para todas las subredes privadas. Esto proporciona redundancia por zona de disponibilidad dentro de la nube privada virtual (VPC) del clúster.

  • Los pods de Kubernetes permiten validar que distintas instancias de una aplicación puedan compartir, consumir y escribir contenido.

Epics

TareaDescripciónHabilidades requeridas

Cree un clúster de Amazon EKS.

nota

Si ya dispone de un clúster, continúe con la siguiente epic. Cree un clúster de Amazon EKS en su cuenta de AWS. En el directorio de GitHub, utilice uno de los patrones para implementar un clúster de Amazon EKS mediante Terraform o eksctl. Para obtener más información, consulte Creación de un clúster de Amazon EKS en la documentación de Amazon EKS. En el patrón de Terraform, también hay ejemplos que muestran cómo: vincular los perfiles de Fargate a su clúster de Amazon EKS, crear un sistema de archivos de Amazon EFS e implementar el controlador de CSI de Amazon EFS en su clúster de Amazon EKS.

Administrador de AWS, administrador de Terraform o eksctl, administrador de Kubernetes

Exporte variables de entorno.

Use el script env.sh. Esto proporciona la información necesaria en los siguientes pasos.

source ./scripts/env.sh Inform the AWS Account ID: <13-digit-account-id> Inform your AWS Region: <aws-Region-code> Inform your Amazon EKS Cluster Name: <amazon-eks-cluster-name> Inform the Amazon EFS Creation Token: <self-genereated-uuid>

Si aún no lo ha indicado, puede obtener toda la información solicitada anteriormente con los siguientes comandos de CLI.

# ACCOUNT ID aws sts get-caller-identity --query "Account" --output text
# REGION CODE aws configure get region
# CLUSTER EKS NAME aws eks list-clusters --query "clusters" --output text
# GENERATE EFS TOKEN uuidgen
Administrador de sistemas de AWS
TareaDescripciónHabilidades requeridas

Cree un espacio de nombres de Kubernetes y perfil de Fargate para las cargas de trabajo de las aplicaciones.

Cree un espacio de nombres para recibir las cargas de trabajo de las aplicaciones que interactúan con Amazon EFS. Ejecute el script create-k8s-ns-and-linked-fargate-profile.sh. Puede elegir usar un nombre para el espacio de nombres personalizado o el espacio de nombres proporcionado por defecto poc-efs-eks-fargate.

Con un nombre para el espacio de nombres de la aplicación personalizado:

export $APP_NAMESPACE=<CUSTOM_NAME> ./scripts/epic01/create-k8s-ns-and-linked-fargate-profile.sh \ -c "$CLUSTER_NAME" -n "$APP_NAMESPACE"

Sin un nombre para el espacio de nombres de la aplicación personalizado:

./scripts/epic01/create-k8s-ns-and-linked-fargate-profile.sh \ -c "$CLUSTER_NAME"

donde $CLUSTER_NAME es el nombre de su clúster de Amazon EKS. El parámetro -n <NAMESPACE> es opcional; si no se indica, se proporcionará un nombre para el espacio de nombres generado por defecto.

Usuario de Kubernetes con permisos concedidos
TareaDescripciónHabilidades requeridas

Genere un token único.

Amazon EFS requiere la creación de un token para garantizar la operación de idempotencia (llamar a la operación con el mismo token de creación no tiene ningún efecto). Para cumplir con este requisito, debe generar un token único mediante una técnica disponible. Por ejemplo, puede generar un identificador único universal (UUID) para usarlo como token de creación.

Administrador de sistemas de AWS

Crear un sistema de archivos de Amazon EFS.

Cree el sistema de archivos para recibir los archivos de datos que leen y escriben las cargas de trabajo de la aplicación. Puede crear un sistema de archivos cifrado o no cifrado. (Como práctica recomendada, el código de este patrón crea un sistema cifrado para habilitar el cifrado en reposo de forma predeterminada). Puede utilizar una clave de AWS KMS simétrica y única para cifrar su sistema de archivos. Si no se especifica, se utiliza una clave administrada de AWS.

Utilice el script create-efs.sh para crear un sistema de archivos Amazon EFS cifrado o no cifrado, después de generar un token único para Amazon EFS.

Con el cifrado en reposo, sin clave KMS:

./scripts/epic02/create-efs.sh \ -c "$CLUSTER_NAME" \ -t "$EFS_CREATION_TOKEN"

donde $CLUSTER_NAME es el nombre de su clúster de Amazon EKS y $EFS_CREATION_TOKEN es un token de creación único para el sistema de archivos.

Con el cifrado en reposo, con una clave KMS:

./scripts/epic02/create-efs.sh \ -c "$CLUSTER_NAME" \ -t "$EFS_CREATION_TOKEN" \ -k "$KMS_KEY_ALIAS"

donde $CLUSTER_NAME es el nombre de su clúster de Amazon EKS, $EFS_CREATION_TOKEN es un token de creación único para el sistema de archivos y $KMS_KEY_ALIAS es el alias para la clave KMS.

Sin cifrado:

./scripts/epic02/create-efs.sh -d \ -c "$CLUSTER_NAME" \ -t "$EFS_CREATION_TOKEN"

donde $CLUSTER_NAME es el nombre de su clúster de Amazon EKS, $EFS_CREATION_TOKEN es un token de creación único para el sistema de archivos y –d deshabilita el cifrado en reposo.

Administrador de sistemas de AWS

Crear un grupo de seguridad.

Cree un grupo de seguridad para permitir al clúster de Amazon EKS acceder al sistema de archivos de Amazon EFS.

Administrador de sistemas de AWS

Actualizar la regla de entrada del grupo de seguridad.

Actualice las reglas de entrada del grupo de seguridad para permitir el tráfico entrante para las siguientes configuraciones:

  • Protocolo TCP: puerto 2049

  • Origen: rangos de bloques de CIDR para las subredes privadas de la VPC que contiene el clúster de Kubernetes

Administrador de sistemas de AWS

Agregar un destino de montaje para cada subred privada.

Para cada subred privada del clúster de Kubernetes, cree un destino de montaje para el sistema de archivos y el grupo de seguridad.

Administrador de sistemas de AWS
TareaDescripciónHabilidades requeridas

Implementar el controlador de CSI de Amazon EFS.

Implemente el controlador de CSI de Amazon EFS en el clúster. El controlador aprovisiona el almacenamiento de acuerdo con las demandas de volumen persistentes creadas por las aplicaciones. Use el script create-k8s-efs-csi-sc.sh para implementar el controlador de CSI de Amazon EFS y la clase de almacenamiento en el clúster:

./scripts/epic03/create-k8s-efs-csi-sc.sh

Este script usa la utilidad kubectl, así que asegúrese de que el contexto se haya configurado y que apunte al clúster de Amazon EKS deseado.

Usuario de Kubernetes con permisos concedidos

Implementar la clase de almacenamiento.

Implemente la clase de almacenamiento en el clúster del aprovisionador de Amazon EFS (efs.csi.aws.com).

Usuario de Kubernetes con permisos concedidos
TareaDescripciónHabilidades requeridas

Implementar el volumen persistente.

Implemente el volumen persistente y vincúlelo a la clase de almacenamiento creada y al ID del sistema de archivos Amazon EFS. La aplicación utiliza el volumen persistente para leer y escribir contenido. Puede especificar cualquier tamaño para el volumen persistente en el campo de almacenamiento. Kubernetes requiere este campo, pero dado que Amazon EFS es un sistema de archivos elástico, no aplica ningún límite de capacidad del sistema de archivos. Puede implementar el volumen persistente con o sin cifrado. (El controlador CSI de Amazon EFS habilita el cifrado de forma predeterminada, como práctica recomendada). Use el script deploy-poc-app.sh para implementar el volumen persistente, la demanda de volumen persistente y las dos cargas de trabajo.

Con cifrado en tránsito:

./scripts/epic04/deploy-poc-app.sh \ -t "$EFS_CREATION_TOKEN"

donde $EFS_CREATION_TOKEN es el token de creación único para el sistema de archivos.

Sin cifrado en tránsito:

./scripts/epic04/deploy-poc-app.sh -d \ -t "$EFS_CREATION_TOKEN"

donde $EFS_CREATION_TOKEN es el token de creación único para el sistema de archivos y –d desactiva el cifrado en tránsito.

Usuario de Kubernetes con permisos concedidos

Implementar la demanda de volumen persistente solicitada por la aplicación.

Implemente la demanda de volumen persistente solicitada por la aplicación y vincúlela a la clase de almacenamiento. Utilice el mismo modo de acceso que el volumen persistente que creó anteriormente. Puede especificar cualquier tamaño para la demanda de volumen persistente en el campo de almacenamiento. Kubernetes requiere este campo, pero dado que Amazon EFS es un sistema de archivos elástico, no aplica ningún límite de capacidad del sistema de archivos.

Usuario de Kubernetes con permisos concedidos

Implementar la carga de trabajo 1.

Implemente el pod que representa la carga de trabajo 1 de la aplicación. Esta carga de trabajo escribe el contenido en el archivo /data/out1.txt.

Usuario de Kubernetes con permisos concedidos

Implementar la carga de trabajo 2.

Implemente el pod que representa la carga de trabajo 2 de la aplicación. Esta carga de trabajo escribe el contenido en el archivo /data/out2.txt.

Usuario de Kubernetes con permisos concedidos
TareaDescripciónHabilidades requeridas

Compruebe el estado de PersistentVolume.

Ingrese el siguiente comando para verificar el estado de PersistentVolume.

kubectl get pv

Para obtener un ejemplo de salida, consulte la sección Información adicional.

Usuario de Kubernetes con permisos concedidos

Compruebe el estado de PersistentVolumeClaim.

Ingrese el siguiente comando para verificar el estado de PersistentVolumeClaim.

kubectl -n poc-efs-eks-fargate get pvc

Para obtener un ejemplo de salida, consulte la sección Información adicional.

Usuario de Kubernetes con permisos concedidos

Validar que la carga de trabajo 1 pueda escribir en el sistema de archivos.

Ingrese el siguiente comando para validar que la carga de trabajo 1 esté escribiendo en /data/out1.txt.

kubectl exec -ti poc-app1 -n poc-efs-eks-fargate -- tail -f /data/out1.txt

Los resultados son similares a los siguientes:

... Thu Sep 3 15:25:07 UTC 2023 - PoC APP 1 Thu Sep 3 15:25:12 UTC 2023 - PoC APP 1 Thu Sep 3 15:25:17 UTC 2023 - PoC APP 1 ...
Usuario de Kubernetes con permisos concedidos

Validar que la carga de trabajo 2 pueda escribir en el sistema de archivos.

Ingrese el siguiente comando para validar que la carga de trabajo 2 esté escribiendo en /data/out2.txt.

kubectl -n $APP_NAMESPACE exec -ti poc-app2 -- tail -f /data/out2.txt

Los resultados son similares a los siguientes:

... Thu Sep 3 15:26:48 UTC 2023 - PoC APP 2 Thu Sep 3 15:26:53 UTC 2023 - PoC APP 2 Thu Sep 3 15:26:58 UTC 2023 - PoC APP 2 ...
Usuario de Kubernetes con permisos concedidos

Validar que la carga de trabajo 1 pueda leer el archivo escrito por la carga de trabajo 2.

Ingrese el siguiente comando para validar que la carga de trabajo 1 pueda leer el archivo /data/out2.txt escrito por la carga de trabajo 2.

kubectl exec -ti poc-app1 -n poc-efs-eks-fargate -- tail -n 3 /data/out2.txt

Los resultados son similares a los siguientes:

... Thu Sep 3 15:26:48 UTC 2023 - PoC APP 2 Thu Sep 3 15:26:53 UTC 2023 - PoC APP 2 Thu Sep 3 15:26:58 UTC 2023 - PoC APP 2 ...
Usuario de Kubernetes con permisos concedidos

Validar que la carga de trabajo 2 pueda leer el archivo escrito por la carga de trabajo 1.

Ingrese el siguiente comando para validar que la carga de trabajo 2 pueda leer el archivo /data/out1.txt escrito por la carga de trabajo 1.

kubectl -n $APP_NAMESPACE exec -ti poc-app2 -- tail -n 3 /data/out1.txt

Los resultados son similares a los siguientes:

... Thu Sep 3 15:29:22 UTC 2023 - PoC APP 1 Thu Sep 3 15:29:27 UTC 2023 - PoC APP 1 Thu Sep 3 15:29:32 UTC 2023 - PoC APP 1 ...
Usuario de Kubernetes con permisos concedidos

Validar que los archivos se conserven después de eliminar los componentes de la aplicación.

A continuación, utilice un script para eliminar los componentes de la aplicación (volumen persistente, solicitud de volumen persistente y pods) y comprobar que los archivos /data/out1.txt y /data/out2.txt se retienen en el sistema de archivos. Ejecute el script validate-efs-content.sh mediante el comando siguiente.

./scripts/epic05/validate-efs-content.sh \ -t "$EFS_CREATION_TOKEN"

donde $EFS_CREATION_TOKEN es el token de creación único para el sistema de archivos.

Los resultados son similares a los siguientes:

pod/poc-app-validation created Waiting for pod get Running state... Waiting for pod get Running state... Waiting for pod get Running state... Results from execution of 'find /data' on validation process pod: /data /data/out2.txt /data/out1.txt
Usuario de Kubernetes con permisos concedidos, administrador de sistemas
TareaDescripciónHabilidades requeridas

Supervisar los registros de aplicación.

Como parte del segundo día de operación, envíe los registros de la aplicación a Amazon CloudWatch para su supervisión.

Administrador de sistemas de AWS, usuario de Kubernetes con permisos concedidos

Supervisar contenedores de Amazon EKS y de Kubernetes con Container Insights.

Como parte del segundo día de operación, supervise los sistemas Amazon EKS y Kubernetes mediante Información de contenedores de Amazon CloudWatch. Esta herramienta recopila, agrega y resume métricas de aplicaciones en contenedores en diferentes niveles y dimensiones. Para obtener más información, consulte la sección Recursos relacionados.

Administrador de sistemas de AWS, usuario de Kubernetes con permisos concedidos

Supervisar Amazon EFS con CloudWatch.

Como parte del segundo día de operación, supervise los sistemas de archivos mediante Amazon CloudWatch, que recopila y procesa los datos sin formato de Amazon EFS y los convierte en métricas legibles prácticamente en tiempo real. Para obtener más información, consulte la sección Recursos relacionados.

Administrador de sistemas de AWS
TareaDescripciónHabilidades requeridas

Limpiar todos los recursos creados para el patrón.

Tras completar este patrón, limpie todos los recursos para evitar incurrir en cargos de AWS. Use el script clean-up-resources.sh para eliminar todos los recursos una vez que haya terminado de usar la aplicación PoC. Complete una de las siguientes opciones:

Con el cifrado en reposo, con una clave KMS:

./scripts/epic06/clean-up-resources.sh \ -c "$CLUSTER_NAME" \ -t "$EFS_CREATION_TOKEN" \ -k "$KMS_KEY_ALIAS"

donde $CLUSTER_NAME es el nombre de su clúster de Amazon EKS, $EFS_CREATION_TOKEN es un token de creación único para el sistema de archivos y $KMS_KEY_ALIAS es el alias para la clave KMS.

Sin cifrado en reposo:

./scripts/epic06/clean-up-resources.sh \ -c "$CLUSTER_NAME" \ -t "$EFS_CREATION_TOKEN"

donde $CLUSTER_NAME es el nombre de su clúster de Amazon EKS y $EFS_CREATION_TOKEN es un token de creación único para el sistema de archivos.

Usuario de Kubernetes con permisos concedidos, administrador de sistemas

Recursos relacionados

Referencias

Tutoriales y ejemplos GitHub

Herramientas necesarias

Información adicional

A continuación, se muestra un ejemplo de la salida del comando kubectl get pv.

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE poc-app-pv 1Mi RWX Retain Bound poc-efs-eks-fargate/poc-app-pvc efs-sc 3m56s

A continuación, se muestra un ejemplo de la salida del comando kubectl -n poc-efs-eks-fargate get pvc.

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE poc-app-pvc Bound poc-app-pv 1Mi RWX efs-sc 4m34s