Найти в Дзене
DevOps step by step

ConfigMap, Secret

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

env - массив пар типа ключ-значение, где ключом является имя переменной окружения, а значением - ее значение.

-2

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

-3

Для того, чтобы отделить конфигурацию приложения от среды запуска приложения, в Kubernetes есть два специальных ресурса:

· ConfigMap - для хранения конфигураций

· Secret - для хранения потенциально чувствительной информации (например, логин пароль для подключения к базе данных)

Configmap и Secret выглядят следующим образом. Атрибут data содержит данные в формате ключ-значение.

Secret отличается от ConfigMap только тем, что данные в нем хранятся по умолчанию в закодированном (base64), но не зашифрованном виде. Т.е. если кто-то получит доступ к Secret-у, он его сможет легко раскодировать. Как правило разработчики и инженеры сами не создают секреты в продакшн средах, только используют секреты, которые для них подготовили администраторы. Доступ к секретам также ограничивается на основе ролевой модели в Kubernetes. Таким образом, разработчики и инженеры могут использовать секреты в манифестах, но не знают, какие данные там хранятся. А кодирование в base64 нужно, т.к. иногда чувствительные данные представляют собой бинарные данные, которые в yaml хранить сложно.

Все секреты и конфигмапы привязываются к конкретному пространству имен.

Использовать созданные ConfigMap и Secret возможно следующим образом:

  1. передавать значения из ConfigMap/Secret в виде переменных окружения
  2. передавать значения из Configmap/Secret в виде примонтированной директории внутрь контейнера.
  3. В случае, если поменяются значения в ConfigMap/Secret они автоматически НЕ будут обновлены, в случае использования в виде переменных окружения. Kubelet при создании проверяет, что нужный ConfigMap/Secret есть и передает в качестве переменных окружений конфигурацию оттуда. В случае использования Configmap/Secret, как примонтированной директории в контейнере, kubelet периодически обновляет данные. И при изменения ConfigMap/Secret эти изменения там отразятся. Но в любом случае приложение должно уметь перечитывать и определять изменения из конфигурации. Ссылки:

· конфигурирование приложений в Kubernetes (англ)

· объект ConfigMap (англ)

· объект Secret (англ)

#ConfigMap #Secret #env #DevOps #Kubernetes