Развертывание новой версии в контейнерах
Я использую кластер CoreOS на AWS. На каждом экземпляре в AWS я запускаю Docker-контейнер. Например, у меня есть 2 экземпляра с именем API, которые запускают образ докера с нашей последней версией программного обеспечения.
У меня также есть 6 экземпляров обработчиков, которые запускают другой образ докера с последней версией.
Я хочу обновить каждый контейнер в моем кластере, поэтому сегодня я использую GoCD с конвейером, чтобы активировать ansible-playbook, который выполняет всю работу. Конвейер прослушивает проекты github, и как только я помещаю изменения в эту ветку, он активирует конвейер.
Он создает API-интерфейс и новый образ Docker для процессоров, загружает новый обновленный образ в Dockerhub, затем подключается к экземплярам AWS и выполняет извлечение Docker для только что загруженного образа. В конце концов он запускает контейнеры с новыми извлеченными образами.
Именно так я сейчас контролирую развертывание своей версии.
Вопросы:
- это занимает много времени
- это иногда терпит неудачу по различным причинам
- это не гибкий (мне нужно жестко кодировать конкретную ветку для прослушивания на github и извлекать файлы из)
Есть ли у вас другие предложения \ инструменты для выполнения этой работы? Иногда мне нужно обновить 3 машины, а иногда 7, и мне нужно что-то масштабируемое.
2 ответа
Я не использую git в своей среде, но использую SVN-хуки после фиксации, которые запускают рабочие процессы развертывания Jenkins. Добавьте плагин Jenkins Build Pipeline, чтобы вы могли возобновить работу после сбоев, а не перезапускаться с самого начала. Тем не менее, проверьте, поддерживает ли GoCD такие вещи, нет смысла переключать инструменты, если они не нужны.
Я бы предложил следующие изменения:
Разбейте ANSIBLE PlayBook на отдельные шаги в вашем инструменте развертывания. Это позволит вам перезагрузиться ближе к сбою, тратя меньше времени.
Установите уведомления в своем конвейере, чтобы уведомить вас о сбоях, и один в конце, чтобы уведомить вас об успехе. Нет необходимости присматривать за индикатором прогресса... который быстро разочаровывает
Начните определять, где находится узкое место в вашем процессе. Вы исправляете медленный процесс по одному шагу за раз, определяя самые простые вещи, которые нужно исправить в первую очередь.
Начиная с проблемы № 3, вы можете подумать, хотите ли вы выпускать код из разных веток. GoCD, являющийся инструментом непрерывной доставки, лучше всего работает с разработкой на основе соединительных линий, то есть всегда выпускается от мастера.
Тем не менее, вы не хотите развертывать в производство непосредственно при каждом подключении к транку. У вас может быть шаг утверждения вручную в Go, или набор автоматических тестов, запускаемых с другими компонентами, являющимися версиями, работающими в производстве, или как тесты, так и утверждение вручную.
Что касается проблемы №2, вам может потребоваться выполнить дополнительные шаги в GoCD, чтобы вы могли следить за ходом процесса в веб-интерфейсе Go, получать уведомления по электронной почте о сбоях и возобновлять работу с точек, где произошел сбой и т. Д.
Что касается № 1, вы должны сказать нам, что медленно, и какие ожидания вы ожидаете от времени. GoCD молниеносно начинает работать с вещами. Я думаю, что он опрашивает репозитории GIT один раз в минуту, и незадействованные агенты регистрируются на сервере с определенным интервалом, чтобы узнать, есть ли работа, которую нужно сделать. Это в основном фиксированная задержка, хотя. Он не станет медленнее только потому, что у вас есть 100 хостов для обновления, если вы не выполняете задание GoCD для каждого экземпляра (и это, вероятно, не очень хорошая идея).
Похоже, что docker compose и docker swarm могут быть лучшими инструментами для работы, для которой вы используете Ansible.