ConfigMap: конфигурация отдельно от образа

Один образ — много окружений: ConfigMap позволяет менять настройки, не пересобирая контейнер.

ConfigMap — объект для хранения неконфиденциальной конфигурации (пары ключ-значение или целые файлы), подключаемой к подам.

Зашивать настройки в образ — плохая идея: для dev, staging и prod нужны разные значения, а пересобирать образ ради смены URL базы данных глупо. ConfigMap отделяет конфигурацию от кода: образ один, конфиги разные.

Создаём ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_MODE: "production"
  PAGE_SIZE: "20"
  WELCOME_MESSAGE: "Привет из Kubernetes"

Способ 1: как переменные окружения

Подключим все ключи ConfigMap как env-переменные контейнера через envFrom:

spec:
  containers:
    - name: app
      image: my-app:1.0
      envFrom:
        - configMapRef:
            name: app-config

Теперь внутри контейнера доступны APP_MODE, PAGE_SIZE и так далее. Можно подключить и отдельный ключ через valueFrom.configMapKeyRef.

Способ 2: как файлы (volume)

Если приложение читает конфиг из файла, смонтируем ConfigMap как том — каждый ключ станет файлом:

spec:
  containers:
    - name: app
      image: my-app:1.0
      volumeMounts:
        - name: config
          mountPath: /etc/app
  volumes:
    - name: config
      configMap:
        name: app-config

В каталоге /etc/app появятся файлы APP_MODE, PAGE_SIZE и т. д. с их значениями.

Обновление конфигурации

Изменили ConfigMap и применили — значения, смонтированные как файлы, обновятся в подах автоматически (с задержкой). А вот env-переменные читаются один раз при старте, поэтому после правки ConfigMap поды с env обычно перезапускают:

kubectl apply -f app-config.yaml
kubectl rollout restart deployment/app

Итог

  • ConfigMap отделяет конфигурацию от образа: один образ — много окружений.
  • Подключается как env-переменные (envFrom) или как файлы (volume).
  • После правки env-конфига поды обычно перезапускают, файлы обновляются сами.
Проверьте себя
1. Зачем нужен ConfigMap?
AХранить пароли в зашифрованном виде
BХранить неконфиденциальную конфигурацию отдельно от образа
CБалансировать трафик
DМасштабировать поды
2. Какими двумя способами ConfigMap подключают к поду?
AТолько через Ingress
BКак переменные окружения или как смонтированные файлы (volume)
CТолько как Secret
DЧерез kubectl logs
3. Что нужно сделать, чтобы под подхватил новые значения, подключённые как env-переменные?
AНичего, они обновятся сами мгновенно
BПерезапустить поды (например, kubectl rollout restart)
CУдалить namespace
DПересобрать образ
Поддержать проект