Поиск по сайту:

Как приступить к развертыванию контейнеров с автоматическим масштабированием на AWS ECS


Elastic Container Service (ECS) AWS — это вычислительный механизм, специально разработанный для контейнеров Docker. Вы можете использовать его для развертывания контейнеров с использованием базовых экземпляров EC2 или запустить независимое от сервера развертывание на Fargate.

Что такое ЭКС?

Базовое использование ECS довольно простое. Вместо того, чтобы администрировать серверы Linux, вы просто предоставляете ему контейнер Docker, выбираете, какую вычислительную мощность вы хотите ему предоставить, и настраиваете его на работу. ECS выполняет грязную работу по поиску металла для запуска. По умолчанию он работает без сервера с использованием Fargate, хотя при желании вы можете запускать свои контейнеры на инстансах EC2 и сохранять над ними полный контроль.

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

ECS также можно легко масштабировать автоматически с помощью одного переключателя, по сравнению с EC2, который требует дополнительной настройки. Если вы решите включить эту функцию, ECS будет автоматически развертывать новые контейнеры в соответствии с потребностями всякий раз, когда загрузка ЦП, использование памяти или другие аварийные сигналы становятся высокими. Благодаря автоматическому масштабированию вам никогда не придется беспокоиться об обновлении вашего сервера до более высокого класса или ручном развертывании нескольких из них. Справедлив и обратный эффект — ваше приложение может уменьшаться в нерабочее время, экономя при этом ваши деньги.

Что касается ценообразования, за модель запуска EC2 не взимается дополнительная плата. Вы просто платите за базовые экземпляры. Для Fargate плата рассчитывается на основе количества запрошенных виртуальных ЦП и памяти. Если посчитать, то Фаргейт на бумаге стоит на 20% дороже. Однако это компенсируется тем фактом, что развертывания Fargate (при правильной настройке) будут использовать ровно столько ресурсов, сколько им нужно, что значительно оптимизирует затраты. Fargate также поддерживает спотовые инстансы, которые экономят кучу денег по сравнению с EC2 и делают Fargate предпочтительным методом запуска в любом случае, когда по какой-то причине не требуется прямой доступ к базовому серверу.

Настройка Docker и отправка в ECR

Чтобы получить контейнер в ECS, вам нужно отправить его в репозиторий. Вы можете использовать концентратор Docker или собственный сервер реестра, но AWS предлагает собственное решение с Elastic Container Registry. Вы можете загружать контейнеры сюда, делать их приватными для вашей учетной записи AWS и легко получать к ним доступ из других сервисов, таких как ECS и CodePipeline.

Перейдите в консоль управления ECR и создайте новый репозиторий. URI репозитория зависит от идентификатора вашей учетной записи AWS — вы можете скопировать его в столбец «URI».

Сохраните следующий скрипт как updateECR.sh рядом с файлом Dockerfile. Замените переменные TAG и REPO правильными значениями.

TAG="docker-test"
REPO="ACCOUNT_ID.dkr.ecr.REGION.amazonaws.com/"$TAG":latest"

aws ecr get-login-password | docker login --username AWS --password-stdin $REPO
docker build -t $TAG .
docker tag $TAG:latest $REPO
docker push $REPO

Запуск этого скрипта войдет в ECR, создаст ваш контейнер, пометит его и отправит в ваш репозиторий. Если вы обновите список, вы должны увидеть свой контейнер:

Развертывание на ECS

Чтобы запустить контейнер на ECS, вам понадобятся две вещи:

  • «Определение задачи», которое содержит метаданные о самих контейнерах — какие порты доступны, сколько памяти нужно выделить контейнерам и т. д. Вы можете запускать несколько контейнеров в одном определении задачи, если ваше приложение использует больше чем один.
  • «Служба», представляющая развертывание определения задачи, связанную с ней сеть и параметры автоматического масштабирования. Вы можете сгруппировать несколько сервисов в один «кластер».

Сначала вам нужно создать определение задачи, поэтому создайте его в разделе «Определения задач» на боковой панели.

Дайте ему имя и укажите объем памяти задачи и размер виртуального ЦП. Помните, что вы всегда можете создать несколько контейнеров и связать их вместе с помощью балансировщика нагрузки. Если вы планируете использовать автоматическое масштабирование, вам следует рассматривать это значение как размер единицы каждого контейнера — вместо развертывания одного контейнера с 16 виртуальными ЦП вы можете развернуть восемь контейнеров с 2 виртуальными ЦП.

Затем нажмите «Добавить контейнер», чтобы определить контейнеры, к которым будет обращаться это определение задачи. Вставьте URI вашего контейнера Docker в ECR. Здесь вы также можете установить ограничения на программную и жесткую память и открыть порты (применимо только к типам запуска EC2).

Как только это будет создано, вы можете развернуть Службы, используя это определение. Перейдите в «Кластеры» и создайте новый кластер, выбрав Fargate или EC2 в зависимости от ваших предпочтений. При желании вы можете создать новый VPC для этого кластера или развернуть его в своем VPC по умолчанию.

Вы можете запускать задачи вручную, но лучше создать сервис для их обработки. Создайте новую службу из представления Cluster:

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

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

Вы также можете добавить балансировщик нагрузки или установить пользовательские настройки DNS на этой странице. Если вы используете балансировщик нагрузки, обязательно установите разумный «период отсрочки проверки работоспособности», который предотвратит пометку задач как неработоспособных во время их запуска.

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

Вы можете задать для политики масштабирования целевого отслеживания значение TargetTrackingPolicy, а для ECSServiceAverageCPUUtilization – пороговое значение 75–80 % или около того. Если вы не хотите использовать политику отслеживания целей, вы можете вручную увеличивать и уменьшать масштаб на основе предупреждений CloudWatch.

После развертывания вашей службе потребуется около минуты, чтобы запустить первые контейнеры, и она будет доступна в контейнере или на конечной точке ENI балансировщика нагрузки. При желании вы можете назначить этому ENI эластичный IP-адрес, который можно настроить с помощью DNS для постоянной связи с кластером.