title | permalink |
---|---|
Синхронизация в werf |
usage/build/synchronization.html |
Синхронизация — это группа сервисных компонентов werf, предназначенных для координации нескольких процессов werf при выборке и сохранении стадий в хранилище, а также при публикации образов в репозиторий образов. Существует 2 таких компонента для синхронизации:
- Кеш хранилища — это внутренний служебный кеш werf, который существенно повышает производительность фазы расчёта стадий в случае, если эти стадии уже есть в хранилище. Кеш хранилища содержит соответствие существующих в хранилище с дайджестом (или другими словами: содержит предварительно рассчитанный шаг алгоритма выборки стадий по дайджесту). Данный кеш является когерентным и werf автоматически сбрасывает его, если будет замечена несостыковка между хранилищем стадий и кешом хранилища.
- Менеджер блокировок. Блокировки требуются для корректной публикации новых стадий в хранилище, публикации новых образов в репозиторий образов и для организации параллельных процессов выката в Kubernetes (блокируется имя релиза).
Все команды, использующие параметры хранилища (--repo=...
) также требуют указания адреса менеджера блокировок, который задается опцией --synchronization=...
или переменной окружения WERF_SYNCHRONIZATION=...
.
Существует 2 типа наборов компонентов для синхронизации:
- Локальный. Включается опцией
--synchronization=:local
.
- Локальный кеш хранилища располагается по умолчанию в файлах
~/.werf/shared_context/storage/stages_storage_cache/1/PROJECT_NAME/DIGEST
, каждый из которых хранит соответствие существующих в хранилище по некоторому дайджесту. - Локальный менеджер блокировок использует файловые блокировки, предоставляемые операционной системой.
- Kubernetes. Включается опцией
--synchronization=kubernetes://NAMESPACE[:CONTEXT][@(base64:CONFIG_DATA)|CONFIG_PATH]
.
- Кеш хранилища в Kubernetes использует для каждого проекта отдельный ConfigMap
cm/PROJECT_NAME
, который создается в указанномNAMESPACE
. - Менеджер блокировок в Kubernetes использует ConfigMap по имени проекта
cm/PROJECT_NAME
(тот же самый что и для кеша хранилища) для хранения распределённых блокировок в аннотациях этого ConfigMap. werf использует библиотека lockgate, которая реализует распределённые блокировки с помощью обновления аннотаций в ресурсах Kubernetes.
- Http. Включается опцией
--synchronization=http[s]://DOMAIN
.
- Есть публичный сервер синхронизации доступный по домену
https://synchronization.werf.io
. - Собственный http сервер синхронизации может быть запущен командой
werf synchronization
.
werf использует --synchronization=:local
(локальный кеш хранилища и локальный менеджер блокировок) по умолчанию, если используется локальное хранилище.
werf использует --synchronization=https://synchronization.werf.io
по умолчанию, если используется удалённое хранилище (--repo=CONTAINER_REGISTRY_REPO
).
Пользователь может принудительно указать произвольный адрес компонентов для синхронизации, если это необходимо, с помощью явного указания опции --synchronization=:local|(kubernetes://NAMESPACE[:CONTEXT][@(base64:CONFIG_DATA)|CONFIG_PATH])|(http[s]://DOMAIN)
.
ЗАМЕЧАНИЕ: Множество процессов werf, работающих с одним и тем же проектом обязаны использовать одинаковое хранилище и адрес набора компонентов синхронизации.