Конфигурация и секреты — Примеры

Пример 1 — Настройка, требующая перезапуска

Service читает свой эндпоинт один раз при старте, потому что значение приходит как переменная среды. Поэтому выпуск нового эндпоинта означает новый pod. Измените способ доставки значения так, чтобы приложение могло перезагрузить его, и скажите, что после этого должно делать само приложение.

spec:
  containers:
    - name: api
      envFrom:
        - configMapRef:
            name: api-config

Решение

spec:
  containers:
    - name: api
      volumeMounts:
        - name: config
          mountPath: /etc/api
  volumes:
    - name: config
      configMap:
        name: api-config
config map -> примонтированный файл -> обновляется на месте       -> приложение должно следить и перезагружать
config map -> значение среды        -> фиксировано при старте    -> нужен перезапуск

Примонтированный файл обновляется на месте, тогда как значение среды фиксировано на всё время жизни контейнера, поэтому два способа доставки и решают, является ли изменение конфигурации развёртыванием. Обычная ошибка — примонтировать файл и решить, что процесс это заметит: ничто не перезагружает вашу конфигурацию за вас, поэтому приложение должно следить за файлом, либо перезапуск нужно принять и просмотреть как релиз.

Пример 2 — Пароль, вписанный в манифест

Deployment несёт пароль базы данных прямо в себе, и тот же файл коммитят в репозиторий рядом. Перепишите объявление так, чтобы значение приходило из кластера, и скажите, что должно произойти с закоммиченными учётными данными.

spec:
  containers:
    - name: api
      env:
        - name: DB_PASSWORD
          value: <вписано в файл вручную>

Решение

spec:
  containers:
    - name: api
      env:
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: password

Ключ теперь называет объект секрета в кластере, доступ к которому выдаётся сам по себе и читается во время выполнения, поэтому один и тот же образ работает в любой среде, и никакие учётные данные не лежат в репозитории или в слое образа. Закоммиченное значение нужно ротировать, а не просто удалить, потому что секрет в истории — это утёкший секрет; кодирование тоже не шифрование, и прочитать объект достаточно, поэтому доступ к нему надо ограничивать осознанно.

Подставьте свои имена секретов и детали развёртывания там, где эти наброски используют заполнители.