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

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
Interfaz de la línea de comandos de AWS (AWS CLI) es una herramienta de código abierto que puede usar para interactuar con los servicios de AWS desde la línea de comandos.
Amazon Elastic File System (Amazon EFS) le ayuda a crear y configurar sistemas de archivos compartidos en la nube de AWS. Siguiendo este patrón, proporciona un sistema de archivos simple, escalable, completamente administrado y compartido para su uso con Amazon EKS.
Amazon Elastic Kubernetes Service (Amazon EKS) le permite poner en marcha Kubernetes en AWS sin necesidad de instalar ni operar sus propios clústeres.
AWS Fargate es un motor de computación sin servidor para Amazon EKS. Crea y administra recursos de computación para sus aplicaciones de Kubernetes.
AWS Key Management Service (AWS KMS) facilita poder crear y controlar claves criptográficas para proteger los datos.
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 Fargateepic01 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
| Tarea | Descripción | Habilidades requeridas |
|---|---|---|
Cree un clúster de Amazon EKS. | notaSi 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 | 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.
Si aún no lo ha indicado, puede obtener toda la información solicitada anteriormente con los siguientes comandos de CLI.
| Administrador de sistemas de AWS |
| Tarea | Descripción | Habilidades 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 Con un nombre para el espacio de nombres de la aplicación personalizado:
Sin un nombre para el espacio de nombres de la aplicación personalizado:
donde | Usuario de Kubernetes con permisos concedidos |
| Tarea | Descripción | Habilidades 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:
donde Con el cifrado en reposo, con una clave KMS:
donde Sin cifrado:
donde | 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:
| 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 |
| Tarea | Descripción | Habilidades 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
Este script usa la utilidad | 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 |
| Tarea | Descripción | Habilidades 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 Con cifrado en tránsito:
donde Sin cifrado en tránsito:
donde | 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 | 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 | Usuario de Kubernetes con permisos concedidos |
| Tarea | Descripción | Habilidades requeridas |
|---|---|---|
Compruebe el estado de | Ingrese el siguiente comando para verificar el estado de
Para obtener un ejemplo de salida, consulte la sección Información adicional. | Usuario de Kubernetes con permisos concedidos |
Compruebe el estado de | Ingrese el siguiente comando para verificar el estado de
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
Los resultados son similares a los siguientes:
| 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
Los resultados son similares a los siguientes:
| 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
Los resultados son similares a los siguientes:
| 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
Los resultados son similares a los siguientes:
| 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
donde Los resultados son similares a los siguientes:
| Usuario de Kubernetes con permisos concedidos, administrador de sistemas |
| Tarea | Descripción | Habilidades 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 |
| Tarea | Descripción | Habilidades 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 Con el cifrado en reposo, con una clave KMS:
donde Sin cifrado en reposo:
donde | Usuario de Kubernetes con permisos concedidos, administrador de sistemas |
Recursos relacionados
Referencias
AWS Fargate for Amazon EKS now supports Amazon EFS
(anuncio) Cómo capturar los registros de las aplicaciones al usar Amazon EKS en AWS Fargate
(entrada del blog) Uso de Container Insights (documentación de Amazon CloudWatch)
Configuración de Container Insights en Amazon EKS y Kubernetes (documentación de Amazon CloudWatch)
Métricas de Container Insights de Kubernetes y Amazon EKS (documentación de Amazon CloudWatch)
Supervisión de Amazon EFS con Amazon CloudWatch (documentación de Amazon EFS)
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