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 ``
¶Способы создания
- Из файла YAML/JSON:
kubectl apply -f configmap.yaml. - Из литеральных значений:
kubectl create configmap app-config --from-literal=APP_ENV=production --from-literal=LOG_LEVEL=info. - Из файлов на диске:
kubectl create configmap app-config --from-file=config.yaml— каждый файл становится ключом, а его содержимое — значением. - Из каталога:
kubectl create configmap app-config --from-file=./configs/— все файлы из каталога добавляются как отдельные ключи. - Из переменных окружения файла
.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 →


