Код-ревью 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.

Что должен найти ревьюер

  1. Безопасностьстрока 6
    Реальный пароль в манифесте в git: base64 раскодируется за секунду. Значение должно приходить из внешнего хранилища (External Secrets, Sealed Secrets, SOPS).
  2. Ошибкастрока 14
    Значение 3 без кавычек: в data ConfigMap допустимы только строки, API отклонит объект. Нужно "3".
  3. Безопасностьстрока 15
    Боевой платёжный ключ в ConfigMap: он не для секретов (нет отдельного RBAC, хранение в открытом виде). Перенести в Secret из хранилища.
  4. Безопасностьстрока 27
    Пароль передаётся аргументом командной строки: виден в спецификации пода, ps и логах запуска. Передавать файлом или переменной окружения.
  5. Ошибкастрока 31
    Том через subPath не обновляется при изменении ConfigMap. Монтировать каталог или перезапускать поды при смене конфига.
  6. Ошибка
    Нет 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 ошибок.