Ограничить запуск сервисов / приложений в определенном инстансе Amazon ECS

Я занимаюсь переносом некоторых рабочих нагрузок на Amazon ECS Container Service и обнаружил блокировщик, который мешает мне двигаться дальше.

В идеале контейнерные приложения, работающие на ECS, не должны иметь состояния, чтобы они могли работать в любом экземпляре кластера и масштабироваться. Но на самом деле у меня есть некоторые приложения, которые зависят от объемов данных EBS. Насколько мне известно, эти тома необходимо вручную прикрепить к конкретному экземпляру кластера, и приложения ECS должны быть размещены в этом экземпляре, чтобы иметь доступ к его данным, поэтому мне нужно каким-то образом контролировать, где они в конечном итоге работают.

В качестве примера предположим, что у нас есть кластер из 3 инстансов EC2, которым управляет Amazon ECS.

  • instance1
  • instance2
  • instance3

Затем у нас есть 2 контейнерных приложения:

  • app1 без гражданства
  • app2, который зависит от тома EBS.

app1 может работать в любом экземпляре кластера, без проблем.

Предположим, что для приложения 2 мы подключили и смонтируем том EBS в instance2.

Теперь возникает вопрос: могу ли я установить ограничение при определении или запуске app2, чтобы оно было размещено только в instance2, чтобы оно могло иметь доступ к тому EBS?

Большое спасибо заранее!


ИЗМЕНЕНО:

Я читал немного дальше и нашел способ сделать это в документации Amazon. В документе есть примечание «Использование объемов данных в задачах », В котором говорится:

Важно

Amazon ECS не синхронизирует объемы данных между экземплярами контейнеров. Задачи, использующие постоянные тома данных, могут быть размещены в любом экземпляре контейнера в вашем кластере, имеющем доступную емкость. Если для ваших задач требуются постоянные тома данных после остановки и перезапуска, вы всегда должны указывать один и тот же экземпляр контейнера во время запуска задачи с помощью команды запуска задачи AWS CLI.

Итак, глядя на команду start-task в интерфейсе командной строки я обнаружил, что это именно то, что я искал:

стартовая задача

Запускает новую задачу из указанного определения задачи в указанном экземпляре или экземплярах контейнера. Чтобы использовать планировщик Amazon ECS по умолчанию для размещения задачи, используйте вместо этого run-task.

У него есть два обязательных параметра: определение задачи, которое вы хотите запустить, и идентификаторы экземпляра контейнера (до 10), на которых задача должна запускаться.

Таким образом, вызов команды будет выглядеть примерно так:

aws ecs start-task --task-definition “hello-world:1” --container-instances “1c66549d-b41c-4439-dd43-c2e1c9a2cc2a” 

Я попробовал, и он отлично сработал.

В настоящее время это выглядит как единственный способ сделать это, поскольку веб-интерфейс AWS не предоставляет поле для указания экземпляров контейнера при запуске задачи.

Надеюсь, это может быть кому-нибудь полезно.


person adrianmo    schedule 01.03.2016    source источник
comment
Из того, что я прочитал: вы не можете этого сделать. К кластеру привязан набор экземпляров, к которым прикрепляются контейнеры на основе ресурсов через планировщик. Я думаю, что единственный способ сделать это - использовать несколько кластеров.   -  person Marc Young    schedule 02.03.2016
comment
Привет, @MarcYoung, я отредактировал вопрос и нашел решение. Пожалуйста, ознакомьтесь с этим, поскольку на самом деле есть способ сделать это без необходимости создавать несколько кластеров.   -  person adrianmo    schedule 07.03.2016


Ответы (2)


ECS теперь поддерживает ограничения размещения.

См. http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html.

Итак, шаги следующие:

  • Определите настраиваемый атрибут для каждого экземпляра (например, Name=App1) инструкции здесь
  • Определите ограничение для каждого определения задачи (например, MemberOf = attribute:Name =~ App1)

Он должен работать.

person iapilgrim    schedule 19.01.2017

Amazon недавно запустила новую службу, эластичную файловую систему (EFS), которая предназначена для синхронизации данных во многих экземплярах. , а значит, и любой контейнер.

Внедрение EFS - это признание того, что вы просто не можете легко использовать EBS для контейнерных рабочих нагрузок.

Вот пример и руководство по использованию EFS с ECS.

EFS построена на NFS. Протокол NFS и реализация EFS имеют некоторые проблемы, связанные с сетевым вводом-выводом и пропускной способностью данных, поэтому он может не подходить для вашей рабочей нагрузки.

person Noah Zoschke    schedule 21.09.2016