Модуль 8 / 24
Registry и immutable images
Содержание
1. Цели и результат модуля
После модуля вы сможете объяснить роль registry, публиковать версии образа, фиксировать deployment по digest и диагностировать image pull.
- различать tag и digest
- проверять доверие TLS registry
- подтверждать одинаковый image на всех nodes
- читать Rejected task при отсутствующем manifest
2. Теория: registry и distribution
Registry хранит content-addressed layers и manifests. Push загружает недостающие blobs и связывает manifest с tag. Каждый node самостоятельно получает image перед запуском task, поэтому registry и его CA должны быть доступны всем nodes.
Production registry требует TLS, аутентификации, контроля доступа, резервного копирования и очистки. Учебный registry доступен только в сети 10.77.0.0/24 и использует временный сертификат.
4. Теория: разрешение образа
Manager пытается разрешить tag до digest при создании service. Если registry недоступен, nodes могут разрешать tag независимо, что Docker прямо отмечает предупреждением. Явный digest устраняет эту неоднозначность, но не заменяет доступность registry для nodes без layers.
5. Методические указания
- Не публикуйте credentials в manifest или shell history
- Проверяйте SAN сертификата и CA на каждом node
- Используйте отдельные repositories и неизменяемые version tags
- Записывайте digest из результата push
- Развёртывайте production service по digest
- Ошибку pull воспроизводите отдельным service и удаляйте после наблюдения
6. Лабораторная работа: registry и две версии
Инструктор заранее запускает временный TLS registry на 10.77.0.11:5000, устанавливает его CA на три nodes, собирает и публикует v1 и v2. Проверьте API и два разных RepoDigests. Значения ниже получены в этой лаборатории; при повторном build используйте новые digests из push.
ssh swarm-manager-1 curl --fail --silent --show-error --cacert /etc/docker/certs.d/10.77.0.11:5000/ca.crt https://10.77.0.11:5000/v2/
ssh swarm-manager-1 docker image inspect 10.77.0.11:5000/swarm-m08/web:v1 --format '{{index .RepoDigests 0}}'
ssh swarm-manager-1 docker image inspect 10.77.0.11:5000/swarm-m08/web:v2 --format '{{index .RepoDigests 0}}'7. Лабораторная работа: deployment v1 по digest
Создайте три replicas по точному digest v1. service ps должен показать Running task на каждом node, а inspect — неизменяемую ссылку.
ssh swarm-manager-2 docker service create --detach=true --name swarm-m08-web --replicas 3 10.77.0.11:5000/swarm-m08/web@sha256:50b6bd7de1feea427f59c5499869be57a3e288728b0e6c770acd8005bf2ca5d0
ssh swarm-manager-2 docker service ps swarm-m08-web --no-trunc
ssh swarm-manager-2 docker service inspect swarm-m08-web --format '{{.Spec.TaskTemplate.ContainerSpec.Image}}'8. Лабораторная работа: immutable update
Обновите spec на digest v2 и дождитесь convergence. История tasks должна связать старый и новый digest без зависимости от значения tag.
ssh swarm-manager-2 docker service update --detach=false --image 10.77.0.11:5000/swarm-m08/web@sha256:610682351bdcbeca24ec8de18b705505ec4baafbd401b39438c9e6b3b1d76256 swarm-m08-web
ssh swarm-manager-2 docker service inspect swarm-m08-web --format '{{.Spec.TaskTemplate.ContainerSpec.Image}}'
ssh swarm-manager-2 docker service ps swarm-m08-web9. Диагностика image pull
Создайте отдельный service с отсутствующим tag. Ожидается Rejected с manifest not found; удалите его в cleanup. TLS unknown authority, timeout и denied означают другие уровни проблемы.
ssh swarm-manager-2 docker service create --detach=true --name swarm-m08-missing --replicas 1 10.77.0.11:5000/swarm-m08/web:missing
ssh swarm-manager-2 docker service ps swarm-m08-missing --no-truncssh swarm-manager-2 docker service ps swarm-m08-web --no-trunc
ssh swarm-manager-1 docker pull 10.77.0.11:5000/swarm-m08/web:v2
ssh swarm-manager-1 journalctl -u docker --since today- x509 — неверная CA, SAN или срок
- connection refused — registry недоступен
- denied — ошибка auth/authorization
- not found — repository, tag или digest отсутствует
10. Контроль, критерии освоения и cleanup
- Почему tag считается mutable?
- Что идентифицирует digest?
- Когда manager не может закрепить tag?
- Почему registry нужен каждому node?
- Чем not found отличается от x509?
- Что требуется production registry сверх этой лаборатории?
Модуль освоен, если вы публикуете разные manifests, развёртываете и обновляете по digest и точно классифицируете pull failure.
Удалите сервисы. Инструктор также удаляет временный registry, данные, CA, ключ и локальные учебные образы.
ssh swarm-manager-2 docker service rm swarm-m08-web swarm-m08-missing
ssh swarm-manager-2 docker service ls
ssh swarm-manager-2 docker node ls