Ответ
Secrets и ConfigMaps — это ресурсы Kubernetes для управления конфигурацией, но с разным назначением и уровнем безопасности.
Основные различия:
| Аспект | ConfigMap | Secret |
|---|---|---|
| Назначение | Хранение неконфиденциальных данных (настройки приложений, конфигурационные файлы, переменные окружения). | Хранение конфиденциальных данных (пароли, токены API, SSH-ключи, TLS-сертификаты). |
| Хранение | Данные хранятся в открытом виде (plain text). | Данные хранятся в кодировке base64 (это кодирование, а не шифрование). Для повышения безопасности следует использовать шифрование на уровне etcd (например, через EncryptionConfiguration) или внешние секреты-менеджеры (HashiCorp Vault, AWS Secrets Manager). |
| Типы | Обычный ресурс. | Имеет встроенные типы (Opaque, kubernetes.io/tls, kubernetes.io/dockerconfigjson, kubernetes.io/service-account-token). |
| Обновление | Изменения не применяются автоматически в запущенных подах. Для обновления требуется перезапуск пода, использование sidecar-контейнера (например, Reloader) или чтение конфигурации приложением динамически. |
Аналогично ConfigMap — изменения не применяются автоматически. |
Пример ConfigMap для настроек приложения:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app.properties: |
logging.level=INFO
cache.size=100
feature.flag.enabled=true
Пример Secret для пароля БД:
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
type: Opaque
data:
username: YWRtaW4= # base64 для 'admin'
password: cGFzc3dvcmQxMjM= # base64 для 'password123'
Как использовать в Pod:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: app
image: myapp:latest
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: password
envFrom:
- configMapRef:
name: app-config
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config
Практический совет: Всегда используйте минимально необходимые права доступа (RBAC) для секретов и избегайте хранения их в репозитории кода. Для управления секретами в Git используйте инструменты типа Sealed Secrets или SOPS.