Сервер ECS с aws_vpc не может запуститься из-за проблем с ENI.

У меня есть одна услуга. У меня есть кластер ECS с двумя экземплярами t3.small.

Я не могу запустить задачу ECS. У меня есть задача ECS с двумя контейнерами (NGINX и PHP-FPM). NGINX предоставляет порт 80, а PHP-FPM предоставляет порты 9000, 9001, 9002.

Ошибка, которую я вижу:

dev-cluster/ecs-agents i-12345678901234567 2019-09-15T13:20:48Z [ERROR] Task engine [arn:aws:ecs:us-east-1:123456789012:task/ea1d6e4b-ff9f-4e0a-b77a-1698721faa5c]: unable to configure pause container namespace: cni setup: invoke bridge plugin failed: bridge ipam ADD: failed to execute plugin: ecs-ipam: getIPV4AddressFromDB commands: failed to get available ip from the db: getAvailableIP ipstore: failed to find available ip addresses in the subnet

Агент ECS: 1.29.

Вы знаете, как я могу понять, что не так?

Вот фрагмент журнала: https://pastebin.com/my620Kip

Определение задачи: https://pastebin.com/C5khX9Zy

ОБНОВЛЕНИЕ: мои наблюдения

Отредактировано, потому что мой пост ниже был удален...

Я пересоздал кластер, после этого проблема исчезла.
Затем я удалил образ приложения из ECR и увидел ошибку в веб-консоли AWS:

CannotPullContainerError: Error response from daemon: manifest for 123456789123.dkr.ecr.us-east-1.amazonaws.com/application123:development-716b4e55dd3235f6548d645af9e463e744d3785f not found

Затем я подождал несколько часов, пока первоначальная проблема не повторилась.
Затем я перезапустил экземпляр вручную с помощью systemctl reboot, и проблема снова исчезла только для перезапущенного экземпляра.

Эта проблема возникает, когда в кластере есть сотни задач awsvpc, которые не могут быть запущены.

Я думаю, что это ошибка в агенте ECS. И когда мы пытаемся создать слишком много контейнеров с требованиями ENI, он пытается использовать все свободные IP-адреса в подсети. (255) Я думаю, что после перезапуска/пересоздания экземпляра EC2 некоторый кеш очищается и проблема решена.

Вот подобное решение, которое я нашел сегодня: https://github.com/aws/amazon-ecs-cni-plugins/issues/93#issuecomment-502099642

Что вы думаете об этом?

Я открыт для предложений.


person Daniel Hornik    schedule 15.09.2019    source источник
comment
Кажется, что сеть мостов подключена в определениях задач? Fargate работает только в сети awsvpc   -  person Adiii    schedule 15.09.2019
comment
У меня есть еще одна задача awsvpc, которая работает с EC2. Только это не может начаться.   -  person Daniel Hornik    schedule 15.09.2019
comment
Почему у вас нет определений сопоставлений для приложения?   -  person Perimosh    schedule 16.09.2019
comment
Потому что я не выставляю его из среды приложения. В nginx я использую localhost:9000 в качестве апстрима. Это нормально, потому что AWS гарантирует, что все определение задачи запускается в одном экземпляре.   -  person Daniel Hornik    schedule 16.09.2019


Ответы (1)


Вероятно, это просто дикая догадка, но может быть, вам просто не хватает ENI?

ENI довольно ограничены (в зависимости от типа экземпляра):

Например, t3.medium имеет только 3 ENI, один из которых используется в качестве основного сетевого интерфейса. Что оставляет вам только 2 ENI. Поэтому я могу представить, что задачи ECS не запускаются из-за недостаточного количества ENI.

В качестве смягчения попробуйте транкинг ENI:

Это умножит доступные ENI на экземпляр.

person lexicore    schedule 16.09.2019
comment
Мои экземпляры имеют 3 ENI, у меня есть 2 задачи в кластере, для которых требуются ENI. И T3.small, и T3.medium имеют 3 ENI. В моем кластере 2 экземпляра = 6 ENI. 2 ENI используются для основных сетевых интерфейсов => осталось 4 интерфейса. Один ENI используется для другого сервиса (aws_vpc), осталось 3 интерфейса. Когда эта служба не может запустить какой-либо контейнер, и я убиваю другую работающую службу с помощью aws_vpc, вторая все равно не может запуститься. Это глобальная проблема. - person Daniel Hornik; 16.09.2019