Что такое 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 — это кодирование, а не шифрование.