Blog de Amazon Web Services (AWS)
Usando Fargate SPOT para ejecutar tus contenedores hasta 70% más económico
Por Pritam Pal, Sr. EC2 Spot Specialist SA de AWS
AWS lanzó AWS Fargate Spot a fines de 2019 para los clientes que buscan una forma muy rentable de ejecutar contenedores. En este blog hablaremos sobre cómo usar ECS Fargate Spot y Tareas de Fargate para reducir el costo de sus cargas de trabajo en contenedores. Explicaré conceptos existentes como Container Stop Timeout, cómo capturar señales SIGTERM para una eliminación adecuada de tareas y le presentaré dos nuevos conceptos de Amazon Elastic Container Service (Amazon ECS): proveedores de capacidad (Capacity Providers) y eventos de servicio (Service Events).
Visión general
En 2017, AWS lanzó AWS Fargate para Amazon ECS. Fargate le permite dedicar menos tiempo a administrar instancias de Amazon EC2 y más tiempo a crear. Fargate Spot es una nueva opción de compra que permite a los clientes iniciar tareas con capacidad disponible con un gran descuento. Una tarea Spot es casi indistinguible de una tarea bajo demanda con las siguientes excepciones:
El precio (por CPU-hora y GB-hora) de una tarea Spot es variable, con un descuento del 50% al 70% del precio de una tarea bajo demanda, y una tarea de Fargate Spot se puede interrumpir (es decir, detener) cuando AWS necesite la capacidad de vuelta para atender otros clientes on demand.
Fargate Spot se ejecuta según el mismo principio que las instancias de spot de Amazon EC2. Sus tareas se ejecutan con capacidad disponible en la nube de AWS. Si solicita ejecutar su tarea en Fargate Spot, sus tareas se ejecutarán cuando la capacidad de Fargate Spot esté disponible. A medida que estas tareas se ejecutan con capacidad disponible, recibirá una notificación de dos minutos cuando AWS necesite recuperar capacidad, al igual que las instancias puntuales.
En este blog, explico cómo iniciar una Tarea de Fargate Spot utilizando la Consola de administración de AWS y la interfaz de línea de comandos (CLI), cómo manejar los avisos de terminación, cómo se ve el Evento de falla de ubicación de la tarea de servicio y otras mejores prácticas para asegurarme que sea un experto de Fargate Spot.
Conceptos sobre ECS Fargate
Antes de iniciar, exploremos algunos conceptos de ECS, que usaremos para Fargate Spot en este blog.
StopTask y StopTimeout
Debido a que la tarea de Fargate Spot puede interrumpirse con dos minutos de anticipación, debe asegurarse de salir correctamente. Para ello, puede utilizar conceptos como los parámetros stopTimeout. Cuando se llama a StopTask en una tarea, se emite el equivalente de Docker stop a los contenedores que se ejecutan en la tarea. Si el contenedor maneja el valor SIGTERM correctamente y sale dentro de los 30 segundos de recibirlo, no se envía ninguna señal SIGKILL. Normalmente, utiliza el parámetro stopTimeout de la definición de tarea para controlar este comportamiento. stopTimeout es la duración (en segundos) de espera antes de que el contenedor se detenga por la fuerza si no sale normalmente por sí mismo. Para Fargate 1.3.0 o posterior, el valor máximo de tiempo de espera de parada es 120 segundos. Si no se especifica el parámetro, se utiliza el valor predeterminado de 30 segundos.
Capacity providers
Los Capacity providers son una nueva forma de administrar la capacidad informática de los contenedores. Esta herramienta permite que la aplicación defina sus requisitos sobre cómo utilizar la capacidad. Con los Capacity providers, puede definir reglas flexibles sobre cómo se ejecutan las cargas de trabajo en contenedores en diferentes tipos de capacidad informática y administrar el escalado de la capacidad. Los Capacity providers mejoran la disponibilidad, la escalabilidad y el costo de ejecutar tareas y servicios en ECS. A partir de ahora, cada clúster puede tener hasta seis Capacity providers y una estrategia de proveedor de capacidad predeterminada opcional, que determina cómo se distribuyen las tareas entre los Capacity providers. Para ejecutar sus tareas, puede utilizar la estrategia de proveedor de capacidad predeterminada o especificar una propia.
No es necesario crear Capacity providers de AWS Fargate y AWS Fargate Spot. Están disponibles para todas las cuentas y solo deben asociarse con un clúster para que estén disponibles para su uso. Cuando se crea un nuevo clúster mediante la consola de Amazon ECS, junto con la plantilla de clúster de red única, los Capacity providers FARGATE y FARGATE_SPOT se asocian con el nuevo clúster automáticamente.
Un clúster puede contener una combinación de capacity providers FARGATE, FARGATE_SPOT y Auto Scaling Group (ASG); sin embargo, en este momento, una capacity provider strategy solo puede contener un solo capacity provider, ya sea FARGATE o Auto Scaling Group, pero no ambos.
Ahora que cubrí estos dos conceptos de ECS Fargate, vamos a la demo.
Inicie una Tarea de ECS Fargate Spot mediante la consola de administración de AWS
- Abra la consola de Amazon ECS.
- En la barra de navegación, seleccione la región que desee utilizar.
- En el panel de navegación, elija “Clusters”.
- En la página Clusters, elija “Create Cluster”.
- Cree un clúster de tipo “Networking only”.
Con esta opción, puede crear un clúster con una nueva VPC y ahí ejecutar las tareas de Fargate. Los capacity providers FARGATE y FARGATE_SPOT se asocian automáticamente con el clúster, como se muestra en la siguiente imagen.
- Haga clic en Update Cluster en la parte superior derecha para establecer una estrategia de proveedor de capacidad.
En este ejemplo, utilizo una combinación de capacity providers FARGATE_SPOT y FARGATE. Seleccioné un Peso de 4 para FARGATE_SPOT y 1 para FARGATE. Esto significa que por cada cinco tareas, cuatro se inician en FARGATE_SPOT y una en FARGATE. Usted puede distribuir esto como desee. Más tareas en Fargate Spot significan más ahorros.
- Primero creemos una definición de tarea. Aquí hay algunas definiciones de tarea base con las que puede comenzar. Busque el enlace “Task Definition” del panel de navegación izquierdo, haga clic en Crear una nueva “Task Definition“, elija ”Fargate type”, desplácese hacia abajo, cerca de la parte inferior de la página, busque el botón ”Configure via JSON”. Elimine lo rellenado previamente en el campo JSON, copie la definición de tarea de la aplicación web muestra y péguela. Haga clic en Save. Haga clic en Create.
{ "family": "webapp-fargate-task", "networkMode": "awsvpc", "containerDefinitions": [ { "name": "fargate-app", "image": "httpd:2.4", "portMappings": [ { "containerPort": 80, "hostPort": 80, "protocol": "tcp" } ], "essential": true, "entryPoint": [ "sh", "-c" ], "command": [ "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\"" ] } ], "requiresCompatibilities": [ "FARGATE" ], "cpu": "256", "memory": "512" }
- Ahora que nuestra definición de tarea está lista, ejecutaremos la misma definición de tarea. Seleccione la definición de tarea que acaba de crear, haga clic en “Action” y luego “Run Task”. Ingrese la cantidad de tareas que desea ejecutar. En este caso, yo quiero 10. Después de configurar la VPC y los grupos de seguridad, haga clic en “Run Task”.
El comando Ejecutar tarea del último paso inicia 10 tareas (imagen 5), de las cuales ocho son iniciadas por el capacity provider FARGATE_SPOT y dos se inician con el capacity provider FARGATE (recuerde que la proporción que configuro es 4: 1).
Aquí podemos ver una tarea en ejecución. Vea cuidadosamente que el capacity provider es “FARGATE_SPOT”
En esta segunda tarea, el capacity provider utilizado es “FARGATE”
En la siguiente sección, exploraré cómo iniciar Tareas de tipo Fargate Spot mediante la línea de comandos de AWS o AWS CLI.
Creación de Tarea de tipo Fargate Spot en ECS mediante AWS CLI
Crear un clúster con capacity providers
Al crear un nuevo clúster usando la AWS CLI, usted debe especificar qué capacity providers utilizará. En el siguiente ejemplo especifiqué dos capacity providers: FARGATE y FARGATE_SPOT.
Ingrese el siguiente código para especificar los capacity providers:
$ bash aws ecs create-cluster \ --cluster-name "Fargate-Spot-Deep-Dive" --capacity-providers FARGATE FARGATE_SPOT
La salida de este comando debería ser similar a lo siguiente:
$ bash "cluster": { "status": "PROVISIONING", "defaultCapacityProviderStrategy": [], "statistics": [], "capacityProviders": [ "FARGATE", "FARGATE_SPOT" ], ...
Lanzar una tarea
Una vez que el clúster es creado, usted puede lanzar una Tarea de Fargate SPOT usando el comando “RunTask” y proporcionando el capacity provider de Spot en el campo –capacity-provider-strategy.
También debe especificar:
- Una definición de tarea
- Opciones de peso para Capacity providers (Weight)
- Una configuración de red (subredes, grupos de seguridad)
- Cuántas tareas desea ejecutar
En este ejemplo, yo definí estas especificaciones en el siguiente código:
$ bash aws ecs run-task \ --capacity-provider-strategy capacityProvider=FARGATE,weight=1 capacityProvider=FARGATE_SPOT,weight=1 \ --cluster "Fargate-Spot-Deep-Dive" \ --task-definition task-def-family:revision \ --network-configuration "awsvpcConfiguration={subnets=[string,string],securityGroups=[string,string],assignPublicIp=string}" \ -count integer \
Si usted especifica count = 10 y weight = 1 para ambos proveedores, se iniciarían 5 tareas FARGATE y 5 FARGATE_SPOT.
Crear un servicio
El siguiente ejemplo muestra cómo crear un servicio únicamente usando FARGATE_SPOT.
$ bash aws ecs create-service \ --capacity-provider-strategy capacityProvider=FARGATE,weight=1 capacityProvider=FARGATE_SPOT,weight=1 \ --cluster "Fargate-Spot-Deep-Dive" \ --service-name FargateService \ --task-definition task-def-family:revision \ --network-configuration "awsvpcConfiguration={subnets=[string,string],securityGroups=[string,string],assignPublicIp=string}" \ --desired-count integer \
También es posible crear un servicio con una combinación de tareas SPOT y on-demand usando el comando CreateService y proporcionando capacity providers tanto SPOT como on-demand en el campo de capacity-provider-strategy.
El atributo base es un campo opcional que dice que debe haber al menos cuatro tareas on-demand (la base predeterminada es 0, no puede especificar más de un capacity provider con una base distinta de cero). El peso o “weight” es otro campo opcional que dice que para las seis tareas restantes que no están administradas por el atributo base, debe haber una tarea on-demand por cada dos tareas SPOT.
$bash aws ecs create-service \ --cluster "my-cluster" --service-name "my-service" --desired-count 10 --capacity-provider-strategy [ {'capacityProvider':'FARGATE_SPOT', 'weight': 2, 'base': 0}, {'capacityProvider':'FARGATE', 'weight': 1, 'base': 4}, ] ...
Agregar los capacity providers FARGATE y FARGATE_SPOT a un clúster existente
$bash aws ecs put-cluster-capacity-providers \ --cluster "Fargate-Spot-Deep-Dive" \ --capacity-providers FARGATE FARGATE_SPOT existing_capacity_provider1 existing_capacity_provider2 \ --default-capacity-provider-strategy existing_default_capacity_provider_strategy \
Cómo manejar los avisos de terminación de Fargate Spot
Por diseño, Fargate Spot es un servicio interrumpible. Cuando las tareas que usan FARGATE_SPOT se detienen debido a una interrupción de Spot, se envía una advertencia de dos minutos antes de que se detenga una tarea.
La advertencia se envía como un evento de cambio de estado de la tarea a Amazon EventBridge y una señal SIGTERM a la tarea en ejecución. Cuando utilice Fargate Spot como parte de un servicio, el programador del servicio recibirá la señal de interrupción e intentará iniciar tareas adicionales en Fargate Spot si hay capacidad disponible.
Para garantizar que nuestros contenedores salgan sin problemas antes de que se detenga la tarea, se puede configurar lo siguiente:
Se puede especificar un valor stopTimeout de 120 segundos (2 minutos) o menos en la definición de contenedor que utiliza la tarea. Especificar un valor de stopTimeout nos da el tiempo entre el momento en que se recibe el evento de cambio de estado de la tarea y el momento en que el contenedor se detiene por la fuerza.
La señal SIGTERM debe recibirse desde el interior del contenedor para realizar cualquier acción de limpieza.
A continuación, se muestra un fragmento de un evento de cambio de estado de la tarea que muestra el motivo de detención y el código de detención de una interrupción de FARGATE_SPOT.
{ "version": "0", "id": "9bcdac79-b31f-4d3d-9410-fbd727c29fab", "detail-type": "ECS Task State Change", "source": "aws.ecs", "account": "111122223333", "resources": [ "arn:aws:ecs:us-east-1:111122223333:task/b99d40b3-5176-4f71-9a52-9dbd6f1cebef" ], "detail": { "clusterArn": "arn:aws:ecs:us-east-1:111122223333:cluster/default", "createdAt": "2016-12-06T16:41:05.702Z", "desiredStatus": "STOPPED", "lastStatus": "RUNNING", "stoppedReason": "Your Spot Task was interrupted.", "stopCode": "TerminationNotice", "taskArn": "arn:aws:ecs:us-east-1:111122223333:task/b99d40b3-5176-4f71-9a52-9dbd6fEXAMPLE", ... } }
Ejemplo de evento de error de ubicación de tarea de servicio
En caso de que FARGATE_SPOT no pueda colocar una Tarea debido a limitaciones de capacidad; Se entregan los eventos de error de colocación de tareas de servicio.
En el siguiente ejemplo, la tarea intentó utilizar el proveedor de capacidad FARGATE_SPOT, pero el programador de servicios no pudo adquirir ninguna capacidad de Fargate Spot.
{ "version": "0", "id": "ddca6449-b258-46c0-8653-e0e3a6d0468b", "detail-type": "ECS Service Action", "source": "aws.ecs", "account": "111122223333", "time": "2019-11-19T19:55:38Z", "region": "us-west-2", "resources": [ "arn:aws:ecs:us-west-2:111122223333:service/default/servicetest" ], "detail": { "eventType": "ERROR", "eventName": "SERVICE_TASK_PLACEMENT_FAILURE", "clusterArn": "arn:aws:ecs:us-west-2:111122223333:cluster/default", "capacityProviderArns": [ "arn:aws:ecs:us-west-2:111122223333:capacity-provider/FARGATE_SPOT" ], "reason": "RESOURCE:FARGATE", "createdAt": "2019-11-06T19:09:33.087Z" } }
Amazon EventBridge le permite automatizar sus servicios de AWS y responder automáticamente a eventos del sistema, como problemas de disponibilidad de aplicaciones o cambios de recursos. Los eventos de los servicios de AWS se entregan a EventBridge casi en tiempo real. Puede escribir reglas simples para indicar qué eventos son de su interés y qué acciones automatizadas realizar cuando un evento coincide con una regla.
Puede encontrar más detalles sobre cómo utilizar Amazon ECS Events aquí.
Precios de Fargate SPOT
Con AWS Fargate, no hay pagos por adelantado y solo paga por los recursos que utiliza. Usted paga por la cantidad de vCPU y recursos de memoria que consumen sus aplicaciones en contenedores.
El precio por hora de CPU al contado y por hora de GB es el mismo en todas las zonas de disponibilidad y configuraciones de tareas. Sin embargo, el precio varía a lo largo del día. El último precio está disponible en la página de precios de Fargate. El precio es por segundo con un mínimo de 1 minuto. La duración se calcula desde el momento en que comienza a descargar la imagen de su contenedor (Docker pull) hasta que finaliza la tarea, redondeada al segundo más cercano.
Mejores prácticas de Fargate SPOT
- Fargate Spot es ideal para cargas de trabajo sin estado o “stateless” y tolerantes a fallas, pero no confíe únicamente en tareas Spot para cargas de trabajo críticas, la mejor opción es configurar una combinación de tareas bajo demanda y tareas spot de Fargate
- Las aplicaciones que se ejecutan en Fargate Spot deben ser tolerantes a fallas
- Maneje las interrupciones adecuadamente captando señales SIGTERM
Conclusión
Fargate Spot es ideal para cargas de trabajo paralelizables como renderizado de imágenes, simulaciones de Monte Carlo y procesamiento genómico. Sin embargo, los clientes también pueden utilizar Fargate Spot para tareas que se ejecutan como parte de los servicios ECS, como sitios web y API, que requieren alta disponibilidad.
ECS Fargate ya ha facilitado la ejecución de cargas de trabajo en contenedores sin preocuparse por la configuración y la gestión de la infraestructura. Fargate Spot lo hace más asequible para sus cargas de trabajo sensibles al precio. Con la combinación adecuada de Capacity providers FARGATE y FARGATE_SPOT, puede obtener la capacidad óptima para sus tareas dentro del presupuesto.
Disponible hoy
AWS Fargate SPOT está disponible para todos nuestros clientes. Para obtener más información, consulte la siguiente liga: https://aws.amazon.com/es/about-aws/whats-new/2019/12/aws-launches-fargate-spot-save-up-to-70-for-fault-tolerant-applications/
Más información:
Comienza hoy haciendo estos laboratorios:
Este artículo fue traducido del Blog de AWS en Inglés.
Sobre el
Jesús Humberto Contreras Rancurello es Senior Solutions Architect en AWS Mexico.