В кластерах, полностью управляемых Deckhouse Platform (DP), вы можете настраивать пути загрузки:
- образов контейнеров компонентов DP;
- образов контейнеров из дополнительных хранилищ (вендоров или ваших собственных).
Управление путями загрузки образов контейнеров реализуется с помощью модуля registry.
Реализации управления путями загрузки образов контейнеров
В DP поддерживаются две реализации модуля registry для управления путями загрузки образов контейнеров:
- Текущая реализация. Используется, начиная с версии DP 1.78. Управление путями загрузки образов контейнеров настраивается через ModuleConfig
registry. Реализация описана в разделе «Текущая реализация». - Предыдущая реализация. Хранилище образов компонентов DP настраивается через ModuleConfig
deckhouse. Реализация описана в разделе «Предыдущая реализация».
В будущих релизах DP планируется отказ от предыдущей реализации модуля.
Обе реализации никогда не управляют кластером одновременно: в определенный момент времени активна только одна из них. Кластер, в котором предыдущая реализация никогда не работала, сразу использует текущую. Кластер, в котором работает предыдущая реализация, продолжает использовать её до тех пор, пока не будут выполнены условия перехода на текущую — тогда управление автоматически передаётся текущей реализации, без отдельной команды. Условия перехода и пошаговые инструкции для каждого режима предыдущей реализации приведены в разделе «Миграция с предыдущей реализации на текущую» ниже.
В будущих релизах DP планируется отказ от предыдущей реализации модуля. Рекомендуется заранее перейти на текущую реализацию. Переход возможен, начиная с релиза 1.78.
Заранее подготовьте кластер к переходу на текущую реализацию. После удаления предыдущей реализации обновление DP будет блокироваться, пока кластер работает в режиме Proxy или Local предыдущей реализации, либо в режиме Direct без настроенного ModuleConfig registry.
Узнать, какая реализация модуля используется в кластере, можно по наличию секрета registry-v2-switch. Для этого воспользуйтесь инструкцией.
Текущая реализация
В текущей реализации управление путями загрузки образов контейнеров настраивается через ModuleConfig registry.
Режимы работы
В текущей реализации в DP поддерживаются следующие режимы управления путями загрузки образов контейнеров (режим задаётся параметром mode в ModuleConfig registry):
Unmanaged(режим по умолчанию). Модульregistryне управляет путями загрузки образов компонентов DP: кластер загружает образы из того хранилища, с которым был установлен (хранилище указывается при бутстрапе кластера в параметреdeckhouseв InitConfiguration).-
Managed. В этом режиме модульregistryуправляет путями загрузки образов контейнеров. При работе в этом режиме используются следующие независящие друг от друга настройки:primary.upstream— хранилище образов контейнеров, откуда загружаются образы компонентов DP. Если параметр не задан, кластер считается изолированным (air-gapped). В изолированном кластере единственным источником образов контейнеров становится внутрикластерный кеш, который наполняется командойd8 mirror push.storage.cache— управление внутрикластерным кешем на master-узлах. Если параметр включён, на master-узлах разворачивается хранилище образов контейнеров, и все узлы получают образы из него, а upstream-хранилище остаётся резервным путём, пока кеш наполняется.
Параметры primary.upstream и storage.cache вместе покрывают все поддерживаемые конфигурации:
primary.upstream |
storage.cache |
Что делает кластер |
|---|---|---|
| Задан | false |
Узлы загружают образы напрямую из upstream-хранилища. На master-узлах ничего не разворачивается |
| Задан | true |
Кеш работает на проход: наполняется из upstream-хранилища по запросу и заранее |
| Не задан | true |
Кластер изолирован (air-gapped). Кеш — единственный источник. Для наполнения используется команда d8 mirror push |
| Не задан | false |
Конфигурация отвергается: узлам было бы неоткуда загружать образы |
В любой момент можно перенастроить включение и выключение кеша, смену хранилища образов и смену учётных данных. Однако при удалении upstream-хранилища для перехода в изолированное состояние модуль ожидает, пока во внутрикластерном кеше появится весь ожидаемый набор образов — только после этого прекращается использование upstream-хранилища. Если бы использование upstream-хранилища прекратилось до того момента, пока во внутрикластерном кеше появился весь ожидаемый набор образов, узлы могли бы остаться без источника образов на время наполнения кеша.
Подробнее об архитектуре текущей реализации (об агенте на узле, внутрикластерном кеше, выборе главной реплики, работе изолированных кластеров) — в документации модуля registry.
Сборка мусора
Реплики хранилища по расписанию выполняют сборку мусора.
Сборка мусора включена по умолчанию и запускается раз в сутки в ночное время (в 03:17 МСК).
Если нужно отключить или настроить сборку мусора, используйте параметр storage.garbageCollection ModuleConfig registry.
Отключение сборки мусора имеет смысл только в случае, если для хранилища используется диск, размера которого хватит при неограниченном росте объёма хранилища.
Чтобы посмотреть состояние и расписание сборки мусора, используйте команды ниже.
-
Просмотр времени последней сборки мусора на каждой реплике и ошибки, если они были:
d8 k get registrystorage registry -o jsonpath='{.status.replicas}' | jq \ 'map({node, collectedAt, collectionError})' -
Просмотр текущего расписания сборки мусора:
d8 k get registrystorage registry -o jsonpath='{.spec.garbageCollection}' | jq
Сборка мусора — единственный механизм, выполняющий удаление данных из хранилища образов. Каждый релиз DP добавляет новые образы, поэтому без сборки мусора хранилище кластера, работающего продолжительное время, рано или поздно заполнится, и новые образы в него перестанут добавляться. При этом, например, изолированный кластер с заполненным хранилищем нельзя обновить.
Сборка мусора удаляет образы релизов, которые кластер уже прошёл. Сохраняются:
- развёрнутый релиз и предыдущий — чтобы откат не скачивал заново то, к чему откатывается;
- всё, что новее развёрнутого релиза, — это обновление в процессе или, в изолированном кластере, релиз, загруженный намеренно;
- все теги, которые не являются версиями: имена каналов обновлений вроде
stable, плавающие теги, всё загруженное вручную. Сборщик не может знать, что они означают, поэтому не удаляет их.
Сборка мусора выполняется с осторожностью. В изолированном кластере удаление ещё нужного блоба невосстановимо
без повторного выполнения команды d8 mirror push, а хранение ненужного стоит только места на диске. Поэтому
если сборщик мусора ничего не делает с объектом, если не может явно определить необходимость его удаления (например, когда не найден развёрнутый релиз).
Подробнее о работе сборщика мусора — в документации модуля registry.
Дополнительные хранилища образов контейнеров
primary.upstream — единственное хранилище образов, настраиваемое в самом ModuleConfig registry. Оно используется для получения образов компонентов DP. Если нужны дополнительные хранилища (от вендора, нужные какому-то модулю, или ваши собственные), используйте для их добавления кастомный ресурс RegistryUpstream.
Пример добавления дополнительного хранилища описан в разделе «Добавление дополнительного хранилища образов контейнеров».
Требования к использованию текущей реализации
Перед включением управления путями загрузки образов контейнеров с помощью текущей реализации модуля registry убедитесь, что кластер соответствует следующим требованиям:
- На узлах используется containerd или containerd v2 — задаётся параметром
defaultCRIв ClusterConfiguration. - Кластер полностью управляется DP. В Managed Kubernetes-кластерах текущая реализация модуля не работает — используйте переключение на стороннее хранилище.
Примеры настройки текущей реализации
Если в процессе переключения на текущую реализацию образ какого-либо модуля не загрузился заново и модуль не переустановился, для устранения проблемы воспользуйтесь инструкцией.
Настройка управления путями загрузки образов компонентов DP
Чтобы включить управление путями загрузки образов контейнеров компонентов DP с помощью модуля registry, включите модуль в режиме Managed и укажите данные хранилища образов в primary.upstream. Пример ModuleConfig registry:
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: registry
spec:
version: 1
enabled: true
settings:
mode: Managed
primary:
upstream:
host: registry.deckhouse.io
path: /deckhouse/ee
scheme: HTTPS
auth:
license: <LICENSE_KEY> # Замените на ваш лицензионный ключ.
Вы можете не создавать ModuleConfig с нуля, а использовать готовый. Модуль публикует готовый вариант конфигурации для вашего кластера — с адресом, путём, схемой, удостоверяющим центром и учётными данными того хранилища, из которого кластер уже загружает образы.
Чтобы получить готовую конфигурацию ModuleConfig, выполните команду:
d8 k -n d8-system get secret registry-suggested-config -o jsonpath='{.data.registry-mc\.yaml}' | base64 -d
Просмотрите его и примените — это исключает ошибки, которые легко допустить, переписывая эти значения вручную (обрезанный путь, неверный удостоверяющий центр и т. д.).
Чтобы посмотреть, как изменение вступает в силу, используйте команды ниже.
-
Просмотр состояния конфигурации хранилища образов в DP:
d8 k get registryconfig registry -o jsonpath='{.status}' | jq -
Проверка применения конфигурации хранилища образов на узлах, всё ли успешно согласовано и какие бэкенды сейчас активны:
d8 k get registrynodes -o custom-columns=\ NODE:.metadata.name,APPLIED:.status.observedGeneration,OK:.status.reconciled,BACKENDS:.status.activeBackends
Включение внутрикластерного кеша
Внутрикластерный кеш использует диски master-узлов и поддерживается только на статических кластерах.
Чтобы включить внутрикластерный кеш, добавьте в ModuleConfig registry настройку storage.cache и укажите размер хранилища:
spec:
settings:
mode: Managed
primary:
upstream:
host: registry.deckhouse.io
path: /deckhouse/ee
auth:
license: <LICENSE_KEY> # Замените на ваш лицензионный ключ.
storage:
cache: true
size: 50Gi
На узлах при этом ничто не перенастраивается: container runtime и так обращается за любым хранилищем к агенту, а агент начинает в первую очередь использовать кеш. Upstream-хранилище используется как резервный путь. Поэтому отсутствие данных в кеше с первой же минуты после включения кеша означает более медленную загрузку, а не неудачную.
Чтобы проверить наполнение внутрикластерного кеша, используйте команду:
d8 k get registrystorage registry -o jsonpath='{.status}' | jq '{phase,fill,leader,allReplicasFull}'
Выключение кеша — то же изменение в обратную сторону, и такое же безопасное. Блобы на диске остаются нетронутыми, и при повторном включении кеш пополнится уже накопленными данными. Если вы отключаете внутрикластерный кеш и не планируете его включение в дальнейшем, удалите оставшиеся данные кеша с узлов кластера. Подробная инструкция — в FAQ модуля registry.
Перевод кластера в изолированное состояние
У изолированного кластера нет upstream-хранилища (не указан в primary.upstream). Кеш для такого кластера — единственный источник образов. Для наполнения хранилища используется команда d8 mirror push. Чтобы можно было проверить наличие всех необходимых образов в кеше, опишите ожидаемый набор образов в параметре storage.source.
Для перевода кластера в изолированное состояние выполните следующие действия:
-
Скачайте образы на машину, у которой есть доступ в интернет:
d8 mirror pull --license <LICENSE_KEY> ./d8-bundle -
Загрузите их в кластер через эндпоинт публикации:
PUSH_SECRET=$(d8 k -n d8-system get secret registry-storage-push -o json) d8 mirror push ./d8-bundle registry.example.com/system/deckhouse \ --username "$(echo "$PUSH_SECRET" | jq -r .data.username | base64 -d)" \ --password "$(echo "$PUSH_SECRET" | jq -r .data.password | base64 -d)" -
Опишите ожидаемый набор образов в кеше и уберите
upstreamиз ModuleConfigregistry:spec: settings: mode: Managed storage: cache: true size: 50Gi source: bundleRef: d8-mirror-bundle expectedDigests: 459
Upstream-хранилище убирается с узлов не в момент правки конфигурации, а когда лидер кеша соберёт весь ожидаемый набор образов — иначе все узлы могли бы остаться без источника образов. Для проверки статуса перехода используйте команды:
Проверка, содержит ли лидер кеша весь ожидаемый набор образов.
d8 k get registrystorage registry -o jsonpath='{.status}' | jq '{safeToDropUpstream,fill}'
Проверка, изолирован ли кластер (пока заполнено значение effectiveUpstream, кластер им пользуется, если оно пустое — кластер изолирован):
d8 k get registryconfig registry -o jsonpath='{.status.effectiveUpstream}' | jq
Добавление дополнительного хранилища образов контейнеров
Запросы к дополнительным хранилищам всегда маршрутизируются через агент на узле (учётные данные и удостоверяющий центр хранятся в одном месте) и образы из них не кешируются.
Чтобы добавить дополнительное хранилище образов (не для системных компонентов DP), используйте ресурс RegistryUpstream. Пример:
apiVersion: deckhouse.io/v1alpha1
kind: RegistryUpstream
metadata:
name: virtualization-images
spec:
match: images.virtualization.example.com
upstream:
host: vendor.example.com
path: /virtualization
auth:
username: robot
password: <PASSWORD>
После создания ресурса проверьте, что он принят — конфликт с основным хранилищем или с другим ресурсом, претендующим на то же имя, отвергается, а не объединяется:
d8 k get registryupstreams -o custom-columns=\
NAME:.metadata.name,MATCH:.spec.match,ACCEPTED:.status.conditions[0].status,REASON:.status.conditions[0].reason
В примере выше после добавления дополнительного хранилища запросы на загрузку образов, поступающие на images.virtualization.example.com, маршрутизируются агентом на каждом узле в vendor.example.com/virtualization, а учётные данные и удостоверяющий центр держит кластер, а не каждая нагрузка по отдельности. На узлах для этого не перенастраивается ничего.
Загрузка из приватного хранилища образов контейнеров без его объявления
Чтобы загружать образы из неизвестного модулю хранилища, не требуется объявлять что-либо дополнительно. Агент на узле проксирует такие запросы без изменений, вместе с теми учётными данными, которые уже были в запросе. Поэтому обычный imagePullSecret работает так же, как в кластере, где модуль никогда не включался.
Для создания секрета с учётными данными приватного хранилища образов контейнеров выполните команду:
d8 k create secret docker-registry my-private-registry \
--docker-server=private.example.com \
--docker-username=robot \
--docker-password=<PASSWORD>
Для использования этого секрета при загрузке образов укажите его в imagePullSecrets пода:
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
imagePullSecrets:
- name: my-private-registry
containers:
- name: app
image: private.example.com/team/app:v1
Создавать для хранилища RegistryUpstream стоит только если нужно, чтобы учётные данные хранил кластер, а не каждая нагрузка по отдельности, либо если хранилищу нужен удостоверяющий центр, которого нет на узлах.
Выключение управления путями загрузки образов
Чтобы выключить управление путями загрузки образов, установите mode: Unmanaged в ModuleConfig registry:
spec:
settings:
mode: Unmanaged
После установкиmode: Unmanaged управление путями загрузки образов через модуль registry выключается. Кластер возвращается к загрузке образов из того хранилища образов контейнеров, которое записано в секрете deckhouse-registry, — то есть оттуда, откуда образы загружались до включения модуля. Данные кеша на master-узлах при этом намеренно сохраняются: при повторном включении управления путями загрузки кеш дополнится только недостающими образами из хранилища образов контейнеров, а не начнёт наполняться заново. Если кеш больше не понадобится, освободите занимаемое им место по инструкции из документации модуля registry.
Предыдущая реализация
Описанная ниже предыдущая реализация модуля registry постепенно выводится из эксплуатации. Для новых кластеров и при первой возможности для существующих используйте текущую реализацию.
В предыдущей реализации DP поддерживается несколько режимов управления настройками хранилища образов компонентов платформы: Unmanaged, Direct, Proxy и Local. В режимах Direct, Proxy и Local для обращения к хранилищу образов компонентов DP используется фиксированный виртуальный адрес. Это позволяет избежать перезапуска всех компонентов control plane и повторного скачивания образов в случае каких-либо изменений в хранилище образов компонентов платформы.
В режиме Unmanaged не используется виртуальный адрес. Обращение выполняется напрямую к внешнему хранилищу: в случае изменения хранилища происходит перезапуск всех компонентов DP.
Переключение между режимами и хранилищами образов выполняется через ModuleConfig deckhouse. Переключение выполняется автоматически (подробнее — в примерах переключения ниже).
Архитектура режимов предыдущей реализации описана в разделе «Модуль registry».
Особенности режимов управления настройками хранилища образов компонентов DP:
Direct— использование прямого доступа к внешнему хранилищу по фиксированному виртуальному адресуregistry.d8-system.svc:5001/system/deckhouse. Фиксированный адрес позволяет избежать повторного скачивания образов и перезапуска компонентов при изменении параметров хранилища.Proxy— использование внутреннего кеширующего прокси-хранилища с обращением к внешнему хранилищу. Кеширующее прокси-хранилище запускается на control-plane (master) узлах. Режим позволяет сократить количество запросов к внешнему хранилищу за счёт кеширования образов. Обращение к внутреннему хранилищу образов выполняется по фиксированному виртуальному адресуregistry.d8-system.svc:5001/system/deckhouseаналогично режимуDirect.Local— использование локального внутреннего хранилища образов, с запуском хранилища на control-plane (master) узлах. Режим позволяет кластеру работать в изолированной среде. Обращение к внутреннему хранилищу образов выполняется по фиксированному виртуальному адресуregistry.d8-system.svc:5001/system/deckhouseаналогичноDirectиProxyрежимам.Unmanaged(конфигурируемый режим) — работа без использования внутреннего хранилища образов. Виртуальный адрес не используется. Обращение выполняется напрямую к внешнему хранилищу.
В этом документе упоминаются конфигурируемый режим Unmanaged (предыдущей реализации модуля registry) и неконфигурируемый режим Unmanaged (полностью устаревший формат, без модуля registry).
Неконфигурируемый режим Unmanaged не использует модуль registry вообще (например, в Managed Kubernetes-кластерах). Параметры конфигурации хранилища образов компонентов DP задаются при установке кластера, или при изменении в развёрнутом кластере с помощью утилиты helper change registry (deprecated).
Ограничения по настройкам хранилища образов компонентов DP
Существует ряд ограничений и особенностей, связанных с установкой кластера, условиями использования предыдущей реализации и переключением между её режимами.
Ограничения при установке кластера
Ограничения по настройке хранилища образов компонентов DP при установке кластера следующие:
- Бутстрап кластера DP поддерживается в режимах
Direct,Unmanaged,ProxyиLocal. Параметры доступа к хранилищу образов компонентов DP во время установки кластера настраивается через ModuleConfigdeckhouse. - Бутстрап кластера в режимах
LocalиProxyподдерживаются только на статичных кластерах. - Для запуска кластера в неконфигурируемом
Unmanagedрежиме (Legacy, без использования модуляregistry) необходимо указать параметры хранилища образов в InitConfiguration.
Ограничения по условиям работы
Для управления настройками хранилища образов компонентов DP в предыдущей реализации необходимо соблюдение следующих условий:
- Использование CRI containerd или containerd v2 на узлах кластера. Для настройки CRI ознакомьтесь с конфигурацией ClusterConfiguration.
- Кластер полностью управляется DP. В кластерах Managed Kubernetes настройка хранилища образов компонентов DP с помощью модуля
registryнедоступна. РежимыLocalиProxyподдерживаются только в статичных кластерах.
Ограничения по переключению режимов
Ограничения по переключению режимов следующие:
- Изменение параметров хранилища образов компонентов DP и переключение режимов доступны только после полного завершения этапа бутстрапа.
- При первом переключении необходимо выполнить миграцию пользовательских конфигураций хранилища. Подробнее — в разделе «Модуль registry: FAQ».
- Переключение в неконфигурируемый режим
Unmanaged(без использования модуляregistry) доступно только из конфигурируемогоUnmanagedрежима. Подробнее — в разделе «Модуль registry: FAQ». - Прямое переключение между режимами
LocalиProxyвозможно только через промежуточные режимыDirectилиUnmanaged. Пример последовательности переключения:Local/Proxy→Direct→Proxy/Local. Также не поддерживается прямое переключение с режимаLocalна неконфигурируемыйUnmanaged(без использования модуляregistry): при необходимости выполняйте переключение через промежуточный режимDirectилиUnmanaged.
Примеры переключения режимов предыдущей реализации
Если в процессе переключения образ какого-либо модуля не загрузился заново и модуль не переустановился, для устранения проблемы воспользуйтесь инструкцией.
Переключение на режим Direct
Для переключения уже работающего кластера на режим Direct выполните следующие шаги:
При первом переключении с режима Unmanaged на режим Direct произойдёт полный перезапуск всех компонентов DP.
-
Если в кластере используется неконфигурируемый
Unmanagedуправления настройками хранилища образов компонентов DP (без модуляregistry), перед переключением выполните миграцию на формат управления настройками хранилища образов с использованием модуляregistry. -
Убедитесь, что модуль
registryвключён и работает. Для этого выполните следующую команду:d8 k get module registry -o wideПример вывода:
NAME WEIGHT ... PHASE ENABLED DISABLED MESSAGE READY registry 38 ... Ready True True -
Убедитесь, что все master-узлы находятся в состоянии
Readyи не имеют статусаSchedulingDisabled. Для этого используйте следующую команду:d8 k get nodesПример вывода:
NAME STATUS ROLES ... master-0 Ready control-plane,master ... master-1 Ready control-plane,master ... master-2 Ready control-plane,master ...Пример вывода, когда master-узел (
master-2в примере) находится в статусеSchedulingDisabled:NAME STATUS ROLES ... master-0 Ready control-plane,master ... master-1 Ready control-plane,master ... master-2 Ready,SchedulingDisabled control-plane,master ... -
Проверьте, чтобы очередь DP была пустой и без ошибок:
d8 system queue listПример вывода:
Summary: - 'main' queue: empty. - 107 other queues (0 active, 107 empty): 0 tasks. - no tasks to handle. -
Установите настройки режима
Directв ModuleConfigdeckhouse. Если используется хранилище образов, отличное отregistry.deckhouse.ru, ознакомьтесь с конфигурацией модуляdeckhouseдля корректной настройки.Пример конфигурации:
apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: deckhouse spec: version: 1 enabled: true settings: registry: mode: Direct direct: imagesRepo: registry.deckhouse.ru/deckhouse/ee scheme: HTTPS license: <LICENSE_KEY> # Замените на ваш лицензионный ключ. -
Проверьте статус переключения хранилища образов в секрете
registry-state, используя инструкцию.Пример вывода:
conditions: # ... - lastTransitionTime: "..." message: "" reason: "" status: "True" type: Ready hash: .. mode: Direct target_mode: Direct -
Если необходимо отключить автоматическое обновление DP до новых версий, загружая их из настроенного хранилища образов, удалите параметр
releaseChannelиз конфигурации модуляdeckhouse. После этого автоматическое обновление платформы будет отключено, и управлять версией DP потребуется вручную.
Переключение на режим Proxy
- При первом переключении с режима
Unmanagedна режимProxyпроизойдёт полный перезапуск всех компонентов DP. - Переключение из режима
LocalвProxyнедоступно. Для переключения из режимаLocalнеобходимо переключить хранилище образов на другой доступный режим (например,Direct).
Для переключения уже работающего кластера на режим Proxy выполните следующие шаги:
-
Если в кластере используется неконфигурируемый
Unmanagedрежим управления настройками хранилища образов компонентов DP (без модуляregistry), перед переключением выполните миграцию на формат управления настройками хранилища образов с использованием модуляregistry. -
Убедитесь, что модуль
registryвключён и работает. Для этого выполните следующую команду:d8 k get module registry -o wideПример вывода:
NAME WEIGHT ... PHASE ENABLED DISABLED MESSAGE READY registry 38 ... Ready True True -
Убедитесь, что все master-узлы находятся в состоянии
Readyи не имеют статусаSchedulingDisabled, используя следующую команду:d8 k get nodesПример вывода:
NAME STATUS ROLES ... master-0 Ready control-plane,master ... master-1 Ready control-plane,master ... master-2 Ready control-plane,master ...Пример вывода, когда master-узел (
master-2в примере) находится в статусеSchedulingDisabled:NAME STATUS ROLES ... master-0 Ready control-plane,master ... master-1 Ready control-plane,master ... master-2 Ready,SchedulingDisabled control-plane,master ... -
Проверьте, чтобы очередь DP была пустой и без ошибок:
d8 system queue listПример вывода:
Summary: - 'main' queue: empty. - 107 other queues (0 active, 107 empty): 0 tasks. - no tasks to handle. -
Установите настройки режима
Proxyв ModuleConfigdeckhouse. Если используется хранилище образов контейнеров, отличное отregistry.deckhouse.ru, ознакомьтесь с конфигурацией модуляdeckhouseдля корректной настройки.Пример конфигурации:
apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: deckhouse spec: version: 1 enabled: true settings: registry: mode: Proxy proxy: imagesRepo: registry.deckhouse.ru/deckhouse/ee scheme: HTTPS license: <LICENSE_KEY> # Замените на ваш лицензионный ключ. -
Проверьте статус переключения хранилища образов в секрете
registry-state, используя инструкцию.Пример вывода:
conditions: # ... - lastTransitionTime: "..." message: "" reason: "" status: "True" type: Ready hash: .. mode: Proxy target_mode: Proxy -
Если необходимо отключить автоматическое обновление DP до новых версий, загружая их из настроенного хранилища образов, удалите параметр
releaseChannelиз конфигурации модуляdeckhouse. После этого автоматическое обновление платформы будет отключено, и управлять версией DP потребуется вручную.
Переключение на режим Local
- При первом переключении с режима
Unmanagedна режимLocalпроизойдёт полный перезапуск всех компонентов DP. - Переключение из режима
ProxyвLocalнедоступно. Для переключения из режимаProxyнеобходимо переключить хранилище образов на другой доступный режим (например,Direct).
Для переключения уже работающего кластера на режим Local выполните следующие шаги:
-
Если в кластере используется неконфигурируемый
Unmanagedрежим управления настройками хранилища образов компонентов DP (без модуляregistry), перед переключением выполните миграцию на формат управления настройками хранилища образов с использованием модуляregistry. -
Убедитесь, что модуль
registryвключён и работает. Для этого выполните следующую команду:d8 k get module registry -o wideПример вывода:
NAME WEIGHT ... PHASE ENABLED DISABLED MESSAGE READY registry 38 ... Ready True True -
Убедитесь, что все master-узлы находятся в состоянии
Readyи не имеют статусаSchedulingDisabled, используя следующую команду:d8 k get nodesПример вывода:
NAME STATUS ROLES ... master-0 Ready control-plane,master ... master-1 Ready control-plane,master ... master-2 Ready control-plane,master ...Пример вывода, когда master-узел (
master-2в примере) находится в статусеSchedulingDisabled:NAME STATUS ROLES ... master-0 Ready control-plane,master ... master-1 Ready control-plane,master ... master-2 Ready,SchedulingDisabled control-plane,master ... -
Проверьте, чтобы очередь DP была пустой и без ошибок:
d8 system queue listПример вывода:
Summary: - 'main' queue: empty. - 107 other queues (0 active, 107 empty): 0 tasks. - no tasks to handle. -
Подготовьте архивы с образами DP текущей версии. Для этого воспользуйтесь командой
d8 mirror.Пример:
TAG=$( d8 k -n d8-system get deployment/deckhouse -o yaml \ | yq -r '.spec.template.spec.containers[] | select(.name == "deckhouse").image | split(":")[-1]' ) && echo "TAG: $TAG" EDITION=$( d8 k -n d8-system exec -it svc/deckhouse-leader -- deckhouse-controller global values -o yaml \ | yq .deckhouseEdition ) && echo "EDITION: $EDITION"d8 mirror pull \ --license="<LICENSE_KEY>" \ --source="registry.deckhouse.ru/deckhouse/$EDITION" \ --deckhouse-tag="$TAG" \ /home/user/d8-bundle -
Установите настройки режима
Localв ModuleConfigdeckhouse.Пример конфигурации:
apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: deckhouse spec: version: 1 enabled: true settings: registry: mode: Local -
Проверьте статус переключения хранилища образов в секрете
registry-state, используя инструкцию. В статусе необходимо дождаться появления проверкиRegistryContainsRequiredImages. Условие отобразит отсутствие или наличие образов в запущенном локальном хранилище образов.Пример вывода:
conditions: # ... - lastTransitionTime: "..." message: |- Mode: Default master-1: 0 of 166 items processed, 166 items with errors: - source: module/control-plane-manager/control-plane-manager133 image: 10.128.0.5:5001/system/deckhouse@sha256:00202db19b40930f764edab5695f450cf709d50736e012055393447b3379414a error: HEAD https://10.128.0.5:5001/v2/system/deckhouse/manifests/sha256:00202db19b40930f764edab5695f450cf709d50736e012055393447b3379414a: unexpected status code 404 Not Found (HEAD responses have no body, use GET for details) - source: module/cloud-provider-yandex/cloud-metrics-exporter image: 10.128.0.5:5001/system/deckhouse@sha256:05517a86fcf0ec4a62d14ed7dc4f9ffd91c05716b8b0e28263da59edf11f0fad error: HEAD https://10.128.0.5:5001/v2/system/deckhouse/manifests/sha256:05517a86fcf0ec4a62d14ed7dc4f9ffd91c05716b8b0ed86d6a1f465f4556fb8: unexpected status code 404 Not Found (HEAD responses have no body, use GET for details) - source: module/control-plane-manager/kube-controller-manager132 image: 10.128.0.5:5001/system/deckhouse@sha256:13f24cc717698682267ed2b428e7399b145a4d8ffe96ad1b7a0b3269b17c7e61 error: HEAD https://10.128.0.5:5001/v2/system/deckhouse/manifests/sha256:13f24cc717698682267ed2b428e7399b145a4d8ffe96ad1b7a0b3269b17c7e61: unexpected status code 404 Not Found (HEAD responses have no body, use GET for details) ...and more reason: Processing status: "False" type: RegistryContainsRequiredImages -
Загрузите образы в локальное хранилище образов с помощью команды
d8 mirror. Образы загружаются в локальное хранилище через Ingress по адресуregistry.${PUBLIC_DOMAIN}.Получите пароль read-write пользователя локального хранилища образов:
d8 k -n d8-system get secret/registry-user-rw -o json | jq -r '.data | to_entries[] | "\(.key): \(.value | @base64d)"' name: rw password: KFVxXZGuqKkkumPz passwordHash: $2a$10$Phjbr6iinLf00ZZDD2Y7O.p9H3nDOgYzFmpYKW5eydGvIsdaHQY0aЗагрузите образы в локальное хранилище образов:
d8 mirror push \ --registry-login="rw" \ --registry-password="KFVxXZGuqKkkumPz" \ /home/user/d8-bundle \ registry.${PUBLIC_DOMAIN}/system/deckhouse -
Проверьте статус переключения хранилища образов в секрете
registry-state, используя инструкцию. После загрузки образов статусRegistryContainsRequiredImagesдолжен быть в состоянииReadyПример вывода:
conditions: # ... - lastTransitionTime: "..." message: |- Mode: Default master-1: all 166 items are checked reason: Ready status: "True" type: RegistryContainsRequiredImages hash: .. mode: Direct target_mode: Local -
Дождитесь завершения переключения. Для проверки статуса переключения воспользуйтесь инструкцией.
Пример вывода:
conditions: # ... - lastTransitionTime: "..." message: "" reason: "" status: "True" type: Ready hash: .. mode: Local target_mode: Local
Переключение на режим Unmanaged
Для переключения уже работающего кластера на режим Unmanaged выполните следующие шаги:
Изменение хранилища образов в Unmanaged режиме приведёт к перезапуску всех компонентов DP.
-
Если в кластере используется неконфигурируемый
Unmanagedрежим управления хранилищем образов компонентов DP (без модуляregistry), перед переключением выполните миграцию на формат управления хранилищем образов с использованием модуляregistry. -
Убедитесь, что модуль
registryвключён и работает. Для этого выполните следующую команду:d8 k get module registry -o wideПример вывода:
NAME WEIGHT ... PHASE ENABLED DISABLED MESSAGE READY registry 38 ... Ready True True -
Проверьте, чтобы очередь DP была пустой и без ошибок:
d8 system queue listПример вывода:
Summary: - 'main' queue: empty. - 107 other queues (0 active, 107 empty): 0 tasks. - no tasks to handle. -
Установите настройки режима
Unmanagedв ModuleConfigdeckhouse. Если используется хранилище образов, отличное отregistry.deckhouse.ru, ознакомьтесь с конфигурацией модуляdeckhouseдля корректной настройки.Пример конфигурации:
apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: deckhouse spec: version: 1 enabled: true settings: registry: mode: Unmanaged unmanaged: imagesRepo: registry.deckhouse.ru/deckhouse/ee scheme: HTTPS license: <LICENSE_KEY> # Замените на ваш лицензионный ключ. -
Проверьте статус переключения хранилища образов в секрете
registry-state, используя инструкцию.Пример вывода:
conditions: # ... - lastTransitionTime: "..." message: "" reason: "" status: "True" type: Ready hash: .. mode: Unmanaged target_mode: Unmanaged -
Если необходимо отключить автоматическое обновление DP до новых версий, загружая их из настроенного хранилища образов, удалите параметр
releaseChannelиз конфигурации модуляdeckhouse. После этого автоматическое обновление платформы будет отключено, и управлять версией DP потребуется вручную.
При необходимости переключения на старый метод управления хранилищем образов (без модуля registry), ознакомьтесь с инструкцией.
Управление хранилищем образов компонентов DP без модуля registry — устаревший (deprecated) формат.
Миграция с предыдущей реализации на текущую
Ниже описан переход с предыдущей реализации модуля registry на текущую. Если ваш кластер вообще не использует модуль registry (полностью устаревший формат), сначала обратитесь к разделу «Миграция на формат управления настройками хранилища образов с использованием модуля registry».
Миграция — это передача пути загрузки текущей реализации от предыдущей.
Её не нужно запускать вручную, и отдельной команды для неё нет: модуль registry принимает управление автоматически после обновления кластера на релиз, в котором появилась текущая реализация. Единственное условие — к этому моменту предыдущая реализация должна освободить путь загрузки. Обе реализации настраивают на каждом узле одно и то же — из какого хранилища образов контейнеров container runtime загружает образы и с какими учётными данными, — поэтому они никогда не управляют кластером одновременно.
Определение способа и шагов миграции
Что нужно сделать для передачи текущей реализации модуля registry управления путями загрузки образов и когда — зависит от режима, в котором работает предыдущая реализация. Режим указан в параметре settings.registry.mode ModuleConfig deckhouse. Чтобы посмотреть режим, используйте команду:
d8 k get mc deckhouse -o jsonpath='{.spec.settings.registry.mode}'
Пустой вывод означает режим Unmanaged: настройки хранилища образов в этом кластере никогда не задавали. В таком кластере для миграции ничего предварительно делать не нужно — передача управления произойдёт автоматически.
Действия, необходимые для миграции с предыдущей реализации на текущую, описаны в таблице:
| Режим предыдущей реализации | Что сделать | Когда |
|---|---|---|
Unmanaged |
Ничего — передача произойдёт сама | — |
Direct |
Настроить ModuleConfig registry: задать mode: Managed и primary.upstream |
До обновления на релиз DP с текущей реализацией |
Proxy |
Перевести кластер в Unmanaged |
До обновления на релиз DP с текущей реализацией |
Local |
Выполнить отдельную процедуру для изолированных кластеров | До обновления на релиз DP с текущей реализацией |
В будущих релизах DP планируется отказ от предыдущей реализации модуля. Рекомендуется заранее перейти на текущую реализацию. Переход возможен, начиная с релиза 1.78.
Заранее подготовьте кластер к переходу на текущую реализацию. После удаления предыдущей реализации обновление DP будет блокироваться, пока кластер работает в режиме Proxy или Local предыдущей реализации, либо в режиме Direct без настроенного ModuleConfig registry.
При использовании предыдущей реализации в режиме Direct переключение режима не требуется. Настройки ModuleConfig registry намеренно принимаются на релиз раньше: записанные до обновления, они хранятся без эффекта и срабатывают на первой итерации согласования модуля после обновления.
Проверка реализации, используемой в кластере
Когда модуль registry принимает на себя управление путями загрузки, он записывает это в секрет registry-v2-switch. Проверьте, существует ли секрет:
d8 k -n d8-system get secret registry-v2-switch >/dev/null 2>&1 \
&& echo "текущая реализация" || echo "предыдущая реализация"
Если кластер всё ещё на предыдущей реализации, модуль сообщает причину на каждой итерации согласования и в кластере срабатывает алерт D8RegistryMigrationPending. Чтобы посмотреть, какие действия требуются, используйте команду:
d8 k -n d8-system get secret registry-state -o jsonpath='{.data.state}' | base64 -d | head
Миграция из режима Unmanaged
В режиме Unmanaged предыдущая реализация не управляет путём загрузки, поэтому предварительная подготовка к переключению на текущую реализацию не требуется — передача управления произойдёт автоматически.
Порядок миграции на новую реализацию в таком случае следующий:
-
Если кластер в предыдущей реализации переводится в
Unmanagedиз другого режима, дождитесь завершения перехода. В статусе должно бытьmode: Unmanagedбез ожидающего целевого режима.Для проверки используйте команду:
d8 k -n d8-system get secret registry-state -o jsonpath='{.data.state}' | base64 -d | head -
Обновите кластер на релиз с текущей реализацией модуля (или, если он уже обновлён, дождитесь следующей итерации согласования). Модуль примет управление путями загрузки образов автоматически, и поведение не изменится. Режим по умолчанию для модуля
registryв текущей реализации — тожеUnmanaged, поэтому кластер продолжит загружать образы из того же хранилища, что и раньше. -
Чтобы модуль начал управлять путями загрузки, задайте
mode: Managedв ModuleConfigregistryи укажите хранилище, из которого загружать образы. Готовая конфигурация для вашего кластера публикуется в секретеregistry-suggested-config. Пример конфигурации — в разделе «Настройка управления путями загрузки образов компонентов DP».
Миграция из режима Direct
В режиме Direct в предыдущей реализации узлы загружают образы через внутрикластерный адрес, который обслуживает прокси предыдущей реализации. Текущая реализация обслуживает тот же адрес, поэтому миграция — это прямая передача адреса: переход через Unmanaged не нужен, и компоненты не перезапускаются.
Порядок миграции на новую реализацию в таком случае следующий:
- Настройте ModuleConfig
registryдо обновления — без этой конфигурации обновление заблокировано. Для заполнения ModuleConfigregistryвозьмите значения из секцииregistry.directModuleConfigdeckhouse:- значение
imagesRepoиз ModuleConfigdeckhouseразделите наhostиpathи укажите их в соответствующих полях ModuleConfigregistry: - используйте учётные данные, указанные в ModuleConfig
deckhouse: тот жеlicense(илиusername/password) иca, если хранилище того требует
Пример ModuleConfig
registryдля переключения:apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: registry spec: enabled: true version: 1 settings: mode: Managed primary: upstream: scheme: HTTPS host: registry.deckhouse.io path: /deckhouse/ee auth: license: <LICENSE_KEY> # Замените на ваш лицензионный ключ.Предыдущая реализация сохраняет эти настройки, но не действует по ним, поэтому до обновления в кластере ничего не меняется.
- значение
-
Обновите кластер до релиза, в котором поддерживается текущая реализация. Передача управления путями загрузки образов контейнеров произойдёт на следующей итерации согласования, и загрузка образов всё это время будет работать: Service и прокси предыдущей реализации продолжают обслуживать внутрикластерный адрес, пока агент текущей реализации не примет его на каждом узле, и только после этого удаляются.
-
Следите за ходом передачи с помощью команд ниже.
-
Проверка передачи управления путями текущей реализации:
d8 k -n d8-system get secret registry-v2-switch >/dev/null 2>&1 && echo "управление передано" -
Проверка состояния узлов хранилища образов:
d8 k get registrynode -o custom-columns='NODE:.metadata.name,READY:.status.reconciled,SERVING:.status.proxyListening'
Передача фиксируется через несколько минут после старта новой версии, агент появляется на узлах ещё через несколько минут, а объекты предыдущей реализации удаляются вскоре после этого. Загрузка образов продолжает работать на каждом из этих этапов.
-
Миграция из режима Proxy
При использовании предыдущей реализации в режиме Proxy на каждом узле разворачивается собственный прокси со своими сертификатами. Это состояние текущая реализация перенять не может. Поэтому кластер сначала нужно перевести в Unmanaged, и сделать это можно только до обновления.
Порядок миграции на новую реализацию в таком случае следующий:
-
В ModuleConfig
deckhouseзадайтеregistry.mode: Unmanaged, сохранив тот же адрес хранилища и учётные данные (пример ModuleConfigdeckhouse— в разделе «Переключение на режим Unmanaged»). Все узлы будут перенастроены на загрузку напрямую из внешнего хранилища, поэтому кеширование, которое работало в режимеProxy, пропадёт до последнего шага. -
Дождитесь завершения перехода —
mode: Unmanagedбез ожидающего целевого режима. Кластер, застигнутый посреди перехода, мигрировать нельзя; в статусе видно, в какой режим он ещё переключается:d8 k -n d8-system get secret registry-state -o jsonpath='{.data.state}' | base64 -d | head -
Обновите кластер до релиза с поддержкой текущей реализации. Передача произойдёт на следующей итерации согласования и не изменит поведения: в режиме
Unmanagedтекущая реализация тоже не управляет путём загрузки. -
Чтобы вернуть кеширование внутри кластера, задайте
mode: Managedсоstorage.cache: trueи тем же внешним хранилищем. Учтите, что кеш текущей реализации устроен иначе, чем в режимеProxyпредыдущей реализации: одно хранилище с репликами на master-узлах вместо прокси на каждом узле. Прежде чем включать его на кластере, где на master-узлах мало свободного места, ознакомьтесь с тем, как кеш наполняется и очищается.
Миграция изолированного кластера из режима Local
В режиме Local в предыдущей реализации у кластера нет внешнего хранилища образов — его роль выполняет хранилище внутри самого кластера. Поэтому стандартная процедура миграции здесь не работает, так как она проходит через режим Unmanaged, в котором каждый узел загружает образы напрямую из внешнего хранилища, а такому кластеру загружать их неоткуда.
К кластеру необходимо подключить внешнее хранилище на время миграции. Оно запускается в том же кластере, но вне неймспейсов DP. Кластер переключается на него и обновляется, а когда хранилище текущей реализации наполнится образами, временное хранилище удаляется.
Перед началом убедитесь, что на master-узлах свободно место под четыре набора образов: на пике миграции одновременно существуют три копии набора — хранилище Local, временное хранилище и наполняющееся хранилище текущей реализации, — а место под четвёртый набор нужно как запас, который узел не должен исчерпать. Подробный расчёт места и процедура проверки описаны в разделе «Требования к диску» документации модуля registry.
Порядок действий при миграции:
-
Запустите временное внешнее хранилище в собственном неймспейсе, вне управления DP. Реализация хранилища образов контейнеров может быть любой, но оно должно отдавать TLS с сертификатом, который кластер сможет проверить, и DP не должна им управлять: что бы ни происходило с объектами модуля, временное хранилище образов контейнеров должно продолжать работать.
Кроме того, хранилище образов контейнеров должно быть доступно по одному и тому же адресу из двух мест: на шаге 3 из него загружают образы узлы, а на шаге 6 его читает syncer модуля
registry, работающий в поде. Сертификат должен покрывать выбранный адрес. Варианты, проверенные на одном кластере:Адрес С узла Из пода Порт hostNetworkна IP самого узла (<NODE_IP>:5000)Работает Работает Имя Service ( <SERVICE>.<NAMESPACE>.svc:<PORT>)Не разрешается Работает NodePort на IP узла Работает Не работает: operation not permittedИспользуйте первый вариант: запустите хранилище образов контейнеров с
hostNetwork: trueна одном узле, обращайтесь к нему по IP этого узла и добавьте этот IP в SAN сертификата — тогда вся миграция пройдёт на одном адресе. Имя Service выглядит аккуратнее, но перестаёт работать на шаге 3, потому что container runtime узла не разрешает имена через кластерный DNS. - Загрузите набор образов текущей версии во временное хранилище:
d8 mirror pullна машине с доступом в интернет, затемd8 mirror pushво временное хранилище. - В ModuleConfig
deckhouseзадайтеregistry.mode: Unmanagedс адресом, сертификатом CA и учётными данными временного хранилища. Данные хранилищаLocalпри этом остаются на месте, в каталоге/opt/deckhouse/registryна master-узлах. -
Убедитесь, что переход завершён и образы действительно загружаются из временного хранилища (
mode: Unmanagedбез ожидающего целевого режима в секретеregistry-state):d8 k -n d8-system get secret registry-state -o jsonpath='{.data.state}' | base64 -d | head - Обновите кластер на релиз с текущей реализацией. Передача управления произойдёт на следующей итерации согласования, и всё это время кластер продолжит загружать образы из временного хранилища.
- Включите текущую реализацию: задайте
mode: Managedсstorage.cache: true, укажите временное хранилище в качествеprimary.upstream— и добавьтеstorage.sourceв том же изменении (без него следующий шаг будет отклонён). Хранилище текущей реализации будет доступно по тому же пути на хосте, который использовалLocal, поэтому уже имеющиеся на дисках образы не будут скачиваться заново. -
Дождитесь, пока хранилище сообщит, что содержит весь набор образов (
phase: ReadyиsafeToDropUpstream: true), и уберитеprimary.upstreamиз ModuleConfigregistry. После этого кластер снова изолирован — теперь уже на текущей реализации:d8 k get registrystorage registry -o jsonpath='{.status.phase} {.status.safeToDropUpstream}{"\n"}' - Удалите временное хранилище и освободите занятый им диск.
Миграция на формат управления настройками хранилища образов с использованием модуля registry
Эта процедура переводит кластер с устаревшего формата (без модуля registry, настроенного только через InitConfiguration) на предыдущую реализацию модуля. Если ваш кластер уже использует предыдущую реализацию и вы хотите перейти сразу на текущую, используйте раздел «Миграция с предыдущей реализации на текущую».
Во время миграции для containerd v1 будет выполнен переход на новую схему конфигурации хранилища образов. containerd v2 использует новую схему по умолчанию. Подробнее можно ознакомиться в разделе с описанием способов конфигурации.
Чтобы посмотреть тип container runtime, используемый на узлах кластера (в NodeGroup) по умолчанию, используйте команду:
d8 system edit cluster-configuration
Тип container runtime указывается в параметре defaultCRI.
Если в качестве container runtime используется containerd v2, используйте для миграции инструкцию для containerd v2.
Если в качестве container runtime используется containerd v1, можете выбрать один из способов миграции на формат управления настройками хранилища образов с использованием модуля registry:
- Без переключения на containerd v2. В этом случае используйте инструкцию для containerd v1.
-
С переключением на containerd v2. В этом случае:
- Убедитесь в возможности переключения на containerd v2 и при наличии такой возможности выполните переключение.
- После переключения используйте инструкцию для containerd v2.
Для containerd v2
-
Выполните переключение на использование модуля
registry. Для этого укажите в ModuleConfigdeckhouseпараметрыUnmanagedрежима. Если используется хранилище образов компонентов DP, отличное отregistry.deckhouse.ru, ознакомьтесь с конфигурацией модуляdeckhouseдля корректной настройки.Для просмотра текущих настроек хранилища образов используйте команду:
d8 k -n d8-system exec -it svc/deckhouse-leader -c deckhouse -- deckhouse-controller global values | yq e '.modulesImages.registry' -Данные настройки укажите при конфигурации
Unmanagedрежима:apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: deckhouse spec: version: 1 enabled: true settings: registry: mode: Unmanaged unmanaged: imagesRepo: registry.deckhouse.ru/deckhouse/ee scheme: HTTPS license: <LICENSE_KEY> # Замените на ваш лицензионный ключ. -
Дождитесь завершения переключения. Пример статуса переключения:
conditions: # ... - lastTransitionTime: "..." message: "" reason: "" status: "True" type: Ready hash: .. mode: Unmanaged target_mode: Unmanaged
Если требуется добавить конфигурации для дополнительного хранилища образов, воспользуйтесь разделом «Новый способ добавления конфигурации для дополнительного registry».
Для containerd v1
- Во время переключения containerd v1 сервис будет перезапущен.
- Во время переключения containerd v1 будет переведен на новую схему конфигурации хранилища образов компонентов DP.
- Во время переключения пользовательские конфигурации registry для containerd v1 будут временно недоступны.
-
Убедитесь, что на узлах с containerd v1 отсутствуют пользовательские конфигурации хранилища образов, расположенные в директории
/etc/containerd/conf.d. -
Если конфигурации присутствуют, необходимо выполнить миграцию на новый формат конфигурации хранилища образов в containerd. Для этого добавьте новые конфигурации в директорию
/etc/containerd/registry.d. Эти конфигурации вступят в силу после переключения на модульregistry. Для добавления конфигураций подготовьте NodeGroupConfiguration, подробнее — в разделе с описанием способов конфигурации. Пример:apiVersion: deckhouse.io/v1alpha1 kind: NodeGroupConfiguration metadata: name: containerd-additional-config-auth.sh spec: # Шаг может быть любой, поскольку перезапуск сервиса containerd не требуется. weight: 0 bundles: - '*' nodeGroups: - "*" content: | # Copyright 2023 Flant JSC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. REGISTRY_URL=private.registry.example mkdir -p "/etc/containerd/registry.d/${REGISTRY_URL}" bb-sync-file "/etc/containerd/registry.d/${REGISTRY_URL}/hosts.toml" - << EOF [host] [host."https://${REGISTRY_URL}"] capabilities = ["pull", "resolve"] [host."https://${REGISTRY_URL}".auth] username = "username" password = "password" EOF -
Примените NodeGroupConfiguration. Дождитесь появления конфигурационных файлов в директории
/etc/containerd/registry.dна всех узлах. -
Проверьте корректность работы конфигураций. Для этого воспользуйтесь командой:
# Для HTTPS. ctr -n k8s.io images pull --hosts-dir=/etc/containerd/registry.d/ private.registry.example/registry/path:tag # Для HTTP. ctr -n k8s.io images pull --hosts-dir=/etc/containerd/registry.d/ --plain-http private.registry.example/registry/path:tag -
Выполните переключение на использование модуля
registry. Для этого, укажите в ModuleConfigdeckhouseпараметрыUnmanagedрежима. Если используется хранилище образов, отличное отregistry.deckhouse.ru, ознакомьтесь с конфигурацией модуляdeckhouseдля корректной настройки.Для просмотра текущих настроек хранилища образов используйте команду:
d8 k -n d8-system exec -it svc/deckhouse-leader -c deckhouse -- deckhouse-controller global values | yq e '.modulesImages.registry' -Данные настройки укажите при конфигурации
Unmanagedрежима:apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: deckhouse spec: version: 1 enabled: true settings: registry: mode: Unmanaged unmanaged: imagesRepo: registry.deckhouse.ru/deckhouse/ee scheme: HTTPS license: <LICENSE_KEY> # Замените на ваш лицензионный ключ. -
После применения дождитесь в статусе переключения сообщения:
Пример вывода:
conditions: # ... - lastTransitionTime: "2025-08-13T15:22:34Z" message: | Check current nodes configuration 2/2 node(s) Unready: - master-0: has custom toml merge containerd configuration - worker-5e389be0-578df-s5sm5: has custom toml merge containerd configuration reason: Processing status: "False" type: ContainerdConfigPreflightReadyЭто сообщение означает, что на узлах имеются старые конфигурации хранилища образов, расположенные в директории
/etc/containerd/conf.d, и в данный момент переключение на новую конфигурацию containerd заблокировано. Для того чтобы разрешить переключение, необходимо удалить старые конфигурационные файлы. -
Удалите старые конфигурационные файлы, чтобы разрешить переключение на модуль
registry. Для этого создайте NodeGroupConfiguration. Пример манифеста NodeGroupConfiguration:apiVersion: deckhouse.io/v1alpha1 kind: NodeGroupConfiguration metadata: name: containerd-additional-config-auth-delete.sh spec: # Шаг должен выполниться до '032_configure_containerd.sh'. weight: 0 bundles: - '*' nodeGroups: - "*" content: | # Copyright 2023 Flant JSC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. file="/etc/containerd/conf.d/old-config.toml" [ -f "$file" ] && rm -f "$file" -
После удаления старых конфигураций убедитесь, что переключение продолжается. Пример статуса переключения:
conditions: # ... - lastTransitionTime: "2025-08-13T16:42:09Z" message: "" reason: "" status: "True" type: ContainerdConfigPreflightReady -
Дождитесь завершения переключения. Пример статуса переключения:
conditions: # ... - lastTransitionTime: "..." message: "" reason: "" status: "True" type: Ready hash: .. mode: Unmanaged target_mode: Unmanaged -
Удалите NodeGroupConfiguration, созданный на шаге удаления старых конфигурационных файлов:
d8 k delete nodegroupconfiguration containerd-additional-config-auth-delete.shЧтобы убедиться, что NodeGroupConfiguration удалён, используйте команду:
d8 k get nodegroupconfigurationВ списке не должно быть NodeGroupConfiguration, подлежащего удалению (в этом примере —
containerd-additional-config-auth-delete.sh).
Миграция на устаревший формат управления настройками хранилища образов компонентов DP (без модуля registry)
- Это устаревший (deprecated) формат управления хранилищем образов компонентов DP.
- Во время переключения containerd v1 будет перезапущен.
- Во время переключения containerd v1 будет переведен на старую схему конфигурации хранилища образов.
- Во время переключения, пользовательские конфигурации хранилища образов для containerd v1 будут временно недоступны.
-
Переведите модуль
registryв конфигурируемый режимUnmanaged. Если используется хранилище образов, отличное отregistry.deckhouse.ru, ознакомьтесь с конфигурацией модуляdeckhouseдля корректной настройки.Пример конфигурации:
apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: deckhouse spec: version: 1 enabled: true settings: registry: mode: Unmanaged unmanaged: imagesRepo: registry.deckhouse.ru/deckhouse/ee scheme: HTTPS license: <LICENSE_KEY> # Замените на ваш лицензионный ключ. -
Проверьте статус переключения, используя инструкцию. Пример вывода:
conditions: # ... - lastTransitionTime: "..." message: "" reason: "" status: "True" type: Ready hash: .. mode: Unmanaged target_mode: Unmanaged -
Переведите хранилище образов компонентов DP в неконфигурируемый режим
Unmanaged(без модуляregistry). Пример конфигурации:apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: deckhouse spec: version: 1 enabled: true settings: registry: mode: Unmanaged -
Проверьте статус переключения, используя инструкцию. Пример вывода:
conditions: # ... - lastTransitionTime: "..." message: "" reason: "" status: "True" type: Ready hash: .. mode: Unmanaged target_mode: Unmanaged -
Если используется containerd v1, и в кластере применены пользовательские конфигурации реестра, их необходимо заменить на старый формат. Для этого подготовьте конфигурации хранилища образов старого формата. Данные конфигурации на данном этапе применять не нужно. Пример конфигурации:
apiVersion: deckhouse.io/v1alpha1 kind: NodeGroupConfiguration metadata: name: containerd-additional-config-auth.sh spec: # Для добавления файла перед шагом '032_configure_containerd.sh'. weight: 31 bundles: - '*' nodeGroups: - "*" content: | # Copyright 2023 Flant JSC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. REGISTRY_URL=private.registry.example mkdir -p /etc/containerd/conf.d bb-sync-file /etc/containerd/conf.d/additional_registry.toml - << EOF [plugins] [plugins."io.containerd.grpc.v1.cri"] [plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."${REGISTRY_URL}"] endpoint = ["https://${REGISTRY_URL}"] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."${REGISTRY_URL}".auth] username = "username" password = "password" # OR auth = "<BASE64_AUTH_STRING>" EOF -
Удалите секрет
registry-bashible-config. Во время удаления containerd v1 переключится на старый формат конфигурации containerd:d8 k -n d8-system delete secret registry-bashible-config -
После удаления дождитесь завершения переключения. Для отслеживания используйте инструкцию. Пример вывода:
conditions: # ... - lastTransitionTime: "..." message: "" reason: "" status: "True" type: Ready hash: .. mode: Unmanaged target_mode: Unmanaged -
Если используется containerd v1, примените заготовленные на этапе ранее NodeGroupConfiguration с пользовательскими конфигурациями хранилища образов.
-
Отключите модуль
registry. Пример:apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: registry spec: enabled: false settings: {} version: 1
Просмотр статуса переключения режима хранилища образов предыдущей реализации
Статус переключения режима хранилища образов компонентов DP в предыдущей реализации можно получить с помощью следующей команды:
d8 k -n d8-system -o yaml get secret registry-state | yq -C -P '.data | del .state | map_values(@base64d) | .conditions = (.conditions | from_yaml)'
Пример вывода:
conditions:
- lastTransitionTime: "2025-07-15T12:52:46Z"
message: 'registry.deckhouse.ru: all 157 items are checked'
reason: Ready
status: "True"
type: RegistryContainsRequiredImages
- lastTransitionTime: "2025-07-11T11:59:03Z"
message: ""
reason: ""
status: "True"
type: ContainerdConfigPreflightReady
- lastTransitionTime: "2025-07-15T12:47:47Z"
message: ""
reason: ""
status: "True"
type: TransitionContainerdConfigReady
- lastTransitionTime: "2025-07-15T12:52:48Z"
message: ""
reason: ""
status: "True"
type: InClusterProxyReady
- lastTransitionTime: "2025-07-15T12:54:53Z"
message: ""
reason: ""
status: "True"
type: DeckhouseRegistrySwitchReady
- lastTransitionTime: "2025-07-15T12:55:48Z"
message: ""
reason: ""
status: "True"
type: FinalContainerdConfigReady
- lastTransitionTime: "2025-07-15T12:55:48Z"
message: ""
reason: ""
status: "True"
type: Ready
mode: Direct
target_mode: Direct
Вывод отображает состояние процесса переключения. Каждое условие может находиться в статусе True или False, а также содержать поле message с пояснением.
Описание условий:
| Условие | Описание |
|---|---|
ContainerdConfigPreflightReady |
Состояние проверки конфигурации containerd. Проверяется, что на узлах отсутствуют пользовательские auth-конфигурации containerd |
TransitionContainerdConfigReady |
Состояние подготовки конфигурации containerd в новый режим. Проверяется, что конфигурация containerd успешно подготовлена и содержит одновременно конфигурации нового и старого режима |
FinalContainerdConfigReady |
Состояние завершения переключения containerd в новый режим. Проверяется, что конфигурация containerd успешно применена и содержит конфигурацию нового режима |
DeckhouseRegistrySwitchReady |
Состояние переключения DP и его компонентов на использование нового хранилища образов контейнеров. Значение True указывает, что DP успешно переключился на сконфигурированное хранилище образов и готов к работе |
InClusterProxyReady |
Состояние готовности In-Cluster Proxy. Проверяется, что In-Cluster Proxy успешно запущен и работает |
CleanupInClusterProxy |
Состояние очистки In-Cluster Proxy, если прокси не нужен для работы желаемого режима. Проверяется, что все ресурсы, связанные с In-Cluster Proxy, успешно удалены |
NodeServicesReady |
Состояние готовности Node Services Manager и Static-Pod хранилища образов. Проверяется, что Node Services Manager успешно запущен и работает, и что Static-Pod хранилища образов был успешно развёрнут с помощью Node Services Manager |
CleanupNodeServices |
Состояние очистки Node Services Manager и Static-Pod хранилища образов, если компоненты не нужны для работы желаемого режима. Проверяется, что все ресурсы, связанные с Node Services Manager и Static-Pod хранилища образов, успешно удалены |
RegistryContainsRequiredImages |
Состояние проверки хранилища образов на наличие необходимых образов |
Ready |
Общее состояние готовности хранилища образов к работе в указанном режиме. Проверяется, что все предыдущие условия выполнены и модуль готов к работе |