ConfigMap и Secrets

ConfigMap и Secrets

Управление конфигурациями и безопасностью

В современной разработке (IaC — Infrastructure as Code) крайне важно отделять код приложения от его настроек. Kubernetes предоставляет для этого два основных объекта: ConfigMap (для обычных данных) и Secret (для конфиденциальных данных).

Эволюция хранения конфигов

  1. Простой файл: Раньше настройки хранились прямо в коде или в файле рядом с исполняемым файлом.
  2. Роли и окружения: С ростом проекта появились разные окружения (Dev, Staging, Prod) и роли доступа. Хранить всё в одном месте стало невозможно.
  3. Централизованное хранение (IaC): В Kubernetes конфигурации хранятся в etcd, управляются через API и динамически подключаются к подам.

Способы передачи переменных

Самый простой способ передать настройки — прописать их прямо в манифесте Пода через поле env.

apiVersion: v1
kind: Pod
metadata:
  name: envar-demo
spec:
  containers:
    - name: envar-demo-container
      image: gcr.io/google-samples/node-hello:1.0
      env:
        - name: DEMO_GREETING
          value: "Hi all!"

ConfigMap: Хранение обычных настроек

ConfigMap позволяет хранить конфигурационные данные в виде пар «ключ-значение» или целых конфигурационных файлов.

Пример манифеста ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: demo-app-config
data:
  DRIVER_ADDR: "https://payment.prod.env:8080"
  JWT_ISSUER: "team.prod.env"

Как подключить ConfigMap к Поду?

Вы можете загрузить все переменные разом через envFrom или выбрать конкретный ключ через valueFrom.

apiVersion: v1
kind: Pod
metadata:
  name: demo-app
spec:
  containers:
    - name: demo-app
      image: gcr.io/google-samples/node-hello:1.0
      envFrom:
        - configMapRef:
            name: demo-app-config  # Загрузит все ключи из ConfigMap как переменные
      env:
        - name: JWT_ISSUER_SECOND
          valueFrom:
            configMapKeyRef:
              name: demo-app-config
              key: JWT_ISSUER      # Загрузит только конкретное значение

Secrets: Хранение чувствительных данных

Secrets похожи на ConfigMaps, но предназначены для паролей, токенов и ключей. Данные в манифесте секрета должны быть закодированы в base64.

Пример манифеста Secret:

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=        # admin в base64
  password: MWYyZDFlMmU2N2Rm # хеш пароля в base64

Типы секретов в Kubernetes:

  • Opaque: Обычный секрет для произвольных данных (по умолчанию).
  • kubernetes.io/service-account-token: Токен для сервисных аккаунтов.
  • kubernetes.io/dockercfg / .dockerconfigjson: Данные для авторизации в Docker Registry.
  • kubernetes.io/basic-auth: Логин и пароль для базовой аутентификации.
  • kubernetes.io/ssh-auth: Данные для SSH-авторизации.
  • kubernetes.io/tls: Для хранения сертификатов (публичный ключ и приватный ключ).
  • bootstrap.kubernetes.io/token: Токен для начальной загрузки узлов (bootstrap).

Итог

ХарактеристикаConfigMapSecret
Для чего?Настройки, URL-адреса, флаги.Пароли, токены, ключи TLS.
БезопасностьДанные в открытом виде.Данные в base64 (нужно шифрование etcd).
ОбновлениеМожно обновлять "на лету" (при монтировании файлов).Можно обновлять "на лету", но требует осторожности.
Типичный объемДо 1 МБ.До 1 МБ.

Важно: Кодирование в base64 — это не шифрование. Любой, кто имеет доступ к API Kubernetes, может легко декодировать ваши секреты. Для реальной безопасности используйте шифрование etcd или внешние хранилища (HashiCorp Vault, AWS Secrets Manager).

ConfigMaps
A ConfigMap is an API object used to store non-confidential data in key-value pairs. Pods can consume ConfigMaps as environment variables, command-line arguments, or as configuration files in a volume. A ConfigMap allows you to decouple environment-specific configuration from your container images, so that your applications are easily portable. Caution:ConfigMap does not provide secrecy or encryption. If the data you want to store are confidential, use a Secret rather than a ConfigMap, or use additional (third party) tools to keep your data private.
Secrets
A Secret is an object that contains a small amount of sensitive data such as a password, a token, or a key. Such information might otherwise be put in a Pod specification or in a container image. Using a Secret means that you don’t need to include confidential data in your application code. Because Secrets can be created independently of the Pods that use them, there is less risk of the Secret (and its data) being exposed during the workflow of creating, viewing, and editing Pods.