PRO

Как управлять секретами в Docker/K8s (Vault, Secrets)?

Секреты — это пароли, токены, ключи и сертификаты, которые нельзя хранить в Docker image, исходном коде или обычных ConfigMap. Kubernetes Secret хранит данные в кластере и может передавать их в Pod как переменные окружения или файлы, а Vault и внешние secret managers позволяют централизованно выдавать, ротировать и аудитировать секреты.
Подробный ответ

Что считать секретом

К секретам относятся пароли баз данных, API keys, OAuth client secrets, JWT signing keys, TLS-сертификаты, токены доступа к registry и credentials внешних сервисов. Они не должны попадать в Dockerfile, Git-репозиторий, логи CI/CD и публичные container images.

Kubernetes Secret

Kubernetes Secret хранит конфиденциальные данные отдельно от манифеста приложения. Secret можно подключить как переменные окружения или как volume с файлами.

apiVersion: v1
kind: Secret
metadata:
  name: api-secrets
type: Opaque
stringData:
  DATABASE_URL: postgresql://app:password@db:5432/app_db
  JWT_SECRET: change-me-in-production

Подключение Secret в Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
spec:
  template:
    spec:
      containers:
        - name: api
          image: ghcr.io/acme/api:1.0.0
          envFrom:
            - secretRef:
                name: api-secrets

Ограничения Kubernetes Secrets

Значения в обычном Secret кодируются в base64, но base64 не является шифрованием. Для production нужны encryption at rest в etcd, строгие RBAC-права, аудит доступа и запрет на вывод секретов в логи.

Vault и внешние secret managers

Vault, облачные Secret Manager-сервисы и External Secrets Operator позволяют не хранить постоянные значения прямо в манифестах Kubernetes. Они поддерживают централизованный доступ, ротацию, короткоживущие credentials, dynamic database credentials и аудит выдачи секретов.

Практические правила

  • не встраивать секреты в image и не передавать их через Dockerfile ENV;

  • разделять доступ по namespace, сервисам и ролям;

  • использовать отдельные секреты для development, staging и production;

  • настраивать ротацию и процедуру отзыва скомпрометированных ключей;

  • проверять CI/CD на случайное попадание секретов в артефакты и логи.

Как ответить на собеседовании

В Kubernetes я передаю секреты через Secret как env-переменные или volume, но помню, что base64 не шифрует данные. Для production включаю encryption at rest и RBAC. Если нужна централизованная ротация, аудит и short-lived credentials, использую Vault или облачный secret manager вместе с оператором синхронизации секретов.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге