Модуль 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 не стає environment variable автоматично. Застосунок читає файл, а оператор не виводить його в logs.
4. Життєвий цикл і scope
Об’єкт існує на рівні Swarm, а service spec надає task право отримати його. Docker забороняє видалити config або secret, поки service посилається на нього.
Versioned names зберігають аудит і дозволяють атомарно прибрати v1 та додати v2.
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 v2, однією 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 — перевірте ім’я
- in use — спочатку оновіть services
- permission denied — узгодьте mode і UID
- update paused — досліджуйте task
10. Контроль, критерії засвоєння та cleanup
- Коли потрібен config, а коли secret?
- Чому об’єкти immutable?
- Чому inspect не показує payload?
- Хто отримує secret?
- Навіщо versioned names?
- Чому service rm недостатньо?
Модуль засвоєно, якщо ви безпечно виконуєте 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