GitOps - конфигурация в том же репо или отдельном репо?

Во-первых, это в контексте приложения монорепо, которое работает внутри Kubernetes.

Я понимаю, что в GitOps все декларативно и написано в файлах конфигурации, таких как YAML. Это позволяет вести полную историю изменений в git. Филиалы представляют собой среду. Например:

  • BRANCH development Может быть развернутой QA или промежуточной средой
  • BRANCH feature/foo-bar Может быть развернутой функциональной веткой для оценки
  • TAG v1.2.0 Может быть последней версией, работающей в производственной среде. Для меня это имеет смысл, любые и все ветки могут быть развернуты как работающая версия приложения.

ВОПРОС Я помню, как читал... где-то... конфигурация должна находиться вне основного репозитория, внутри другого "репозитория конфигурации". По памяти идея состоит в том, что приложение не должно знать конкретную конфигурацию... только как использовать конфигурацию?

Это правда? Должен ли я иметь репозиторий приложения и репозиторий конфигурации приложения? например

  • репо приложения: foo-organisation/bar-application
  • конфигурационное репо: foo-organisation/bar-application-config

Где модель ветвления конфигурации для разных сред находится внутри этого репозитория? Почему и в чем преимущества?

В противном случае он должен просто жить в каталоге репозитория приложения?

2 ответа

Решение

Нет настоящего жесткого правила, кроме того, что все, что касается вашей среды, должно быть представлено в репозитории git (например, прекратить хранить конфигурацию в переменных Jenkins env, Стив!). Где находится конфигурация, это скорее детали реализации.

Если ваше приложение управляется как монорепозиторий, почему бы не использовать ту же настройку для развертывания? Обычно лучше вписаться в существующие процессы выпуска, чем создавать что-то новое.

Одна загвоздка заключается в том, что одна версия приложения обычно должна поддерживать несколько развертываний, а конфигурация развертывания часто может измениться после выпуска приложения. Таким образом, должно быть отношение 1 приложение ко многим конфигурациям, будь то файлы, каталоги, ветки или репозитории. Все они работают, пока они выпущены / выпущены.

Еще одно соображение относительно выпуска - сборки приложений. Для небольших обновлений развертывания вы не хотите создавать и выпускать полностью новый образ приложения. Предпочтительно просто применить конфигурацию и повторно использовать существующие артефакты. Часто это драйвер для отдельного репозитория deploy / config, поэтому проблемы полностью разделены.

Безопасность может сыграть свою роль. У вас может быть системная информация в конфигурации развертывания, к которой всем разработчикам не нужен доступ, или вы не хотите даже иметь шанс превратить ее в образ контейнера. Это также стимулирует использование отдельных репозиториев.

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

Я твердо верю, что конфигурация должна жить и иметь версию вместе с кодом, главным образом потому, что ее изменение влияет на поведение системы и, следовательно, должно следовать SDLC, чтобы гарантировать, что изменение не нарушит ничего другого.

Перечислю некоторые идеи:

  • Учетные данные или секреты не связаны с конфигурациями приложений, они должны управляться безопасно, они должны быть зашифрованы, и я бы рекомендовал использовать для них что-то вроде Hashicrop Vault и получать их во время выполнения.
  • Ресурсы платформы , такие как таблицы базы данных или темы Kafka, должны быть частью приложения, они редко меняются, и когда они меняются, я бы предпочел следовать SDLC, чтобы убедиться, что они не нарушают работу приложения.
  • Ресурсы инфраструктуры , такие как ЦП и память, должны быть частью выпуска приложения, они могут оказать большое влияние на поведение системы, и вы не хотите экспериментировать с ними в более высоких средах.
  • Конечные точки для других служб должны быть разрешены с использованием DNS, указание на другое место должно быть изменением версии и должно быть протестировано для сохранения паритета среды.

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

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