Saltar al contenido

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

9 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 provocan que las tareas de Amazon ECS se queden bloqueadas en el estado PENDING:

  • El daemon de Docker no responde.
  • Hay una restricción de recursos en el clúster.
  • 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.
  • No has configurado correctamente el enrutamiento de Amazon Virtual Private Cloud (Amazon VPC).
  • Un contenedor esencial depende de los contenedores no esenciales que no se encuentran en estado HEALTHY.
  • El rol de AWS Identity and Access Management (IAM) que has asociado a tus tareas de Amazon ECS falta o es incorrecto.
  • Hay problemas de compatibilidad de imágenes con la versión de Windows que has seleccionado.

Resolución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de errores para la AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.

El daemon de Docker no responde o hay una restricción de recursos en el clúster

En la definición de la tarea, comprueba si la tarea solicita más memoria o CPU de la que puede admitir la instancia. Ajusta los recursos de la instancia de contenedor en función de tus necesidades.

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

  1. Utiliza las métricas de Amazon CloudWatch para comprobar si la instancia de contenedor ha superado la cuota máxima de CPU.
  2. Aumenta el tamaño de la instancia de contenedor según sea necesario.

En caso de problemas de memoria, sigue estos pasos:

  1. Ejecuta el comando free para ver cuánta memoria hay disponible para el sistema.
  2. Aumenta el tamaño de la instancia de contenedor según sea necesario.

Para problemas de E/S, sigue estos pasos:

  1. Ejecuta el comando iotop.
  2. Identifica las tareas de cada servicio que utilizan la mayor cantidad de operaciones de entrada/salida por segundo (IOPS).
  3. Utiliza restricciones y estrategias de ubicación de tareas para distribuir las tareas en distintas instancias de contenedores.
    Alternativa:
    Utiliza CloudWatch para crear una alarma para las métricas de equilibrio de ráfagas de Amazon Elastic Block Store (Amazon EBS). A continuación, utiliza una función de AWS Lambda o tu 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, ajusta el parámetro ECS_IMAGE_PULL_BEHAVIOR para usar el almacenamiento en caché de imágenes. Por ejemplo, define el parámetro ECS_IMAGE_PULL_BEHAVIOR como prefer-cached en /etc/ecs/ecs.config. Si utilizas prefer-cached, Amazon ECS extrae la imagen de forma remota cuando no hay ninguna imagen en caché. De lo contrario, Amazon ECS usa la imagen en caché de la instancia.

El agente de contenedores de Amazon ECS ha perdido la conectividad con el servicio Amazon ECS en medio de un lanzamiento

Para verificar el estado y la conectividad del agente de contenedores de Amazon ECS, ejecuta los siguientes comandos en la instancia de contenedor en función de tu versión de Amazon Linux.

Amazon Linux 1:

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

Amazon Linux 2:

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

Si el estado del resultado es inactivo, el agente se desconecta. Para resolver este problema, ejecuta los siguientes comandos para reiniciar el agente de contenedores.

Amazon Linux 1:

sudo stop ecs
sudo start ecs

Amazon Linux 2:

sudo systemctl stop ecs
sudo systemctl start ecs

Obtendrás un resultado similar al mensaje siguiente:

ecs start/running, process abcd

Para determinar la conectividad del agente, comprueba los siguientes registros durante el periodo de tiempo correspondiente para detectar palabras clave como error, advertencia o estado de transición del agente:

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

Utiliza la información de los registros para identificar la causa principal de los problemas de conectividad.

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

Para ver el estado de las tareas locales en tiempo real en la instancia de contenedor, ejecuta el siguiente comando para ver los metadatos de las tareas en ejecución en la instancia de contenedor:

curl http://localhost:51678/v1/metadata

Se mostrará un resultado parecido al siguiente ejemplo:

{  "Cluster": "CLUSTER_ID",
  "ContainerInstanceArn": "arn:aws:ecs:REGION:ACCOUNT_ID:container-instance/TASK_ID",
  "Version": "Amazon ECS Agent - AGENT "
}

En el resultado, asegúrate de que las variables de entorno de la tarea, la CPU, la memoria y la configuración del rol de IAM sean correctas. Además, asegúrate de que la tarea tenga los secretos necesarios.

Para ver información detallada sobre todas las tareas que se ejecutan en el servicio, ejecuta el siguiente comando:

curl http://localhost:51678/v1/tasks

Se mostrará un resultado parecido al siguiente ejemplo:

{  "Tasks": [
    {
      "Arn": "arn:aws:ecs:REGION:ACCOUNT_ID:task/TASK_ID",
      "DesiredStatus": "RUNNING",
      "KnownStatus": "RUNNING",
      ... ...
    }
  ]
}

En los resultados de los comandos anteriores, comprueba si hay diferencias entre el agente local y el servicio Amazon ECS. Usa esta información para identificar dónde y por qué la tarea está atascada.

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

Cuando Amazon ECS envía nuevas tareas para que pasen del estado PENDING al estado RUNNING, es posible que el agente de contenedores tenga tareas existentes que detener. En este caso, el agente no inicia las nuevas tareas hasta que primero detiene las tareas existentes.

Para controlar el tiempo de espera de inicio y detención del contenedor a nivel de instancia de contenedor, ajusta las variables de entorno de las variables ECS_CONTAINER_STOP_TIMEOUT y ECS_CONTAINER_START_TIMEOUT en /etc/ecs/ecs.config. ECS_CONTAINER_STOP_TIMEOUT establece el tiempo que pasa antes de que Amazon ECS fuerce el cierre de tus contenedores si no se cierran por sí solos. El valor del tiempo de espera de detención predeterminado para Linux y Windows es de 30 segundos. ECS_CONTAINER_START_TIMEOUT establece el tiempo que pasa antes de que el agente de contenedores de Amazon ECS deje de intentar iniciar el contenedor. El tiempo de espera de inicio predeterminado es de 3 minutos para Linux y de 8 minutos para Windows.

Si la versión de tu agente es la 1.26.0 o posterior, puedes definir los parámetros de tiempo de espera de detención e inicio en cada tarea. Ten en cuenta que, al cambiar el parámetro, la tarea puede cambiar al estado STOPPED. Por ejemplo, la instancia de contenedor A depende de que la instancia de contenedor B alcance el estado COMPLETE, SUCCESS o HEALTHY. No has especificado un valor de startTimeout para la instancia de contenedor B. Si la instancia de contenedor B no alcanza el estado necesario dentro del tiempo de espera, la instancia de contenedor A no se iniciará.

Para ver un ejemplo de dependencia de contenedores, consulta Example: Container dependency (Ejemplo: dependencia de contenedores) en el sitio web de GitHub.

No has configurado correctamente el enrutamiento de Amazon VPC

Comprueba la configuración de la subred de VPC en la que se ejecutan las tareas de Amazon ECS o AWS Fargate. La subred debe tener acceso a Amazon ECS o Amazon Elastic Container Registry (Amazon ECR). Para resolver este problema, asegúrate de que la tabla de enrutamiento de la subred tenga una puerta de enlace de Internet o una puerta de enlace de NAT. Si lanzas una tarea en una subred que no tiene una ruta de salida a Internet, utiliza AWS PrivateLink. Esta configuración te permite acceder a las API de Amazon ECS con direcciones IP privadas.

Además, asegúrate de que las reglas del grupo de seguridad permitan la comunicación entrante y saliente a través de los puertos obligatorios de tu configuración.

Una instancia de contenedor esencial depende de las instancias de contenedor no esenciales que no se encuentran en estado HEALTHY

Si una instancia de contenedor no esencial de la que depende una instancia de contenedor esencial no se encuentra en estado HEALTHY, la tarea quedará atascada en PENDING. Recibirás el mensaje “stoppedReason”:”Service ABCXYZ: task last status remained in PENDING too long”.

Para resolver este problema, asegúrate de que las instancias de contenedores no esenciales funcionen según lo previsto. Si no puedes resolver el problema subyacente, actualiza la definición de la tarea de las instancias de contenedor y establece el parámetro essential en true. Si la tarea sigue detenida, comprueba el motivo de la detención. Para obtener más información sobre los pasos para la solución de problemas, consulta ¿Por qué se detiene mi tarea de Amazon ECS?

Falta el rol de IAM o está mal configurado

Si la tarea está en una instancia de contenedor que no tiene los permisos necesarios, recibirás un error similar al del siguiente ejemplo:

“(service test) failed to launch a task with (error ECS was unable to assume the role 'arn:aws:iam::111111111111:role/test-fTa-T3J4hVnyL53E' that was provided for this task. Please verify that the role being passed has the proper trust relationship and permissions and that your IAM user has permissions to pass this role.)”.

Para resolver este problema, asegúrate de que la instancia de contenedor tenga los permisos necesarios.

Además, si no utilizas una imagen de máquina de Amazon (AMI) optimizada para Amazon ECS para las instancias de contenedor, comprueba las configuraciones del agente de Amazon ECS.

Hay problemas de compatibilidad de imágenes con la versión de Windows que has seleccionado

Se produce un error en las tareas cuando la imagen que se usa en las tareas de Windows Fargate no es compatible con la plataforma. Para comprobar si la imagen es compatible con el host del servidor de Windows, consulta la compatibilidad de las versiones del contenedor de Windows en el sitio web de Microsoft. A continuación, comprueba los requisitos previos para ejecutar las tareas de Windows.

Además, asegúrate de que la URL de la imagen que has definido sea correcta.

Información relacionada

Dependencia de contenedor

amazon-ecs-agent en el sitio web de GitHub

OFICIAL DE AWSActualizada hace 10 meses