Что такое 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 и внешними секрет-сторами для реальной безопасности.