¿Por qué mi tarea de Amazon ECS está bloqueada en estado PENDING?

7 minutos de lectura
0

Mi tarea de Amazon Elastic Container Service (Amazon ECS) se ha quedado bloqueada en estado PENDING.

Descripción breve

Las siguientes situaciones suelen provocar que las tareas de Amazon ECS se queden bloqueadas en el estado PENDING:

  • El daemon de Docker no responde.
  • La imagen de Docker es grande.
  • El agente de contenedores de Amazon ECS perdió la conectividad con el servicio Amazon ECS en medio del lanzamiento de una tarea.
  • El agente de contenedores de Amazon ECS tarda mucho en detener una tarea existente.
  • El enrutamiento de Amazon Virtual Private Cloud (Amazon VPC) no está configurado correctamente.
  • Un contenedor esencial depende de contenedores no esenciales que no están en HEALTHY.

Resolución

Para ver por qué la tarea está bloqueada en estado PENDING, complete los siguientes pasos de solución de problemas.

Nota: Si recibe errores al ejecutar comandos de AWS Command Line Interface (AWS CLI), asegúrese de utilizar la versión más reciente de AWS CLI.

El daemon de Docker no responde

En caso de problemas con la CPU, siga estos pasos:

  1. Utilice las métricas de Amazon CloudWatch para ver si su instancia de contenedor superó el máximo de CPU.

  2. Aumente el tamaño de la instancia de contenedor según sea necesario.

En caso de problemas de memoria, siga estos pasos:

  1. Ejecute el comando free para ver cuánta memoria hay disponible para el sistema.

  2. Aumente el tamaño de la instancia de contenedor según sea necesario.

Para problemas de E/S, siga estos pasos:

  1. Ejecute el comando iotop.

  2. Descubra qué tareas de qué servicios utilizan la mayor cantidad de IOPS. A continuación, utilice restricciones y estrategias de ubicación de tareas para distribuir estas tareas en distintas instancias de contenedores.

-o bien-

Utilice CloudWatch para crear una alarma para las métricas de BurstBalance de Amazon Elastic Block Store (Amazon EBS). A continuación, utilice una función de AWS Lambda o su propia lógica personalizada para equilibrar las tareas.

La imagen de Docker es grande

Las imágenes más grandes tardan más en descargarse y aumentan el tiempo que la tarea permanece en estado PENDING.

Para agilizar el tiempo de transición, ajuste el parámetro ECS_IMAGE_PULL_BEHAVIOR para aprovechar el almacenamiento en caché de imágenes.

**Nota:**Por ejemplo, defina el parámetro ECS_IMAGE_PULL_BEHAVIOR como prefer-cached en /etc/ecs/ecs.config. Si se especifica prefer-cached, la imagen se extrae de forma remota cuando no haya ninguna imagen en caché. De lo contrario, se utiliza la imagen en caché de la instancia.

El agente de contenedores de Amazon ECS perdió la conectividad con el servicio Amazon ECS en medio de un lanzamiento

  1. Para comprobar el estado y la conectividad del agente de contenedores de Amazon ECS, ejecute uno de los siguientes comandos en la instancia de contenedor.

Ejecute el siguiente comando para Amazon Linux 1:

$ sudo status ecs
$ sudo docker ps -f name=ecs-agent

Ejecute el siguiente comando para Amazon Linux 2:

$ sudo systemctl status ecs
$ sudo docker ps -f name=ecs-agent

Nota: Verá que el resultado indica active/running.

  1. Para ver los metadatos de las tareas en ejecución en su instancia de contenedores de ECS, ejecute los siguientes comandos en la instancia de contenedor:
$ curl http://localhost:51678/v1/metadata

Recibirá el siguiente resultado:

{
  "Cluster": "CLUSTER_ID",
  "ContainerInstanceArn": "arn:aws:ecs:REGION:ACCOUNT_ID:container-instance/TASK_ID",
  "Version": "Amazon ECS Agent - AGENT "
}
  1. Para ver información sobre las tareas en ejecución, ejecute el siguiente comando en su instancia de contenedor:
$ curl http://localhost:51678/v1/tasks

Recibirá el siguiente resultado:

{
  "Tasks": [
    {
      "Arn": "arn:aws:ecs:REGION:ACCOUNT_ID:task/TASK_ID",
      "DesiredStatus": "RUNNING",
      "KnownStatus": "RUNNING",
      ... ...
    }
  ]
}
  1. Si el problema está relacionado con un agente desconectado, reinicie el agente de contenedores con uno de los siguientes comandos.

Ejecute el siguiente comando para Amazon Linux 1:

$ sudo stop ecs
$ sudo start ecs

Ejecute el siguiente comando para Amazon Linux 2:

$ sudo systemctl stop ecs
$ sudo systemctl start ecs

Recibirá un resultado similar al mensaje siguiente:

ecs start/running, process xxxx
  1. Para determinar la conectividad del agente, compruebe los siguientes registros durante el periodo de tiempo correspondiente para detectar palabras clave como error, advertencia, o estado de transición del agente:

Consulte el registro del agente de contenedores de Amazon ECS en /var/log/ecs/ecs-agent.log.yyyy-mm-dd-hh.
Consulte el registro de init de Amazon ECS en /var/log/ecs/ecs-init.log.
Consulte los registros de Docker en /var/log/docker.

**Nota:**También puede utilizar el recopilador de registros de Amazon ECS para recopilar registros generales del sistema operativo, registros de Docker y registros de agentes de contenedores para Amazon ECS.

El agente de contenedores de Amazon ECS tarda mucho en detener una tarea existente

Cuando el agente de contenedores recibe nuevas tareas para iniciar desde Amazon ECS (de PENDING a RUNNING), es posible que tenga que detener tareas antiguas. En este caso, el agente no inicia estas tareas nuevas hasta que las tareas antiguas se hayan detenido.

Para controlar el tiempo de espera de parada e inicio del contenedor a nivel de instancia de contenedor, defina los dos parámetros siguientes:

  1. En /etc/ecs/ecs.config, ajuste el valor del parámetro ECS_CONTAINER_STOP_TIMEOUT . Este parámetro establece el tiempo que transcurre antes de que Amazon ECS cierre forzosamente sus contenedores si no se cierran normalmente por sí solos.

**Nota:**El valor predeterminado para Linux y Windows es 30s.

  1. En /etc/ecs/ecs.config, ajuste el valor del parámetro ECS_CONTAINER_START_TIMEOUT . Este parámetro establece el tiempo que transcurre antes de que el agente de contenedores de Amazon ECS deje de intentar iniciar el contenedor.

Nota: El valor predeterminado es 3m para Linux y 8m para Windows.

Si la versión de su agente es la 1.26.0 o posterior, puede definir los parámetros de tiempo de espera de parada e inicio anteriores por tarea. Esto podría hacer que la tarea pase a un estado STOPPED. Por ejemplo, supongamos que containerA depende de que containerB alcance el estado COMPLETE, SUCCESS o bien HEALTHY. Si no especifica un valor startTimeout para containerB y containerB no alcanza el estado deseado dentro de ese tiempo, containerA no se inicia.

Para ver un ejemplo de dependencia de contenedores, consulte Example: Container dependency en AWS GitHub.

El enrutamiento de Amazon VPC no está configurado correctamente

Compruebe la configuración de la subred de VPC en la que se ejecutan las tareas de Amazon ECS o Fargate. Si la subred no está configurada correctamente, no tiene acceso a Amazon ECS ni a Amazon ECR. Para resolver este problema, asegúrese de que la tabla de enrutamiento de la subred tenga una puerta de enlace de Internet o una puerta de enlace NAT. Si lanza una tarea en una subred que no tiene una ruta de salida a Internet, utilice AWS PrivateLink. Esto le permite acceder de forma privada a las API de Amazon ECS con direcciones IP privadas.

Un contenedor esencial depende de contenedores no esenciales que no tienen un estado HEALTHY

Si los contenedores no esenciales no se encuentran en estado HEALTHY y un contenedor esencial depende de ellos, la tarea queda bloqueada en estado PENDING. En este caso, aparecerá el siguiente mensaje:

"stoppedReason":"Service ABCXYZ: task last status remained in PENDING too long."

Para resolver este problema, asegúrese de que los contenedores dependientes (non-essential) funcionan según lo previsto. Si no puede resolver el problema subyacente, convierta estos contenedores en esenciales para evitar que una tarea se quede bloqueada en estado PENDING durante demasiado tiempo.

Información relacionada

Dependencia de contenedor

Amazon ECS Container Agent (AWS GitHub)

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año