Secret: чувствительные данные

Пароли и токены не место в манифесте на виду — для них есть отдельный объект Secret.

Secret — объект для хранения чувствительных данных (пароли, токены, ключи, TLS-сертификаты), подключаемых к подам так же, как ConfigMap.

Технически Secret почти как ConfigMap, но предназначен для секретов. Kubernetes обращается с ним аккуратнее: значения не светятся в обычном выводе, доступ к ним можно ограничивать политиками. Подключается он теми же способами — env-переменные или файлы.

Создаём Secret

Проще всего императивно — Kubernetes сам закодирует значения:

kubectl create secret generic db-secret \
  --from-literal=DB_USER=admin \
  --from-literal=DB_PASSWORD=s3cr3t

В манифесте значения хранятся в base64 (в поле data). Это кодирование, а не шифрование — base64 легко раскодировать:

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  DB_USER: YWRtaW4=          # base64('admin')
  DB_PASSWORD: czNjcjN0      # base64('s3cr3t')

Важно: base64 — это НЕ защита. Не кладите Secret-манифесты с реальными значениями в Git. Для реальной безопасности используют шифрование etcd и внешние хранилища (Vault, облачные secret-менеджеры).

Подключение как env-переменные

spec:
  containers:
    - name: app
      image: my-app:1.0
      env:
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: DB_PASSWORD

Внутри контейнера появится переменная DB_PASSWORD со значением из Secret. Так же его можно смонтировать как файлы через volumes — удобно для сертификатов.

ConfigMapSecret
Для чегообычные настройкипароли, токены, ключи
Хранение значенийкак естьbase64
Подключениеenv / файлыenv / файлы

Итог

  • Secret хранит чувствительные данные отдельно от обычной конфигурации.
  • Значения кодируются в base64 — это не шифрование, а лишь кодирование.
  • Подключается как env-переменные (secretKeyRef) или как файлы.
Проверьте себя
1. Чем Secret отличается от ConfigMap?
ASecret быстрее работает
BSecret предназначен для чувствительных данных и хранит значения в base64
CSecret нельзя подключить к поду
DConfigMap шифрует данные, а Secret нет
2. Что нужно помнить про base64 в Secret?
AЭто надёжное шифрование
BЭто всего лишь кодирование, легко обратимое — не защита
CЭто сжатие данных
DЭто формат логов
3. Как подключить значение Secret как переменную окружения?
AЧерез configMapRef
BЧерез valueFrom.secretKeyRef
CЧерез port-forward
DЧерез nodePort
Поддержать проект