Что такое ConfigMap и Secret?
Суть коротко
ConfigMap — объект для неконфиденциальной конфигурации (параметры, файлы, флаги). Secret — для чувствительных данных (пароли, ключи, сертификаты). Технически Secret хранит значения в base64, но по умолчанию это не шифрование — он всё равно лежит в etcd, потому требуется дополнительная защита.
Где хранить что
-
ConfigMap — конфиги, URL-ы, feature-flags, конфигурационные файлы (json/yaml), env-переменные.
-
Secret — пароли, TLS-сертификаты, API-ключи, любые данные, доступ к которым нужно ограничить.
Создание (примеры)
CLI:
kubectl create configmap app-config --from-literal=LOG_LEVEL=info --from-file=config.yml
kubectl create secret generic db-secret --from-literal=DB_PASS='s3cr3t' --from-file=cert.pem
YAML (секрет в stringData — Kubernetes сам закодирует в base64):
apiVersion: v1
kind: Secret
metadata: { name: db-secret }
type: Opaque
stringData:
password: "s3cr3t"
Как монтировать в Pod
- Как env:
env:
\- name: DB_PASS
valueFrom:
secretKeyRef: { name: db-secret, key: password }
- Как volume (файлы):
volumes:
\- name: cfg
configMap: { name: app-config }
\- name: s
secret: { secretName: db-secret }
Поведение при обновлениях
-
ConfigMap: при монтировании как volume файл обновляется автоматически (kubelet синхронизирует), но env-переменные не поменяются — нужен рестарт Pod.
-
Secret: аналогично — volume обновляется, env — нет. Для динамической ротации секретов лучше использовать CSI Secrets Store или Vault Agents.
Безопасность и best practices
-
Не храните секреты в Git; используйте SealedSecrets, SOPS, External Secrets или Vault + CSI driver.
-
Включите encryption at rest для секретов (шифрование данных в etcd).
-
Ограничьте доступ через RBAC: кто может get/list/watch Secret/ConfigMap.
-
Отключите автоматическое монтирование serviceAccountToken если не нужно (automountServiceAccountToken: false).
-
Не логируйте секреты и не передавайте их в командной строке.
-
Для многооблачья/ротации используйте внешние менеджеры секретов (Vault, cloud secret managers) и sync через operators/CSI.
Ограничения и практические советы
-
Не храните большие бинарные блобы — ConfigMap/Secret не предназначены для heavy storage; держите их компактными (<~1MB рекомендуют практики).
-
Обновления env требуют redeploy; для живой ротации используйте volumes/CSI.
-
Namespace-scoped: доступ только в том же namespace (либо через explicit copy/automation).
Дополнительные опции
-
immutable: true для ConfigMap/Secret — предотвращает изменения (полезно для стабильных конфигураций).
-
type: kubernetes.io/tls, docker-registry и пр. — специальные типы Secret с удобной семантикой.
Используйте ConfigMap для всего, что не секрет, а Secret — только для чувствительного; комбинируйте с шифрованием etcd, RBAC и внешними секрет-сторами для реальной безопасности.