Amazon ECS: contenedores Docker

ECS es un servicio de orquestación de contenedores administrado por AWS.

ECS Task

Una tarea ECS se define como un conjunto de metadatos en formato JSON, que indica a ECS cómo ejecutar un contenedor Docker.

Contiene esta información:

  • Nombre de la imagen
  • Puerto al que asociar el contenedor y el host (Port Translation)
  • Memoria y CPU requerida
  • Variables de entorno
  • Información de red

ECS Service

Un servicio ECS define cuántas tareas y de qué forma se deben ejecutar las tareas ECS definidas previamente. Se asegura que el número de tareas se ejecutan tal como se han definido en el servicio, a través de las instancias EC2 desplegadas.

Un servicio se puede asociar a un ELB si es necesario.

ECR

ECR es un repositorio privado de imagenes Docker. Similar a Docker Hub, pero integrado en AWS y permite almacenar imagenes privadas de nuestros contenedores.

El acceso se controla mediante IAM, de la sigueinte forma desde el CLI:

  • CLI v1
$(aws ecr get-login -no-include-email --region eu-west-1)
  • CLI v2
aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 1234567890.dkr.ecr.eu-west-1.amazonaws.com

Para subir una imagen:

docker push 1234567890.dkr.ecr.eu-west-1.amazonaws.com/imagen:latest

Para descargar una imagen:

docker pull 1234567890.dkr.ecr.eu-west-1.amazonaws.com/imagen:latest

Fargate

Fargate proporciona una infraestructura de contenedores de tipo serverless, es decir, no tenemos que desplegar instancias EC2 ni preocuparnos de donde se ejecutan nuestros contenedores. AWS se encarga de gestionar la infraestructura, y nosotros solo debemos preocuparnos de crear la definición de tareas, y ellos se encargan de su ejecución.

Roles IAM

ECS necesita roles para definir permisos a varios niveles:

  • Instancia EC2: cada instancia EC2 necesita permisos para
    • Agente ECS (que corre como un contenedor Docker)
    • Llamadas al API de ECS
    • Enviar logs a CloudWatch Logs
    • Bajar imagenes de ECR
  • Tareas ECS:
    • Cada tarea necesita permisos diferentes, por tanto será un rol distinto para cada tipo de tarea dependiendo sus necesidades (acceso a S3, …)

Alojar contenedores en instancias EC2

En el modo EC2 de ECS, cada vez que se despliega un nuevo contenedor, el clúster debe decidir en qué instancia EC2 desplegar ese nuevo contenedor. Para ello, primero debe seleccionar qué instancias pueden contener un nuevo contenedor:

  1. Identificar las instancias que cumplen el requisito de memoria, CPU y puertos según la definición de la tarea
  2. Identificar las instancias que cumplen con las restricciones definidas
  3. Identificar las instancias que cumplen con la estrategia definida.
  4. Seleccionar la instancia para alojar el contenedor

Estrategias para distribuir los contenedores

  • Binpack: la idea es completar una instancia con todos los contenedores posibles antes de alojarlos en otra instancia. De esta forma, se minimiza el número de instancias EC2 necesarias.
  • Random: alojar los contenedores en una instancia de forma aleatoria
  • Spread: trata de distribuir los contenedores entre todas las AZ existentes, tratando de mantener el mismo número de instancias en cada AZ

Se pueden mezclar, eligiendo varias estrategias simultáneas.

Restricciones para distribuir los contenedores

  • distinctInstance: cada tarea debe desplegarse en una instancia diferente
  • memberOf: alojar cada contenedor/tarea en una instancia que cumpla con la expresión definida, ej:
"placementContraints": [
   {
      "expression": "attribute:ecs.instance-type =~ t3.*",
      "type": "memberOf"
   }
]

Autoescalado de ECS

El consumo de CPU y RAM es registrado en CloudWatch al nivel de ECS, por tanto se pueden definir políticas de autoescalado a nivel de servicio:

  • Target Tracking: definir un objetivo en base a una métrica de CloudWatch
  • Step Scaling: política de escalado basado en alarmas de CloudWatch
  • Scheduling Scaling: basado en definición previa

Capacity Provider

Es el servicio que permite autoescalar a nivel de instancias EC2 o Fargate, para ajustar el número de instancias necesarias para ejecutar nuevas tareas ECS, sin necesidad de preocuparse por la infraestructura.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.