Por que minha tarefa do Amazon ECS está presa no estado PENDENTE?

7 minuto de leitura
0

Minha tarefa do Amazon Elastic Container Service (Amazon ECS) ficou presa no estado PENDENTE.

Breve descrição

Os cenários a seguir geralmente fazem com que as tarefas do Amazon ECS fiquem presas no estado PENDENTE:

  • O daemon do Docker não está respondendo.
  • A imagem do Docker é grande.
  • O agente de contêiner do Amazon ECS perdeu a conectividade com o serviço do Amazon ECS no meio da execução de uma tarefa.
  • O agente de contêiner do Amazon ECS leva muito tempo para interromper uma tarefa existente.
  • Seu roteamento da Amazon Virtual Private Cloud (Amazon VPC) não está configurado corretamente.
  • Um contêiner essencial depende de contêineres não essenciais que não são ÍNTEGROS.

Resolução

Para ver por que sua tarefa está presa no estado PENDENTE, conclua as etapas de solução de problemas a seguir.

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), certifique-se de estar usando a versão mais recente da AWS CLI.

O daemon do Docker não está respondendo

Para problemas de CPU, conclua as seguintes etapas:

1.Use as métricas do Amazon CloudWatch para ver se sua instância de contêiner excedeu a CPU máxima.

2.Aumente o tamanho da sua instância de contêiner conforme necessário.

Para problemas de memória, conclua as seguintes etapas:

1.Execute o comando gratuito para ver quanta memória está disponível para o seu sistema.

2.Aumente o tamanho da sua instância de contêiner conforme necessário.

Para problemas de E/S, conclua as seguintes etapas:

1.Execute o comando iotop.

2.Descubra quais tarefas em quais serviços estão usando mais IOPS. Em seguida, use as restrições e estratégias de posicionamento de tarefas para distribuir essas tarefas em instâncias de contêiner distintas.

-ou-

Use o CloudWatch para criar um alarme para suas métricas do Amazon Elastic Block Store (Amazon EBS) BurstBalance. Em seguida, use uma função do AWS Lambda ou sua própria lógica personalizada para equilibrar as tarefas.

A imagem do Docker é grande

Imagens maiores demoram mais para serem baixadas e aumentam o tempo em que a tarefa fica no estado PENDENTE.

Para acelerar o tempo de transição, ajuste o parâmetro ECS_IMAGE_PULL_BEHAVIOR parameter para aproveitar o armazenamento em cache de imagens.

Observação: por exemplo, defina o parâmetro ECS_IMAGE_PULL_BEHAVIOR como prefer-cached em /etc/ecs/ecs.config. Se prefer-cached for especificado, a imagem será extraída remotamente quando não houver imagem em cache. Caso contrário, a imagem em cache na instância será usada.

O agente de contêiner do Amazon ECS perdeu a conectividade com o serviço Amazon ECS no meio de uma execução

1.Para verificar o status e a conectividade do agente de contêiner do Amazon ECS, execute um dos seguintes comandos em sua instância de contêiner.

Execute o seguinte comando para o Amazon Linux 1:

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

Execute o seguinte comando para o Amazon Linux 2:

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

Observação: você vê active/running na saída.

2.Para visualizar metadados sobre a execução de tarefas em sua instância de contêiner do ECS, execute os seguintes comandos em sua instância de contêiner:

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

Você recebe a seguinte saída:

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

3.Para visualizar informações sobre a execução de tarefas, execute o seguinte comando em sua instância de contêiner:

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

Você recebe a seguinte saída:

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

4.Se o problema estiver relacionado a um agente desconectado, reinicie seu agente de contêiner com um dos comandos a seguir.

Execute o seguinte comando para o Amazon Linux 1:

$ sudo stop ecs
$ sudo start ecs

Execute o seguinte comando para o Amazon Linux 2:

$ sudo systemctl stop ecs
$ sudo systemctl start ecs

Você recebe uma saída semelhante ao exemplo a seguir:

ecs start/running, process xxxx

5.Para determinar a conectividade do agente, verifique os seguintes logs durante o período relevante em busca de palavras-chave como erro, aviso ou estado de transição do agente:

Veja o log do agente de contêiner do Amazon ECS em /var/log/ecs/ecs-agent.log.yyyy-mm-dd-hh.
Veja o log de inicialização do Amazon ECS /var/log/ecs/ecs-init.log.
Veja os logs do Docker em /var/log/docker.

Observação: você também pode usar o coletor de logs do Amazon ECS para coletar logs gerais do sistema operacional, logs do Docker e logs do agente de contêiner do Amazon ECS.

O agente de contêiner do Amazon ECS leva muito tempo para interromper uma tarefa existente

Quando seu agente de contêiner recebe novas tarefas para começar no Amazon ECS (de PENDENTE para EM EXECUÇÃO), pode ser que as tarefas mais antigas sejam interrompidas. Nesse caso, o agente não inicia essas novas tarefas até que as tarefas antigas sejam interrompidas primeiro.

Para controlar o tempo limite de interrupção e início do contêiner no nível da instância de contêiner, defina os dois parâmetros a seguir:

1.Em /etc/ecs/ecs.config, ajuste o valor do parâmetro ECS_CONTAINER_STOP_TIMEOUT. Esses parâmetros definem o tempo decorrido antes que o Amazon ECS encerre seus contêineres à força, caso eles não fechem normalmente sozinhos.

Observação: o valor padrão para Linux e Windows é 30s.

2.Em /etc/ecs/ecs.config, ajuste o valor do parâmetro ECS_CONTAINER_START_TIMEOUT. Esse parâmetro define o tempo decorrido antes que o agente de contêiner do Amazon ECS pare de tentar iniciar o contêiner.

Observação: o valor padrão é 3m para Linux e 8m para Windows.

Se a versão do seu agente for 1.26.0 ou posterior, você poderá definir os parâmetros de tempo limite de interrupção e início anteriores por tarefa. Isso pode fazer a transição da tarefa passar para um estado INTERROMPIDO. Por exemplo, suponha que o contêinerA tenha dependência do contêinerB para atingir o status COMPLETO, ÊXITO ou ÍNTEGRO. Se você não especificar um valor StartTimeout para o contêinerB e o contêinerB não atingir o status desejado nesse período, o contêinerA não iniciará.

Para ver um exemplo de dependência de contêiner, consulte Exemplo: dependência de contêineres no AWS GitHub.

Seu roteamento do Amazon VPC não está configurado corretamente

Verifique a configuração da sub-rede da VPC na qual suas tarefas do Amazon ECS ou Fargate são executadas. Se a sub-rede não estiver configurada corretamente, ela não terá acesso ao Amazon ECS ou ao Amazon ECR. Para resolver esse problema, certifique-se de que a tabela de rotas da sua sub-rede tenha um gateway da Internet ou um gateway NAT. Se você iniciar uma tarefa em uma sub-rede que não tem uma rota de saída para a Internet, use o AWS PrivateLink. Isso permite que você acesse de forma privada as APIs do Amazon ECS com endereços IP privados.

Um contêiner essencial depende de contêineres não essenciais que não são ÍNTEGROS

Se seus contêineres não essenciais não estiverem em um estado ÍNTEGRO e um contêiner essencial depender deles, sua tarefa ficará presa no status PENDENTE. Nesse caso, você verá a seguinte mensagem:

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

para resolver esse problema, certifique-se de que seus contêineres dependentes (não essenciais) funcionem conforme o esperado. Se você não conseguir resolver o problema subjacente, torne esses contêineres essenciais para evitar que uma tarefa fique presa no status PENDENTE por muito tempo.

Informações relacionadas

Dependência de contêineres

Agente de contêiner do Amazon ECS (AWS GitHub)

AWS OFICIAL
AWS OFICIALAtualizada há um ano