Saltar al contenido

¿Cómo soluciono los problemas de un agente de Amazon ECS desconectado?

8 minutos de lectura
0

Mis instancias de contenedor de Amazon Elastic Container Service (Amazon ECS) están desconectadas.

Descripción corta

Es normal que su agente de contenedor de Amazon ECS se desconecte y vuelva a conectarse varias veces en una hora como parte del funcionamiento normal. Estos eventos de cambio no son motivo de preocupación. Es posible que los eventos de conexión que duran solo unos minutos no indiquen problemas con el agente o la instancia de contenedor.

Sin embargo, si el agente de contenedor permanece desconectado durante más tiempo, la instancia de contenedor no podrá funcionar como parte de su clúster de Amazon ECS. Este problema puede deberse a uno de los siguientes motivos:

  • Hay problemas de red que impiden la comunicación entre la instancia y Amazon ECS.
  • El agente de contenedor no tiene los permisos necesarios de AWS Identity and Access Management (IAM) para comunicarse con los puntos de conexión de Amazon ECS.
  • Hay problemas con el host o el daemon de Docker dentro de la instancia de contenedor.
  • Hay contención de recursos en el host subyacente.

Nota: Se recomienda utilizar la versión más reciente del agente de contenedor de Amazon ECS.

Resolución

Nota: La siguiente solución es aplicable a las AMI de Amazon Linux 2 optimizadas para Amazon ECS.

Puede usar claves SSH para conectarse a sus instancias de Amazon EC2. Si no ha generado las claves SSH, puede usar el Administrador de sesiones, una capacidad de AWS Systems Manager, para conectarse a la instancia. De forma predeterminada, Systems Manager Agent se instala en las AMI de Amazon Linux 2 y en las AMI base optimizadas para ECS de Amazon Linux 2.

Comprobación de si el agente de contenedor se está ejecutando en la instancia de contenedor

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:

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

El resultado especifica que está activo (en ejecución) y tiene un aspecto similar al siguiente:

ecs.service - Amazon Elastic Container Service - container agent   Loaded: loaded (/usr/lib/systemd/system/ecs.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2022-02-15 15:51:09 UTC; 37min ago
     Docs: https://aws.amazon.com/documentation/ecs/
  Process: 30039 ExecStopPost=/usr/libexec/amazon-ecs-init post-stop (code=exited, status=0/SUCCESS)
  Process: 29987 ExecStop=/usr/libexec/amazon-ecs-init stop (code=exited, status=0/SUCCESS)
  Process: 30077 ExecStartPre=/usr/libexec/amazon-ecs-init pre-start (code=exited, status=0/SUCCESS)
 Main PID: 30123 (amazon-ecs-init)
    Tasks: 5
   Memory: 3.7M
   CGroup: /system.slice/ecs.service
           └─30123 /usr/libexec/amazon-ecs-init start

CONTAINER ID   IMAGE                                            COMMAND    CREATED      STATUS                PORTS     NAMES
eb1dc8d4ab3b   amazon/amazon-ecs-agent:latest   "/agent"        3 days ago   Up 3 days (healthy)                        ecs-agent

Si el problema se debe a la desconexión de un agente, ejecute el siguiente comando para reiniciar el agente ECS:

$ sudo systemctl restart ecs

Nota: No se devuelve ningún resultado después de ejecutar los comandos anteriores.

Para comprobar que el agente se está ejecutando, ejecute el siguiente comando:

sudo systemctl status ecs

Comprobación de si el servicio de Docker se está ejecutando en la instancia de contenedor

Para comprobar que el servicio de Docker se esté ejecutando en la instancia de contenedor afectada, ejecute el siguiente comando:

sudo systemctl status docker

El resultado especifica que está activo (en ejecución) y tiene un aspecto similar al siguiente:

docker.service - Docker Application Container Engine   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2022-02-11 17:42:32 UTC; 3 days ago
     Docs: https://docs.docker.com
  Process: 4307 ExecStartPre=/usr/libexec/docker/docker-setup-runtimes.sh (code=exited, status=0/SUCCESS)
  Process: 4296 ExecStartPre=/bin/mkdir -p /run/docker (code=exited, status=0/SUCCESS)
 Main PID: 4315 (dockerd)
    Tasks: 24
   Memory: 360.5M
   CGroup: /system.slice/docker.service
           ├─4315 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --default-ulimit nofile=32768:65536
           ├─6010 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.2 -container-port 80
           └─6016 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 80 -container-ip 172.17.0.2 -container-port 80

Si el servicio de Docker está inactivo, ejecute el siguiente comando para reiniciarlo:

sudo systemctl restart docker

Nota: No se devuelve ningún resultado después de ejecutar los comandos anteriores.

Para comprobar que el servicio de Docker se ha reiniciado, ejecute el siguiente comando:

sudo systemctl status docker

Revisión de los archivos de registro del agente de contenedor y Docker

Si la instancia de contenedor sigue desconectada, revise los archivos de registro del host del contenedor del agente de contenedor y Docker.

Compruebe los siguientes archivos de registro para ver si hay palabras clave como "error", "warn" o "agent transition state":

  • Consulte los registros más recientes del agente de contenedor de Amazon ECS en /var/log/ecs/ecs-agent.log
    Nota:
    Puede ver el registro rotado si lo filtra a /var/log/ecs/ecs-agent-log.timestamp.
  • Consulte el registro de init de Amazon ECS en /var/log/ecs/ecs-init.log.
  • Consulte los registros de ejecución de datos de usuario en /var/log/cloud-init.log.
  • Consulte los registros de daemon de Docker con el comando sudo journalctl -u docker.

Si usa Linux, también puede revisar el código de salida para obtener más información sobre el contenedor de agentes detenido. Para más información, consulte exitcodes en el sitio web de GitHub.

Para obtener el código de salida, ejecute el siguiente comando:

docker inspect your container ID

Sustituya el ID del contenedor por el ID del contenedor detenido.

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 contenedor para Amazon ECS.

Comprobación de si el perfil de instancia de IAM tiene los permisos necesarios

Si el agente de contenedor sigue desconectado, compruebe que el perfil de instancia de IAM asociado a la instancia de contenedor tenga los permisos de IAM necesarios.

  1. Use SSH o el Administrador de sesiones para conectarse a la instancia.

  2. Para ver los metadatos de la instancia en el perfil de instancia asociado a ella, ejecute el siguiente comando:

    curl http://169.254.169.254/latest/meta-data/iam/info

    El resultado es similar al siguiente:

    {
      "Code" : "Success",
      "LastUpdated" : "2022-02-16T22:42:17Z",
      "InstanceProfileArn" : "arn:aws:iam::1122334455:instance-profile/ecsInstanceRole",
      "InstanceProfileId" : "AIPA4VIZXOFF55F72XIZN"
    }
  3. Compruebe que el rol de IAM contenga los permisos correctos para las instancias de contenedor.

  4. Para verificar errores de credenciales específicos, ejecute un comando similar al siguiente para comprobar en el registro del agente de contenedor una lista de los registros de ECS:

    cat /var/log/ecs/ecs-agent.log.YYYY-MM-DD-##

    Sustituya AAAA-MM-DD-## por la marca de tiempo correspondiente.

Nota: El registro del agente de contenedor rota cada hora. El sufijo cambia automáticamente para reflejar la fecha y la hora actuales. Actualice el comando para incluir el intervalo de fechas y el identificador de registro de cuando se produjo el problema.

Verificación de que la instancia de contenedor tenga suficientes recursos para ejecutar el agente de ECS

Si sus tareas utilizan mucha memoria o CPU, es posible que la instancia de contenedor no tenga recursos suficientes para ejecutar el agente de ECS.

El agente de contenedor de Amazon ECS usa la función ReadMemInfo() de Docker para consultar la cantidad de memoria disponible del sistema operativo.

Ejecute el siguiente comando en la instancia de contenedor para ver la memoria total que reconoce el sistema operativo:

free -b

Ejemplo de resultado de una instancia t2.large que ejecuta la AMI de Amazon Linux optimizada para Amazon ECS:

                          total        used         free                   shared     buff/cache    available
Mem:                    8361193472   298577920     7325388800              405504      737226752    7844274176
Swap:                     0              0           0

Puede optar por reservar algo de memoria para el agente de contenedor de Amazon ECS y para otros procesos críticos del sistema en sus instancias de contenedor. Al reservar esta memoria, podrá asegurarse de que los contenedores de la tarea no intenten ocupar el mismo espacio de memoria. Para más información, consulte Reserva de memoria de instancias de contenedor Linux de Amazon ECS.

Verificación de que la variable de entorno ECS_CLUSTER tenga el nombre de clúster correcto

Si el parámetro de configuración del agente de contenedor de Amazon ECS ECS_CLUSTER tiene un nombre de clúster incorrecto, la instancia de contenedor no podrá unirse al clúster. Para comprobar el contenido del archivo /etc/ecs/ecs.config y comprobar este parámetro, ejecute el siguiente comando:

cat /etc/ecs/ecs.config

Verificación de que el agente de ECS puede comunicarse con los puntos de enlace de ECS

Para conectarse con los puntos de enlace de ECS, las listas de control de acceso a la red y el grupo de seguridad de instancias de contenedor deben permitir las conexiones salientes en el puerto 443 (HTTPS).

Para comprobar las conexiones salientes a los puntos de enlace de ECS (ACS/TCS), ejecute uno de los siguientes comandos en su instancia de contenedor:

sudo yum install telnet -y$ telnet ecs.region.amazonaws.com 443

Alternativa:

$ curl https://ecs.region.amazonaws.com

Revise estas prácticas recomendadas:

Información relacionada

Solución de problemas de Amazon ECS

Creación del rol de instancia de contenedor

Visualización de los registros del agente de contenedor de Amazon ECS

OFICIAL DE AWSActualizada hace un año