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, и многих других сценариев сбоев. .