Каков процесс хранения конфигурации для 12-факторного приложения?

поэтому я создавал свое приложение в основном как 12-факторное приложение и теперь смотрю на часть конфигурации.

Прямо сейчас у меня есть отдельные файлы конфигурации для разработки и производства, и в процессе сборки мы либо создаем образ разработки, либо рабочий образ. Код на 100% тот же, меняется только конфиг.

Теперь я на 100% понимаю, что в 12-факторном приложении конфигурация должна исходить из внешнего источника, такого как: переменные среды или, может быть, безопасное хранилище, такое как хранилище и т. д.

Итак, что не упоминается в различных статьях и блогах о конфигурации, так это то, как она хранится/обрабатывается. Если код разделен в собственном репозитории git и в нем нет сохраненной конфигурации, то как мы будем обрабатывать эту конфигурацию?

Сохраняем ли мы фактические значения конфигурации в отдельном git, а затем каким-то образом объединяем/отправляем/выполняем их в целевой среде (карта конфигурации Kubernet, конфигурация Marathon JSON, Vault и т. д.) в процессе сборки с использованием какого-либо триггера ?


person user432024    schedule 10.12.2018    source источник


Ответы (1)


Стандарта нет, но то, что я наблюдал, — это некоторые распространенные модели поведения, такие как:

  1. Конфиденциальная информация никогда не попадает в систему управления версиями, особенно в git, который является DCVS (вы можете клонировать репозиторий для других местоположений). Если вы не понимаете, помните, что наша существующая «система безопасности» основана на невозможности чтения криптографической информации в определенное время, но в определенный момент вы можете прочитать информацию. Обычно в kubernetes я вижу операторов, управляющих учетной записью службы в нескольких пространствах имен, а затем других, ссылающихся только на учетную запись службы, приветствуются такие инструменты, как KMS, Cert manager, Vault и т. д.

  2. Конфигурация, такая как переменные окружения, конечные точки, хранятся и имеют собственный «жизненный цикл».

12factor не означает, что конфигурация вашего приложения отделена от вашего репозитория, вместо этого предлагается не помещать в ваше приложение (например, в ваш контейнер или даже в бинарный дистрибутив).

На самом деле, если вы хотите использовать отдельный репозиторий только для конфигурации, вы можете это сделать, но если вы хотите отложить исходный код вашего проекта в сторону конфигурации, вы также можете это сделать. Это скорее решение, основанное на размере проекта, сложности, разделении обязанностей и контексте команды. (ИМХО)

В моем случае исследования, например, имеет смысл отделить конфигурацию в выделенном репозитории, поскольку производственная среда имеет более 50 кластеров, каждый из которых имеет свой собственный стек изоляции, а также есть разные команды, управляющие своими собственными службами и использующие общие вспомогательные службы (db , API, потоки...). На мой взгляд, по мере того, как все становится более сложным и совместно используемым, имеет смысл разделить конфигурацию на независимый репозиторий, поскольку существует несколько команд и ресурсов в нескольких кластерах.

person gonzalesraul    schedule 10.12.2018
comment
В настоящее время у нас есть задачи buildImageDev и buildImageProd, которые используют conf-dev.json и conf-prod.json и живут с кодом. Код на 100% тот же, меняется только имя файла конфигурации. Но были случаи, когда люди допускали ошибки вырезания и вставки при копировании значений dev в значения prod. Другой вариант — поступить так же, как мы относимся к сторонним приложениям, и использовать отдельные репозитории для хранения конфигураций для каждого из этих приложений. Примеры: Kafka, Elasticsearch и т. д. Итак, у каждой из этих конфигураций есть свои репозитории. Таким образом, мы можем относиться к нашим приложениям таким же образом. - person user432024; 10.12.2018
comment
В этом случае я бы посоветовал вам в спецификации вашего образа (dockerfile) описать VOLUME для размещения вашего файла конфигурации, заставить приложение (процесс) прочитать это, в противном случае примите значения по умолчанию. И во время оркестровки смонтируйте configmap по ключу на вашем podSpec , и делает configmap разными для каждой среды. При желании, если ваше приложение поддерживает envvar, попробуйте использовать параметризацию envvar вместо файла конфигурации, так как это может дать вам дополнительную гибкость. - person gonzalesraul; 11.12.2018
comment
Да, сейчас я копирую файл конфигурации в образ. Но где бы вы хранили все значения configmap, в том же или отдельном репо? - person user432024; 11.12.2018