Развертывание новой версии в контейнерах

Я использую кластер CoreOS на AWS. На каждом экземпляре в AWS я запускаю Docker-контейнер. Например, у меня есть 2 экземпляра с именем API, которые запускают образ докера с нашей последней версией программного обеспечения.

У меня также есть 6 экземпляров обработчиков, которые запускают другой образ докера с последней версией.

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

Он создает API-интерфейс и новый образ Docker для процессоров, загружает новый обновленный образ в Dockerhub, затем подключается к экземплярам AWS и выполняет извлечение Docker для только что загруженного образа. В конце концов он запускает контейнеры с новыми извлеченными образами.

Именно так я сейчас контролирую развертывание своей версии.

Вопросы:

  1. это занимает много времени
  2. это иногда терпит неудачу по различным причинам
  3. это не гибкий (мне нужно жестко кодировать конкретную ветку для прослушивания на github и извлекать файлы из)

Есть ли у вас другие предложения \ инструменты для выполнения этой работы? Иногда мне нужно обновить 3 машины, а иногда 7, и мне нужно что-то масштабируемое.

2 ответа

Я не использую git в своей среде, но использую SVN-хуки после фиксации, которые запускают рабочие процессы развертывания Jenkins. Добавьте плагин Jenkins Build Pipeline, чтобы вы могли возобновить работу после сбоев, а не перезапускаться с самого начала. Тем не менее, проверьте, поддерживает ли GoCD такие вещи, нет смысла переключать инструменты, если они не нужны.

Я бы предложил следующие изменения:

  1. Разбейте ANSIBLE PlayBook на отдельные шаги в вашем инструменте развертывания. Это позволит вам перезагрузиться ближе к сбою, тратя меньше времени.

  2. Установите уведомления в своем конвейере, чтобы уведомить вас о сбоях, и один в конце, чтобы уведомить вас об успехе. Нет необходимости присматривать за индикатором прогресса... который быстро разочаровывает

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

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

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

Что касается проблемы №2, вам может потребоваться выполнить дополнительные шаги в GoCD, чтобы вы могли следить за ходом процесса в веб-интерфейсе Go, получать уведомления по электронной почте о сбоях и возобновлять работу с точек, где произошел сбой и т. Д.

Что касается № 1, вы должны сказать нам, что медленно, и какие ожидания вы ожидаете от времени. GoCD молниеносно начинает работать с вещами. Я думаю, что он опрашивает репозитории GIT один раз в минуту, и незадействованные агенты регистрируются на сервере с определенным интервалом, чтобы узнать, есть ли работа, которую нужно сделать. Это в основном фиксированная задержка, хотя. Он не станет медленнее только потому, что у вас есть 100 хостов для обновления, если вы не выполняете задание GoCD для каждого экземпляра (и это, вероятно, не очень хорошая идея).

Похоже, что docker compose и docker swarm могут быть лучшими инструментами для работы, для которой вы используете Ansible.

Другие вопросы по тегам