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-конфига поды обычно перезапускают, файлы обновляются сами.