← К программе курса

Модуль 12 / 24

Configs и secrets

DOCKER SWARM

Содержание
01

1. Цели и результат модуля

После модуля вы сможете выбирать config или secret, ограничивать их service spec, выполнять версионированную ротацию и подтверждать cleanup.

  • понимать неизменяемость объектов
  • монтировать target и mode
  • не раскрывать secret через inspect
  • обновлять service с v1 на v2
02

2. Теория: configs

Config хранит несекретные данные в Raft и доставляет их только task подключённого service. Он подходит для параметров приложения и шаблонов. Содержимое неизменяемо: изменение моделируют новым именем и ID.

Config не скрывает данные от manager и процесса task. Чувствительные значения в нём недопустимы.

03

3. Теория: secrets

Secret шифруется в Raft и передаётся только назначенным tasks по защищённому control plane. В Linux task он доступен как файл в in-memory filesystem `/run/secrets`; inspect не возвращает payload.

Secret не является переменной окружения автоматически. Приложение должно читать файл, а оператор — не выводить его содержимое в logs.

04

4. Жизненный цикл и scope

Объект существует на уровне Swarm, а service spec выдаёт task право получить его. Docker запрещает удалить config или secret, пока service ссылается на него. Удаление service не удаляет объекты автоматически.

Versioned names сохраняют аудит и позволяют атомарно убрать v1 и добавить v2 в одной service update.

05

5. Методические указания

  • Используйте только учебный secret
  • Передавайте payload через stdin без файла
  • Не печатайте secret и проверяйте только длину
  • Задавайте минимальный mode
  • Сначала обновляйте consumers, затем удаляйте v1
  • После service rm удаляйте оставшиеся objects
06

6. Лабораторная работа: создание и mount

Создайте v1 из stdin и service на manager-2. Config появляется по заданному пути, secret — под `/run/secrets/token`.

terminal
printf 'APP_MODE=training\n' | ssh swarm-manager-2 'docker config create swarm-m12-app-v1 -'
printf 'm12-demo-token-v1' | ssh swarm-manager-2 'docker secret create swarm-m12-token-v1 -'
ssh swarm-manager-2 docker service create --detach=true --name swarm-m12-reader --constraint node.hostname==swarm-manager-2 --config source=swarm-m12-app-v1,target=/etc/swarm-m12/app.env,mode=0444 --secret source=swarm-m12-token-v1,target=token,mode=0400 alpine:3.22 sleep 3600
terminal
ssh swarm-manager-2 'id=$(docker ps -q --filter label=com.docker.swarm.service.name=swarm-m12-reader); docker exec "$id" cat /etc/swarm-m12/app.env; docker exec "$id" wc -c /run/secrets/token; docker exec "$id" stat -c "%a %n" /etc/swarm-m12/app.env /run/secrets/token'
ssh swarm-manager-2 docker secret inspect swarm-m12-token-v1
ssh swarm-manager-2 docker config inspect swarm-m12-app-v1
07

7. Лабораторная работа: защита используемого объекта

Обе команды должны завершиться ошибкой object is in use. Это ожидаемый guardrail; продолжайте ротацию после фиксации результата.

terminal
ssh swarm-manager-2 docker secret rm swarm-m12-token-v1
ssh swarm-manager-2 docker config rm swarm-m12-app-v1
08

8. Лабораторная работа: ротация v1 → v2

Создайте новые immutable objects, одной update замените обе ссылки и дождитесь convergence. Новый task увидит production config и secret длиной 17 байт. После этого v1 удаляется.

terminal
printf 'APP_MODE=production\n' | ssh swarm-manager-2 'docker config create swarm-m12-app-v2 -'
printf 'm12-demo-token-v2' | ssh swarm-manager-2 'docker secret create swarm-m12-token-v2 -'
ssh swarm-manager-2 docker service update --detach=false --config-rm swarm-m12-app-v1 --config-add source=swarm-m12-app-v2,target=/etc/swarm-m12/app.env,mode=0444 --secret-rm swarm-m12-token-v1 --secret-add source=swarm-m12-token-v2,target=token,mode=0400 swarm-m12-reader
ssh swarm-manager-2 docker config rm swarm-m12-app-v1
ssh swarm-manager-2 docker secret rm swarm-m12-token-v1
09

9. Диагностика

Разделяйте отсутствие объекта, неверный target, permission и failure нового task. Metadata inspect подтверждает attachment без раскрытия payload.

terminal
ssh swarm-manager-2 docker service inspect swarm-m12-reader --pretty
ssh swarm-manager-2 docker service ps swarm-m12-reader --no-trunc
ssh swarm-manager-2 docker config ls --filter name=swarm-m12
ssh swarm-manager-2 docker secret ls --filter name=swarm-m12
  • secret not found — проверьте имя и Swarm
  • in use — сначала обновите все services
  • permission denied — согласуйте mode и UID процесса
  • update paused — исследуйте новый task
10

10. Контроль, критерии освоения и cleanup

  • Когда нужен config, а когда secret?
  • Почему объекты immutable?
  • Почему inspect не показывает payload secret?
  • Кто получает secret?
  • Зачем versioned names?
  • Почему service rm недостаточно для cleanup?

Модуль освоен, если вы безопасно выполняете v1→v2, не выводите payload и удаляете только неиспользуемые объекты.

terminal
ssh swarm-manager-2 docker service rm swarm-m12-reader
ssh swarm-manager-2 docker config rm swarm-m12-app-v2
ssh swarm-manager-2 docker secret rm swarm-m12-token-v2
ssh swarm-manager-2 docker config ls --filter name=swarm-m12
ssh swarm-manager-2 docker secret ls --filter name=swarm-m12