ConfigMap — объект Kubernetes для хранения конфигурационных данных в формате ключ-значение. Позволяет отделить конфигурацию от Docker-образа: изменить URL базы данных или параметры кеша без пересборки контейнера.
Как работает
ConfigMap создаётся в кластере как отдельный ресурс и монтируется в Pod двумя способами: как переменные среды или как файлы в файловую систему контейнера. Pod ссылается на ConfigMap по имени — при обновлении данных в ConfigMap примонтированные файлы обновляются автоматически (с небольшой задержкой до 60 секунд), переменные среды требуют перезапуска Pod.
Создание ConfigMap
# Из литерала
kubectl create configmap app-config --from-literal=DATABASE_URL=postgres://localhost:5432/db --from-literal=CACHE_TTL=300
# Из файла конфигурации
kubectl create configmap nginx-config --from-file=nginx.conf
# Из директории (все файлы)
kubectl create configmap app-configs --from-file=./configs/
# YAML-манифест
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DATABASE_URL: "postgres://localhost:5432/db"
nginx.conf: |
server {
listen 80;
location / { proxy_pass http://backend; }
}
История
ConfigMap появился в Kubernetes 1.2 (2016). До этого конфигурацию передавали через переменные среды напрямую в спецификации Pod — неудобно и негибко. ConfigMap стал частью принципа «12-факторного приложения»: хранить конфигурацию отдельно от кода. Secret — аналог ConfigMap для чувствительных данных: пароли, токены, TLS-сертификаты. Secret хранится в base64-кодировании и не попадает в логи kubectl.
Использование в Pod
# Как переменные среды
env:
- name: DB_URL
valueFrom:
configMapKeyRef:
name: app-config
key: DATABASE_URL
# Как файл в контейнере
volumes:
- name: config-volume
configMap:
name: nginx-config
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/conf.d
ConfigMap vs Secret vs Helm values
ConfigMap — для несекретных настроек: URL, таймауты, флаги фич. Secret — для паролей, API-ключей, TLS. Helm values — параметризация на уровне деплоя, генерирует ConfigMap/Secret автоматически. Для централизованного управления секретами используют HashiCorp Vault с оператором External Secrets.
На что обращать внимание
ConfigMap ограничен 1 MB данных — не подходит для хранения больших файлов или бинарных данных. Обновление ConfigMap не перезапускает Pod автоматически — нужно rollout restart: kubectl rollout restart deployment/myapp. В Coolify и других PaaS-инструментах аналог ConfigMap — переменные окружения приложения, управляемые через UI.
Immutable ConfigMap
В Kubernetes 1.21+ ConfigMap поддерживает поле immutable: true. Неизменяемый ConfigMap не проверяется kube-apiserver при каждом монтировании, что снижает нагрузку на API сервер в больших кластерах с тысячами Pod. Изменить иммутабельный ConfigMap нельзя — нужно создать новый с другим именем и обновить ссылки в Pod-спецификации.
Интеграция с CI/CD
В Helm chart ConfigMap генерируется из шаблона с переменными, специфичными для окружения. Файл values-production.yaml содержит production-значения, values-staging.yaml — staging. Деплой: helm upgrade myapp ./chart -f values-production.yaml.
External Secrets Operator синхронизирует секреты из HashiCorp Vault, AWS Secrets Manager или Yandex Lockbox в Kubernetes Secrets автоматически. При ротации секрета в Vault Secret в кластере обновляется без ручного вмешательства — безопаснее, чем хранить пароли в ConfigMap или переменных среды Pod.
Ограничения и альтернативы
Максимальный размер одного ConfigMap — 1 MB. Для хранения больших файлов конфигурации (сертификаты, словари) используйте отдельные PersistentVolume или облачное хранилище с монтированием через CSI-драйвер.