← До програми курсу

Модуль 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 не стає environment variable автоматично. Застосунок читає файл, а оператор не виводить його в logs.

04

4. Життєвий цикл і scope

Об’єкт існує на рівні Swarm, а service spec надає task право отримати його. Docker забороняє видалити config або secret, поки service посилається на нього.

Versioned names зберігають аудит і дозволяють атомарно прибрати v1 та додати v2.

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 v2, однією 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 — перевірте ім’я
  • in use — спочатку оновіть services
  • permission denied — узгодьте mode і UID
  • update paused — досліджуйте task
10

10. Контроль, критерії засвоєння та cleanup

  • Коли потрібен config, а коли secret?
  • Чому об’єкти immutable?
  • Чому inspect не показує payload?
  • Хто отримує secret?
  • Навіщо versioned names?
  • Чому service rm недостатньо?

Модуль засвоєно, якщо ви безпечно виконуєте 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