Модуль 12 / 24
Configs и secrets
Содержание
1. Цели и результат модуля
После модуля вы сможете выбирать config или secret, ограничивать их service spec, выполнять версионированную ротацию и подтверждать cleanup.
- понимать неизменяемость объектов
- монтировать target и mode
- не раскрывать secret через inspect
- обновлять service с v1 на v2
2. Теория: configs
Config хранит несекретные данные в Raft и доставляет их только task подключённого service. Он подходит для параметров приложения и шаблонов. Содержимое неизменяемо: изменение моделируют новым именем и ID.
Config не скрывает данные от manager и процесса task. Чувствительные значения в нём недопустимы.
3. Теория: secrets
Secret шифруется в Raft и передаётся только назначенным tasks по защищённому control plane. В Linux task он доступен как файл в in-memory filesystem `/run/secrets`; inspect не возвращает payload.
Secret не является переменной окружения автоматически. Приложение должно читать файл, а оператор — не выводить его содержимое в logs.
4. Жизненный цикл и scope
Объект существует на уровне Swarm, а service spec выдаёт task право получить его. Docker запрещает удалить config или secret, пока service ссылается на него. Удаление service не удаляет объекты автоматически.
Versioned names сохраняют аудит и позволяют атомарно убрать v1 и добавить v2 в одной service update.
5. Методические указания
- Используйте только учебный secret
- Передавайте payload через stdin без файла
- Не печатайте secret и проверяйте только длину
- Задавайте минимальный mode
- Сначала обновляйте consumers, затем удаляйте v1
- После service rm удаляйте оставшиеся objects
6. Лабораторная работа: создание и mount
Создайте v1 из stdin и service на manager-2. Config появляется по заданному пути, secret — под `/run/secrets/token`.
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 3600ssh 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-v17. Лабораторная работа: защита используемого объекта
Обе команды должны завершиться ошибкой object is in use. Это ожидаемый guardrail; продолжайте ротацию после фиксации результата.
ssh swarm-manager-2 docker secret rm swarm-m12-token-v1
ssh swarm-manager-2 docker config rm swarm-m12-app-v18. Лабораторная работа: ротация v1 → v2
Создайте новые immutable objects, одной update замените обе ссылки и дождитесь convergence. Новый task увидит production config и secret длиной 17 байт. После этого v1 удаляется.
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-v19. Диагностика
Разделяйте отсутствие объекта, неверный target, permission и failure нового task. Metadata inspect подтверждает attachment без раскрытия payload.
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. Контроль, критерии освоения и cleanup
- Когда нужен config, а когда secret?
- Почему объекты immutable?
- Почему inspect не показывает payload secret?
- Кто получает secret?
- Зачем versioned names?
- Почему service rm недостаточно для cleanup?
Модуль освоен, если вы безопасно выполняете v1→v2, не выводите payload и удаляете только неиспользуемые объекты.
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