2016-03-01 3 views
5

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

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

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

  • instance1
  • instance2
  • instance3

Тогда мы имеем 2 контейнерные приложения:

  • app1, который является лицом без
  • app2, которая зависит от объема EBS

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

Для приложения2 предположим, что мы присоединяем и монтируем том EBS в экземпляре2.

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

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


Редакция:

Я читал немного дальше, и я нашел способ сделать это в документации Amazon. Существует примечание в документе «Using Data Volumes in Tasks», который говорит:

Важно

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

Так, глядя на start-task команды на CLI я узнал, что это именно то, что я искал:

запуск задачи

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

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

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

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

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

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

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

+0

Из того, что я читал: вы не можете этого сделать. Кластер имеет набор привязанных к нему экземпляров, чтобы контейнеры были привязаны к ним на основе ресурсов через планировщик. Я думаю, что единственный способ сделать это - несколько кластеров. –

+1

Привет @MarcYoung, я отредактировал вопрос с решением, которое я нашел. Пожалуйста, взгляните на это, поскольку на самом деле есть способ сделать это без необходимости создания нескольких кластеров. – adrianmo

ответ

4

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

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

Вот учебник и учебник о using EFS with ECS.

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

3

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

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

Так шаги:

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

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