Открыть сервис

ConfigMap

ConfigMap — это объект API в платформе оркестрации контейнеров Kubernetes, предназначенный для хранения неконфиденциальных данных в формате «ключ-значение». ConfigMap позволяет отделить конфигурацию приложения от его образа контейнера, что упрощает управление настройками в различных средах (разработка, тестирование, продуктивная среда) без пересборки образов. Данные в ConfigMap хранятся в виде пар «ключ-значение» или в виде файлов (например, конфигурационных файлов в формате YAML, JSON, INI). В отличие от Secret, ConfigMap не предназначен для хранения чувствительных данных (паролей, токенов, ключей шифрования), так как его содержимое не шифруется по умолчанию.

История и происхождение

ConfigMap был введён в Kubernetes версии 1.2 (выпущен в марте 2016 года) как часть усилий по улучшению управления конфигурацией в контейнерных приложениях. До появления ConfigMap разработчики часто использовали переменные окружения, передаваемые в поды через аргументы командной строки или жёстко закодированные в образах контейнеров. Это приводило к проблемам:

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

ConfigMap решил эти проблемы, предоставив декларативный способ хранения и предоставления конфигурационных данных подам. В последующих версиях Kubernetes (1.6, 1.9, 1.14) функциональность ConfigMap была расширена: добавлена поддержка бинарных данных (через binaryData), возможность использования ConfigMap в качестве томов (volumes) и улучшена интеграция с другими объектами, такими как Deployments и StatefulSets.

Структура и создание

Определение ConfigMap

ConfigMap создаётся с помощью манифеста YAML или JSON, который включает следующие поля:

  • apiVersion: v1 (для Kubernetes 1.0+).
  • kind: ConfigMap.
  • metadata: имя, пространство имён (namespace), метки (labels) и аннотации (annotations).
  • data: карта строковых пар «ключ-значение» (значения могут быть произвольными строками, включая многострочные).
  • binaryData: (опционально) карта бинарных данных, закодированных в Base64.

Пример манифеста ConfigMap:

``yaml apiVersion: v1 kind: ConfigMap metadata: name: app-config namespace: default data: APP_ENV: production LOG_LEVEL: info config.yaml: | database: host: localhost port: 5432 name: myapp ``

Способы создания

  1. Из файла YAML/JSON: kubectl apply -f configmap.yaml.
  2. Из литеральных значений: kubectl create configmap app-config --from-literal=APP_ENV=production --from-literal=LOG_LEVEL=info.
  3. Из файлов на диске: kubectl create configmap app-config --from-file=config.yaml — каждый файл становится ключом, а его содержимое — значением.
  4. Из каталога: kubectl create configmap app-config --from-file=./configs/ — все файлы из каталога добавляются как отдельные ключи.
  5. Из переменных окружения файла .env: kubectl create configmap app-config --from-env-file=app.env.

Использование ConfigMap в подах

ConfigMap может быть передан поду (Pod) несколькими способами:

Переменные окружения

ConfigMap используется для установки переменных окружения в контейнере. Для этого в спецификации пода указывается поле envFrom или valueFrom.

Пример:

```yaml apiVersion: v1 kind: Pod metadata: name: myapp-pod spec: containers:

  • name: myapp

image: myapp:latest envFrom:

  • configMapRef:

name: app-config env:

  • name: SPECIAL_KEY

valueFrom: configMapKeyRef: name: app-config key: special.key ```

Тома (Volumes)

ConfigMap может быть смонтирован как том в файловой системе контейнера. Каждый ключ становится файлом, а значение — содержимым файла. Это полезно для конфигурационных файлов (например, nginx.conf, application.properties).

Пример:

```yaml apiVersion: v1 kind: Pod metadata: name: myapp-pod spec: containers:

  • name: myapp

image: myapp:latest volumeMounts:

  • name: config-volume

mountPath: /etc/config volumes:

  • name: config-volume

configMap: name: app-config ```

Аргументы командной строки

Значения из ConfigMap могут быть переданы в качестве аргументов командной строки через переменные окружения или напрямую через $(VAR_NAME) в спецификации пода.

Особенности и ограничения

Размер и хранение

  • Максимальный размер ConfigMap ограничен 1 МБ (по умолчанию в etcd). Это ограничение связано с производительностью etcd, где хранятся все объекты Kubernetes.
  • ConfigMap хранится в etcd и реплицируется на все узлы кластера. При большом количестве ConfigMap может увеличиться нагрузка на etcd.

Неизменяемость (Immutable)

Начиная с Kubernetes 1.19, ConfigMap может быть объявлен как неизменяемый (immutable: true). Это повышает производительность (не требуется отслеживание изменений) и безопасность (защита от случайного изменения). Однако после создания неизменяемого ConfigMap его данные нельзя изменить — только удалить и создать заново.

Безопасность

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

Жизненный цикл

  • ConfigMap существует в пространстве имён (namespace) и может быть использован только подами в том же namespace.
  • При удалении ConfigMap поды, которые его используют, продолжают работать с последними полученными данными, но не могут обновиться. Для обновления конфигурации требуется перезапуск пода или использование механизмов, таких как kubectl rollout restart.

Примеры использования

Конфигурация веб-сервера Nginx

ConfigMap может содержать конфигурационный файл Nginx, который монтируется в под:

``yaml apiVersion: v1 kind: ConfigMap metadata: name: nginx-config data: nginx.conf: | server { listen 80; server_name example.com; location / { proxy_pass http://backend:8080; } } ``

Настройка приложения на Java

Для Java-приложений ConfigMap может содержать файл application.properties:

``yaml apiVersion: v1 kind: ConfigMap metadata: name: java-app-config data: application.properties: | server.port=8080 spring.datasource.url=jdbc:postgresql://db:5432/mydb spring.datasource.username=user spring.datasource.password=password ``

Многострочные значения

ConfigMap поддерживает многострочные значения, что удобно для хранения JSON, YAML или скриптов:

```yaml data: script.sh: |

!/bin/bash

echo "Hello, World!" exit 0 ```

Сравнение с другими механизмами конфигурации

МеханизмНазначениеШифрованиеРазмерИзменяемостьПримеры использования
ConfigMapНеконфиденциальные данныеНет<=1 МБДа/Нет (immutable)Переменные окружения, конфиг-файлы
SecretКонфиденциальные данныеДа (опционально)<=1 МБДа/Нет (immutable)Пароли, токены, ключи SSH
Downward APIМетаданные пода/контейнераНет-ДаИмя пода, namespace, IP-адрес
External Config StoreВнешние хранилища (Consul, etcd, Vault)ДаНеограниченДаДинамическая конфигурация, секреты

Инструменты и интеграции

  • Helm: ConfigMap часто используется в чартах Helm для передачи конфигурации приложений. Значения из values.yaml могут быть преобразованы в ConfigMap.
  • Kustomize: Позволяет генерировать ConfigMap из файлов или литералов, а также объединять несколько ConfigMap.
  • ArgoCD: ConfigMap может быть использован для хранения конфигурации приложений, развёртываемых через GitOps.
  • Prometheus Operator: ConfigMap используется для хранения правил алертинга и конфигурации Prometheus.

Интересные факты

  • ConfigMap может быть использован для хранения скриптов, которые затем запускаются в поде через command или args.
  • В Kubernetes 1.20 была добавлена возможность использования ConfigMap в качестве источника данных для initContainers.
  • ConfigMap не поддерживает динамическое обновление без перезапуска пода, если не используются специальные механизмы, такие как Reloader (сторонний инструмент) или kubectl rollout restart.
  • В некоторых случаях ConfigMap используется для хранения конфигурации самого Kubernetes, например, для настройки kubelet или kube-proxy через ConfigMap в пространстве имён kube-system.

Источники

  • Официальная документация Kubernetes: «ConfigMap» (kubernetes.io/docs/concepts/configuration/configmap/)
  • Kubernetes: Up and Running, 2nd Edition (Kelsey Hightower, Brendan Burns, Joe Beda)
  • «Kubernetes Patterns» (Bilgin Ibryam, Roland Huß)
  • Kubernetes GitHub: исходный код и спецификации API (github.com/kubernetes/kubernetes)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →