Для того, чтобы передать в приложение конфигурацию, можно использовать переменные окружения.
В спецификации контейнера это можно сделать через атрибут env.
env - массив пар типа ключ-значение, где ключом является имя переменной окружения, а значением - ее значение.
Это не всегда удобно, т.к. для разных сред: продакшн и тестовая, конфигурация может отличаться, а значит, придется хранить несколько версий манифеста одного и того же деплоймента, но с разными настройками. Кроме того, хранение манифестов с логинами и паролями доступа к базам данных в системах контроля версий (git) являются прямым нарушением практик кибербезопасности.
Для того, чтобы отделить конфигурацию приложения от среды запуска приложения, в Kubernetes есть два специальных ресурса:
· ConfigMap - для хранения конфигураций
· Secret - для хранения потенциально чувствительной информации (например, логин пароль для подключения к базе данных)
Configmap и Secret выглядят следующим образом. Атрибут data содержит данные в формате ключ-значение.
Secret отличается от ConfigMap только тем, что данные в нем хранятся по умолчанию в закодированном (base64), но не зашифрованном виде. Т.е. если кто-то получит доступ к Secret-у, он его сможет легко раскодировать. Как правило разработчики и инженеры сами не создают секреты в продакшн средах, только используют секреты, которые для них подготовили администраторы. Доступ к секретам также ограничивается на основе ролевой модели в Kubernetes. Таким образом, разработчики и инженеры могут использовать секреты в манифестах, но не знают, какие данные там хранятся. А кодирование в base64 нужно, т.к. иногда чувствительные данные представляют собой бинарные данные, которые в yaml хранить сложно.
Все секреты и конфигмапы привязываются к конкретному пространству имен.
Использовать созданные ConfigMap и Secret возможно следующим образом:
- передавать значения из ConfigMap/Secret в виде переменных окружения
- передавать значения из Configmap/Secret в виде примонтированной директории внутрь контейнера.
- В случае, если поменяются значения в ConfigMap/Secret они автоматически НЕ будут обновлены, в случае использования в виде переменных окружения. Kubelet при создании проверяет, что нужный ConfigMap/Secret есть и передает в качестве переменных окружений конфигурацию оттуда. В случае использования Configmap/Secret, как примонтированной директории в контейнере, kubelet периодически обновляет данные. И при изменения ConfigMap/Secret эти изменения там отразятся. Но в любом случае приложение должно уметь перечитывать и определять изменения из конфигурации. Ссылки:
· конфигурирование приложений в Kubernetes (англ)
#ConfigMap #Secret #env #DevOps #Kubernetes