Да, это достижимо. У нас есть кластер ECS, на котором работает полдюжины служб, использующих контейнеры докеров Windows. Как вы упомянули, существует два типа автомасштабирования: на уровне задачи и на уровне экземпляров контейнера. Автоматическое масштабирование на уровне задач проще, чем автоматическое масштабирование экземпляров контейнера.
Экземпляры контейнеров
Для группы автоматического масштабирования экземпляров контейнера вам потребуются следующие ресурсы:
- Кластер ECS (который у вас уже есть).
- Конфигурация запуска для ваших экземпляров контейнера с использованием одного из AMI, оптимизированные для Windows ECS.
- Группа с автоматическим масштабированием, которая использует вашу конфигурацию запуска для создания новых экземпляров.
- Ваши политики масштабирования, которые могут быть комбинацией целевых политик резервирования, запланированных политик или поставщиков емкости.
В конфигурации запуска вам необходимо зарегистрировать новые экземпляры в кластере ECS. Мы используем UserData для этого и для настройки некоторых дополнительных параметров (например, для работы с ограничениями жесткой / программной памяти в Windows, о которых вы упомянули):
<powershell>
[Environment]::SetEnvironmentVariable(ECS_RESERVED_MEMORY, 256, Machine)
[Environment]::SetEnvironmentVariable(ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE, $TRUE, Machine)
[Environment]::SetEnvironmentVariable(ECS_ENABLE_CPU_UNBOUNDED_WINDOWS_WORKAROUND, $TRUE, Machine)
Initialize-ECSAgent -Cluster <your-cluster> -EnableTaskIAMRole -LoggingDrivers '[json-file,awslogs]'
</powershell>
Что касается политик автоматического масштабирования, у вас есть несколько вариантов, поэтому вам нужно выбрать то, что лучше всего для вашего варианта использования. Сейчас мы выполняем масштабирование с использованием целевого уровня резервирования памяти 80% и планируем некоторые действия по масштабированию в определенное время дня, чтобы убедиться, что у нас достаточно емкости на пару раз в течение дня, когда мы ожидаем скачков. Мы еще не начали использовать поставщиков емкости, так как вокруг них были некоторые ошибки и проблемы, поэтому я даю им еще время, чтобы они повзрослели (я думаю, что они уже решили многие проблемы ... вы можете узнать больше об этом из этого комментария и далее).
Это почти все, что вам нужно для масштабирования экземпляров контейнера. Вы можете начать добавлять задачи в свой кластер, и ваша группа автоматического масштабирования должна начать добавлять больше экземпляров контейнера.
Имейте в виду, что без контейнеров емкости может возникнуть ситуация, когда группа не масштабируется, даже если в любом экземпляре недостаточно памяти или ЦП для добавления новых задач. Это будет зависеть от памяти ваших задач и конфигурации ЦП, а также от вашей цели резервирования (например, у вас есть задача, которая требует 20% вашей текущей доступной емкости памяти для всего кластера, ваш кластер использует 85% памяти, но ваша политика масштабирования не будет масштабироваться, пока вы не достигнете 90% использования памяти). Это проблема, которую поставщики мощности призваны решить. В нашем случае использования и наших конфигурациях задач у нас никогда не возникает проблемы с не масштабированием группы, но мы знаем, что мы чрезмерно выделяем наш кластер, чтобы избежать этого.
Другая проблема заключается в масштабировании экземпляров вашего контейнера: вам нужно каким-то образом настроить инстансы на слив, чтобы у ваших задач было время корректно завершиться, что не обрабатывается AWS автоматически. Здесь есть открытая проблема, которую вы можете отслеживать. Мы решили эту проблему, используя лямбда-функцию и обработчик жизненного цикла автомасштабирования на основе этого репозитория Github из этого комментария.
Задания
Задачи масштабирования проще:
- Вам необходимо связать свои задачи с балансировщиком нагрузки, чтобы задачи автоматически регистрировались / отменялись в / из ELB.
- Вы создаете политику масштабирования для своей задачи (например, вы можете использовать ALBRequestCountPerTarget для увеличения в зависимости от количества запросов на цель или также запланировать действия автомасштабирования).
В определении задачи вы должны установить порт хоста на 0, чтобы он автоматически назначался ELB (прочтите документацию для hostPort здесь).
Основная проблема здесь - убедиться, что ваше приложение разработано для работы в качестве кластера (например, с использованием внешних диспетчеров сеансов вместо диспетчеров сеансов в памяти).
В этом суть процесса. Для каждого из этих шагов нужно прочитать много документации, но она должна ответить на заданные вами вопросы, указать вам правильное направление и помочь избежать некоторых проблем, которые мы обнаружили в процессе.
person
Arturo Monge
schedule
31.07.2020