Перекрестная публикация от Средний Это пост, который я написал для своего блога работодателей — Космос APE Tech.
За прошедший год мы работаем над улучшением нашего процесса развертывания. В течение того времени мы построили пользовательские инструменты и начали использовать новые (и прощаются до старых) инструментов и практик. Этот пост попробует обзор того, почему мы хотели нового процесса развертывания, как мы пошли о его реализации и того, что мы имеем сейчас.
Старая система
Инфраструктура
Наша инфраструктура была построена с использованием облачной информации. Шаблоны облачных деформаций были созданы из CFNDSL , который, в свою очередь, были обернуты в внутренний драгоценный камень Ruby, с которыми стало немного легче работать с.
Стек облака облака, как правило, произвел группу автоматической масштабирования, направляющую классический балансировщик нагрузки с соответствующими группами безопасности и ролями и профилями IAM.
Облачная информация также использовалась для настройки других частей нашей инфраструктуры AWS, таких как сеть VPC, дистрибутивы CloudFront и ведра S3.
Все наши экземпляры управлялись шеф-поваром. Шеф-повар бежал каждые 15 минут, чтобы настроить наши системы, как мы указываем, он контролировал каждый аспект машины. Это означает управление конфигурацией ОС, установлению упаковки системы и обеспечения наших экземпляров обновлена и исправлена. Он также несет ответственность за установку и настройку наших приложений.
Развертывание
Все развертывания были организованы шеф-поваром. Когда произошло развертывание, он контролировался нами и произошел в одном из трех способов:
- Среда могут быть настроены, чтобы получить последний доступный пакет на каждом запуске шеф-повара. Мы использовали это для развертывания последних версий нашего кода, когда завершены стробы Jenkins.
- Развертывания к другим средам развития были сделаны с использованием либо веб-интерфейса, либо через плагин CLI-ножа — (оба эффективно используют один и тот же код RUBY-код внизу), который сказал шеф-повару развертывать определенную версию кода и конфигурации.
- Развертывания производства были приведены через командную строку на машинах разработчиков с помощью плагина ножа. Это позволило более высокую степень контроля над развертыванием. Например, развертывание, как правило, состоящее из развертываемого канаренного узла, разработчик, проверяющий журналы и метрики, прежде чем решить, следует ли продолжить развертывание. Если развертывание было продолжено, то началось развертывание оставшихся экземпляров. В противном случае канарейка откаталась назад.
Зачем разработать новый процесс развертывания?
Быстрее развертываний
Каждое развертывание потребовало полного запуска шеф-повара, что означает, что мы проверяем все другие части системы, просто для установки банки и файла конфигурации YAML и перезапуску сервиса.
Развертывания от CI взяли слишком долго, шеф-повар проходил каждые 15 минут, что означает, что мы ждали, в среднем в среднем 7,5 минуты для начала развертывания, после того, как была опубликована новая версия. Разработчики хотят посмотреть, работает ли их код как можно скорее.
Развертывание производства заняло много времени:
- Мы взяли экземпляр из балансировщика нагрузки
- Ran Chef
- Добавлен экземпляр обратно в балансировщик нагрузки
- Ждал, чтобы разработчик проверить журналы
- Повторные шаги 1-3 для оставшихся экземпляров (или откат)
Безопасное развертывание
Управляемые шеф-повара серверы изменяются — они меняются со временем. Мы никогда не были на 100% уверены на 100%, если бы мы могли построить новый экземпляр с нуля к текущему состоянию, это может привести к проблемам, когда машины (неизбежно) умирают, или когда нам нужно было масштабировать новые экземпляры.
Развертывание производства были запущены от машин разработчиков, что означало, что было любое количество количества факторов, вызвавших проблемы для развертываний, таких как:
- У разработчика есть все предварительные реквизиты?
- У них есть правильные полномочия AWS?
- Был ли их сетевое соединение стабильно? Что случилось, если он высадил часть прохождения в развертывании?
Мы в значительной степени опирались на разработчики, проверяющие журналы и метрики, чтобы подтвердить, что новая версия, которую мы развернули, работала, как ожидалось. Большая часть этого может быть автоматизирована.
Новая система
Цели
Мы устанавливаем наши требования к нашей системе развертывания как:
- Развертывание должно произойти в секундах или минутах (не 10 минут или дольше)
- Развертывание не должно быть запущено с машины разработчиков
- Мы должны развернуть неизменные экземпляры
- Автоматизировать Как можно больше проверок после развертывания
Фаза 1
Как мы хотели, чтобы неизменные экземпляры было ясно, что нам нужно было выпекать код заявки в AMIS (изображения Amazon Machine). Мы тогда должны были организовать развертывание этих AMIS. Мы решили использовать Spinnaker сделать это. Spinnaker — это «Открытый источник, многоулавная платформа непрерывной доставки для выпуска программного обеспечения изменений с высокой скоростью и доверием».
По сути, это позволяет определить трубопровод, определяющий, как вы хотите, чтобы развертывание произошло.
Минимальный трубопровод состоит из конкурса и стадии развертывания. Этап развертывания может быть сделан из ряда разных Стратегии развертывания которые встроены (например, Red/Black, Canary или Highlander) или вы можете определить свой собственный. Вы также можете добавить другие шаги, такие как добавление дополнительных шагов в откат или шаги, которые могут выполнять проверки.
Используя Spinnaker, ясно, что мы сможем удовлетворить наши цели:
- Развертывание запеченных AMIS должно быть быстро, используя Spinnaker
- Безопасно, как мы можем продвигать AMI через среды
- Нашими случаями неизменны
- Мы также не запускаем эти развертывания с нашей собственной машины
Но мы многое не сделали с точки зрения автоматической проверки развертывания.
Мы быстро обнаружили, что, в то время как Spinnaker UI был идеален для нашей команды DEVOPS, чтобы использовать слишком много ненужной информации для многих пользователей (члены команд разработки, которые только заинтересованы в развертывании кода, а не детали работы развертываний) Отказ
Мы решили построить систему, чтобы обернуть Spinnaker (и любые будущие типы развертываний), чтобы абстрагироваться некоторые сложности инструментов, таких как Spinnaker, а также наложить некоторые терминологии, используемые командами развития.
Мы решили построить API, основываясь на Ruby On Rails, которые будут хранить информацию о наших условиях и услугах, а также позволяют нам использовать фоновых работников для отслеживания состояния развертываний.
Перед API мы построили приложение React, которое действует как первичный пользовательский интерфейс к API.
Пауза и размышлять
Теперь у нас была работающая система развертывания, но прежде чем мы продолжили, мы нашли время, чтобы сделать паузу и рассмотреть наш прогресс с нашими пользователями. Люди были использованы для нашей старой системы развертывания, и, как и любые изменения, его могут быть трудно настроить. Многие вещи, которые кажутся интуитивными при разработке системы, оказываются не для пользователей.
Из этого процесса мы придумали несколько вещей, которые мы хотели изменить:
- Время первого развертывания (после создания нашего приложения CI) все еще слишком высоки. Выпечка AMI может занять несколько минут, то есть мы немного быстрее, чем развернут шеф-повар.
- Наш веб-интерфейс требует некоторой работы, чтобы стать более интуитивным и лучшим отображением информации для пользователей.
- Интеграция между инструментами может быть лучше. Например, Jenkins Jobs Generation начинал развертывание Spinnaker напрямую, пропуская собственную инструмент.
Эта обратная связь привела к ряду улучшений.
Фаза 2
Развертывание «триггера»
Чтобы ускорить первое время развертывания, мы должны были сделать некоторые компромиссы. Мы поняли, что мы никогда не собираемся выпекать AMI достаточно быстро, поэтому вместо этого мы нарушили одно из наших первоначальных требований — неизменных экземпляров — в интересах скорости.
Мы разработали стратегию развертывания, которую мы имели название триггера развертывания. Полная работа развертывания триггера может сделать весь пост в блоге самостоятельно, поэтому я не буду здесь слишком много деталей.
По сути, мы передаем сообщение для долгосрочных экземпляров через SNS и SQS для развертывания новой версии пакета. Каждый экземпляр слушает очередь для сообщения о том, что он заинтересован, а затем действует на него.
Это означает, что мы сейчас развертываем в секундах после успешной сборки CI. Но мы немного более склонны к ошибкам, в этом случае мы чувствуем, что это приемлемый компромисс.
Веб интерфейс
Мы активно занимали обратную связь в лицевых сессиях, так и через кнопку обратной связи, встроенной в инструмент, чтобы собрать много обратной связи от наших пользователей о том, как мы можем улучшить пользовательский интерфейс. Такие, как там, где мы ориентируемся по пользователю, чтобы после определенных действий и о том, как мы выложим информацию, чтобы легко прочитать, балансировать, предоставляя всю информацию, необходимую пользователям, не перегружающую их.
Мы также вытащили дополнительную информацию, такую как текущее состояние окружающей среды.
Это постоянное упражнение. Сбор и выступая на возврат пользователей через встречи, лист обратной связи и преобразования Ad-HOC означает, что мы всегда улучшаем систему.
Интеграция инструментов
Мы хотели нашего API развертывания, чтобы быть центральным источником информации для всех развертываний — развертывание должна быть запущена, контролируется и контролируется через API. Один из способов совершения этого был через реактивный интерфейс. Но иногда это не режет это — нам нужно программно взаимодействовать с API, например, если мы хотим Jenkins начать развертывание после сборки CI.
Конечно, это может быть достигнуто через API, но справиться с аутентификацией и созданием каждой задания Jenkins, была более сложной, чем просто вызов Spinnaker напрямую (Spinnaker Mindows может быть установлен для спускового крючка от jenkins Builds)
Таким образом, мы построили CLI, это позволяет нам абстрактным большинство болей вдали от Дженкинс, вызывая API напрямую, а также дает пользователям возможность использовать CLI, а не использовать пользовательский интерфейс.
Террафор
Мы также начали использовать террафору, а не облачность для создания инфраструктуры. Одним из основных преимуществ это дает нам возможность обмениваться информацией между стеками с использованием удаленного состояния, а не иметь глобальный файл конфигурации. Другие преимущества включают использование модулей, которые дают нам лучший интерфейс, чем наши старые шаблоны облачных деформаций.
Побочный эффект использования Spinnaker заключается в том, что у стеки из них немного проще, в том, что нам не нужно создавать группу масштабирования Auto, поскольку Spinnaker управляет этим для нас.
API.
API теперь стал клеем, который держит наши развертывания вместе. Это источник истины для всех связанных с развертыванием деятельности.
Он не только Orchestrate Spinnaker и развертывание «Trigger», он был построен таким образом, мы можем добавить новые типы развертывания, поскольку мы идем. В настоящее время у нас есть прототипы для развертывания AWS Lambda приложений, используя СЭМ А для бега Террафом Отказ
Мы также расследуем, как мы можем управлять конфигурацией наших услуг через API.
С API в центре нашего рабочего процесса развертывания мы смогли использовать его для создания ряда инструментов, таких как React Wressenf, Golang CLI и LAMBDA SLAST BOT.
Заключение
Результатом нашей работы до сих пор — это то, что развертывания являются быстрее, требуется всего несколько секунд, чтобы развернуть последующую версию доступов кода.
Для следующей среды требуется несколько минут, но у нас намного больше уверенности, что развертывание будет успешным.
Развертывание Prod больше не запускаются с машины пользователя и являются быстрее, чем раньше. Мы не сделали столько прогресса, так как нам понравилось, когда дело доходит до автоматической проверки здоровья развертывания, это то, что мы будем продолжать работать над движением вперед.
Проходя через этот процесс подчеркнул, насколько важно проверить с помощью своих пользователей через регулярные промежутки времени, чтобы увидеть, соответствует ли вы их требованиям.
Это всего лишь начало пути к лучшему развертыванию, мы заложили прочную основу, которую мы можем построить, чтобы позволить нам управлять различными типами развертывания, а также продолжать делать развертывание быстрее и безопаснее.
Оригинал: «https://dev.to/nathmclean/a-journey-to-better-deployments-31e3»