Gymterview
junior

Что такое ConfigMap и Secret?

ConfigMap и Secret — объекты Kubernetes для хранения конфигурационных данных отдельно от образа контейнера. ConfigMap — для обычных настроек, Secret — для конфиденциальных данных.

ConfigMap

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

Пример
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APPLICATION_PORT: "8080"
  DATABASE_HOST: "postgres-service"
  DATABASE_PORT: "5432"
  LOG_LEVEL: "INFO"
  application.yml: |
    spring:
      datasource:
        url: jdbc:postgresql://postgres-service:5432/mydb
      jpa:
        hibernate:
          ddl-auto: validate

Secret

Secret — аналог ConfigMap, но предназначен для хранения конфиденциальных данных (пароли, токены, ключи). Значения хранятся в формате base64.

Пример
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
data:
  DATABASE_USERNAME: cG9zdGdyZXM=        # postgres (base64)
  DATABASE_PASSWORD: c2VjcmV0MTIz        # secret123 (base64)
  JWT_SECRET: bXktand0LXNlY3JldA==       # my-jwt-secret (base64)

Создание Secret через kubectl:

Пример
kubectl create secret generic app-secret \
  --from-literal=DATABASE_USERNAME=postgres \
  --from-literal=DATABASE_PASSWORD=secret123

Способы передачи в контейнер

Способ Описание Когда использовать
Переменные окружения (env / envFrom) Каждый ключ становится env-переменной Простые значения, пароли
Монтирование как Volume Ключи становятся файлами в указанной директории Конфигурационные файлы (application.yml)
Примеры передачи в контейнер

Через переменные окружения:

spec:
  containers:
    - name: app
      image: my-registry/my-java-app:1.0.0
      env:
        - name: DB_HOST
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: DATABASE_HOST
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: app-secret
              key: DATABASE_PASSWORD
      envFrom:
        - configMapRef:
            name: app-config
        - secretRef:
            name: app-secret

Через монтирование как Volume:

spec:
  containers:
    - name: app
      image: my-registry/my-java-app:1.0.0
      volumeMounts:
        - name: config-volume
          mountPath: /app/config
          readOnly: true
  volumes:
    - name: config-volume
      configMap:
        name: app-config

Secret в Kubernetes по умолчанию хранятся только в base64, а не зашифрованы. Для настоящего шифрования нужно включить encryption at rest или использовать внешние решения (HashiCorp Vault, Sealed Secrets).

На собеседовании: ключевое — объяснить разницу ConfigMap vs Secret и два способа передачи (env и volume). Частая ошибка — думать, что Secret зашифрован. Base64 — это кодирование, а не шифрование.