Код-ревью Middle ConfigMap и Secret обновлено
Ревью: конфигурация пода
Вопрос
Найди проблемы в конфигурации пода.
apiVersion: v1
kind: Secret
metadata:
name: api-secrets
data:
DB_PASSWORD: cHJvZC1wYXNzd29yZC0xMjM=
---
apiVersion: v1
kind: ConfigMap
metadata:
name: api-config
data:
LOG_LEVEL: info
RETRIES: 3
STRIPE_KEY: sk_live_51Hx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
template:
spec:
containers:
- name: api
image: registry.example.com/api:1.4.2
args: ["--db-password=$(DB_PASSWORD)"]
volumeMounts:
- name: config
mountPath: /etc/api/app.yaml
subPath: app.yaml
Коротко
Как правильно: Сам api-secrets создаёт External Secrets Operator из хранилища, в git лежит только ExternalSecret со ссылкой. Приложение читает пароль и ключ из файлов в /run/secrets/api.
Что должен найти ревьюер
- Безопасностьстрока 6Реальный пароль в манифесте в git: base64 раскодируется за секунду. Значение должно приходить из внешнего хранилища (External Secrets, Sealed Secrets, SOPS).
- Ошибкастрока 14Значение
3без кавычек: вdataConfigMap допустимы только строки, API отклонит объект. Нужно"3". - Безопасностьстрока 15Боевой платёжный ключ в ConfigMap: он не для секретов (нет отдельного RBAC, хранение в открытом виде). Перенести в Secret из хранилища.
- Безопасностьстрока 27Пароль передаётся аргументом командной строки: виден в спецификации пода,
psи логах запуска. Передавать файлом или переменной окружения. - Ошибкастрока 31Том через
subPathне обновляется при изменении ConfigMap. Монтировать каталог или перезапускать поды при смене конфига. - ОшибкаНет
selector, меток шаблона и объявления томаconfigвvolumes: Deployment не пройдёт валидацию.
Разбор
Как правильно:
apiVersion: v1
kind: ConfigMap
metadata:
name: api-config
data:
LOG_LEVEL: info
RETRIES: "3"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
selector:
matchLabels: { app: api }
template:
metadata:
labels: { app: api }
annotations:
checksum/config: "<хеш ConfigMap>"
spec:
containers:
- name: api
image: registry.example.com/api:1.4.2
envFrom:
- configMapRef: { name: api-config }
volumeMounts:
- name: secrets
mountPath: /run/secrets/api
readOnly: true
volumes:
- name: secrets
secret:
secretName: api-secrets
Сам api-secrets создаёт External Secrets Operator из хранилища, в git лежит только ExternalSecret со ссылкой. Приложение читает пароль и ключ из файлов в /run/secrets/api.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.