Configuration as Code для Node.js

Влад Убей-Волк
Влад Убей-Волк · 2 октября 2020
Node.js Backend Developer
Photo by Sean Stratton on Unsplash

OpenSource кубики Byndyusoft™ пополнились новой библиотекой для конфигурации преимущественно Node.js приложений byndyusoft/casc. В честь этого события хотим предложить вам небольшой рассказ о том, почему она появилась и какие проблемы решает.

Начало нового проекта

Ни для кого не секрет, что микросервисы живут в Kubernetes, а в Helm живет их конфигурация (здесь и далее под конфигурацией будут пониматься настройки БД, очередей, трейсинга, логирования и т.п.). Но при старте нового проекта наш заказчик предложил попробовать запускать микросервисы в собственной PaaS платформе. Для нас это означало отказ от привычного стека технологий, из-за чего мы наступили на все эволюционные грабли такой казалось бы простой вещи как конфигурация.

Первые шаги

MVP версия микросервиса просто брала конфиг для соответствующего окружения из папки и использовала его. Это не вызывало трудностей, ведь пароли хранились в открытом виде, поэтому мы давали доступ к репозиторию только «избранным», несмотря на политику InnerSource внутри компании заказчика. Помимо проблем с безопасностью мы столкнулись с трудоемкой ручной синхронизацией всех изменений в конфигурации во всех окружениях, особенно когда конфиг стал занимать несколько сотен строк.

Безопасность превыше всего

По мере развития микросервиса все большему количеству людей нужно было получить доступ к нашему репозиторию, поэтому мы перенесли конфиги «как есть» в Vault. Теперь микросервис при старте скачивал конфиг для нужного окружения из Vault, используя токен доступа, который команда поддержки PaaS добавила в переменные окружения. Это решило вопрос с безопасностью, проблема ручной синхронизации осталась, а еще добавилась новая проблема — конфигурация и код приложения стали «разъезжаться», из-за того что они не деплоились в одно и тоже время из одного и того же коммита. Однажды, это привело к тому что на feature окружение была залита версия без проверки на ноль, взяла feature конфиг от другой версии где был ноль, и положила весь тестовый кластер заказчика.

Появление библиотеки

Конфигурация микросервиса превратилась в проблему. Очень сильно упал показатель Time to Market, из-за повышенного времени деплоя. Взяв время на рефакторинг, мы решили изобрести свой Helm. Так в config.yaml стал лежать шаблон конфига, а в values.yaml были значения для различных окружений. Некоторые значения были зашифрованы асимметричным алгоритмом. Микросервис при старте подтягивал приватный ключ, расшифровывал значения, подставлял их в шаблон и таким образом получал себе готовый конфиг. Такой подход смог решить все проблемы с конфигурацией.

Дальнейшие планы

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

Следите за новыми репозиториями и обновлениями текущих на нашем https://github.com/Byndyusoft.