Модуль представляет собой совокупность приложений и ресурсов, которые расширяют возможности Deckhouse Kubernetes Platform.
Данный раздел посвящён устройству модулей DKP. Материал поможет разобраться в их внутренней структуре, принципах разработки и отладки, а также в способах взаимодействия с другими элементами платформы.
Deckhouse Kubernetes Platform (DKP) поддерживает два типа модулей:
Процесс создания модуля включает несколько ключевых этапов:
Для разработки модулей DKP вам понадобятся следующие инструменты:
git — система контроля версий;
sed — редактор потоков;
yq — CLI-утилита для обработки данных в форматах JSON, YAML и XML;
jq — CLI-утилита для обработки данных в форматах JSON, YAML и XML;
werf — (не обязательно) CLI-утилита для сборки образов. Она понадобится, если вы хотите собрать артефакты модуля локально;
crane — (не обязательно) CLI-утилита для работы с container registry. Может понадобиться при отладке.
Container registry, в котором хранятся артефакты модуля, должен поддерживать вложенную структуру репозиториев. Можно использовать такие registry, как Docker Registry v2 или Harbor.
Для глубокого понимания работы модулей DKP необходимо изучить принципы функционирования addon-operator и shell-operator. Эти компоненты лежат в основе логики управления модулями.
Ключевая концепция — хуки (hooks). Рекомендуется ознакомиться с документацией операторов, чтобы понять:
Следующая важная концепция — снапшоты (snapshots). Они позволяют реализовать эффективный цикл согласования состояния (reconciliation loop), который является более надёжной альтернативой прямой подписке на события Kubernetes. В DKP именно этот подход используется для работы всех хуков встроенных модулей.
Кроме того, хуки могут выполнять функцию экспортера метрик для Prometheus. Хук способен генерировать метрики, которые платформа DKP будет собирать и экспортировать. Рекомендуется изучить соответствующий раздел документации, посвящённый работе с метриками.
Исходный код модуля и правила его сборки должны храниться в директории, организованной по определённой структуре, напоминающей Helm-чарт, но с расширенным набором элементов. При этом наличие всех папок и файлов не является строго обязательным — включаются только те, которые необходимы для работы конкретного модуля.
Ключевые компоненты структуры модуля:
Для быстрого старта рекомендуется использовать репозиторий-шаблон модуля, в котором уже настроена предлагаемая структура файлов и директорий.
В папке /charts находятся вспомогательные чарты Helm, которые используются при рендере шаблонов.
У Deckhouse Kubernetes Platform (DKP) существует собственная библиотека для работы с шаблонами – lib-helm. О возможностях библиотеки можно почитать в репозитории lib-helm. Чтобы положить библиотеку в модуль, загрузите tgz-архив с нужным релизом и переместите его в директорию /charts модуля.
В этой директории лежат CustomResourceDefinition (CRD), которые используются компонентами модуля. CRD обновляются каждый раз, когда запускается модуль, если есть обновления.
Подпапки в папке /crds игнорируются.
Чтобы отобразить CRD из директории /crds в документации на сайте или модуле documentation в кластере, выполните следующие шаги:
В папке /docs находится документация к модулю. Следующие подпапки в папке docs игнорируются при сборке документации:
Следующие файлы обязательны:
Метаданные файла (front matter) в виде YAML-структуры должны быть во всех языковых версиях файла. Параметры, доступные для использования в метаданных:
Пример метаданных:
Следующие файлы не обязательны, но имеют предопределенное название пункта в sidebar (меню слева) и заголовок страницы:
Метаданные файла (front matter) в виде YAML-структуры должны быть во всех языковых версиях файла. Параметры, доступные для использования в метаданных:
Пример метаданных:
Метаданные файла (front matter) в виде YAML-структуры должны быть во всех языковых версиях файла. Параметры, доступные для использования в метаданных:
Пример метаданных:
Метаданные файла (front matter) в виде YAML-структуры должны быть во всех языковых версиях файла. Параметры, доступные для использования в метаданных:
Пример метаданных:
Пример метаданных:
CONFIGURATION.md и CONFIGURATION.ru.md — файлы для рендеринга OpenAPI-спецификаций из файлов /openapi/config-values.yaml и /openapi/doc-
Пример метаданных:
Все изображения, PDF-файлы и другие медиафайлы нужно хранить в директории /docs или ее подкаталогах (например, /docs/images/). Все ссылки на файлы должны быть относительными.
Для каждого языка нужен файл с соответствующим суффиксом. Например, image1.jpg и image1.ru.jpg. Используйте ссылки:
В директории /hooks/batch находятся хуки модуля. Хук — это исполняемый файл, выполняемый при реакции на событие. Хуки используются модулем также для динамического взаимодействия с API Kubernetes. Например, они могут быть использованы для обработки событий, связанных с созданием или удалением объектов в кластере.
Познакомьтесь с концепцией хуков, прежде чем начать разрабатывать свой собственный хук. Для ускорения разработки хуков можно воспользоваться Go-библиотекой от команды Deckhouse.
Требования к работе хука:
Файлы хуков должны иметь права на выполнение. Добавьте их командой chmod +x <путь до файла с хуком>.
В директории /images находятся инструкции по сборке образов контейнеров модуля. На первом уровне находятся директории для файлов, используемых при создании образа контейнера, на втором — контекст для сборки.
Существует два способа описания образа контейнера:
Имя образа совпадает с именем директории для этого модуля, записанным в нотации camelCase с маленькой буквы. Например, директории /images/echo-server соответствует имя образа echoServer.
Собранные образы имеют content-based теги, которые можно использовать в сборке других образов. Чтобы использовать content-based теги образов, подключите библиотеку lib-helm. Вы также можете воспользоваться другими функциями библиотеки helm_lib Deckhouse Kubernetes Platform.
Пример использования content-based тега образа в Helm-чарте:
В директории /openapi/conversions находятся файлы конверсий параметров модуля и их тесты.
Конверсии параметров модуля позволяют конвертировать OpenAPI-спецификацию параметров модуля одной версии в другую. Конверсии могут быть необходимы в случаях, когда в новой версии OpenAPI-спецификации параметр переименовывается или переносится в другое место.
Каждая конверсия возможна только между двумя смежными версиями (например с первой версии на вторую). Конверсий может быть несколько, и цепочка конверсий должна последовательно покрывать все версии спецификации параметров модуля, без “пропусков”.
Файл конверсии — это YAML-файл с именем v
Описание действий, указываемое в секции description файла конверсий, должно быть понятным и содержать информацию о том, какие параметры и в каком порядке нужно изменить в спецификации параметров модуля, чтобы перейти к новой версии.
Пример файла конверсии параметров модуля v2.yaml, где в версии 2 удаляется параметр .auth.password:
Для написания тестов конверсий можно использовать функцию conversion.TestConvert, которой нужно передать:
Необходим для проверки параметров модуля, которые пользователь может настроить через ModuleConfig.
Чтобы схема была представлена в документации на сайте или в модуле documentation в кластере, создайте:
Пример схемы /openapi/config-values.yaml с одним настраиваемым параметром nodeSelector:
Пример файла /openapi/doc-ru-config-values.yaml для русскоязычного перевода схемы:
При разработке модуля для Deckhouse Kubernetes Platform вы можете использовать расширение OpenAPI x-deckhouse-validations для описания сложных правил валидации параметров модуля на языке CEL (Common Expression Language).
При использовании CEL-валидаций учитывайте следующие особенности:
Ниже представлены примеры описаний сложных правил валидации на языке CEL:
Валидации скалярных значений и массивов имеют следующие особенности:
Пример для массива:
Для объектов с additionalProperties (map) можно валидировать ключи и значения через методы .all(key, ...), .exists(key, ...) и т.д.
Пример:
Необходим для проверки исходных данных при рендере шаблонов без использования дополнительных функций Helm chart. Ближайший аналог — schema-файлы из Helm.
В values.yaml можно автоматически добавить валидацию параметров из config-values.yaml. В этом случае, минимальный values.yaml выглядит следующим образом:
В директории /templates находятся шаблоны Helm.
Модуль может иметь параметры, с помощью которых может менять свое поведение. Параметры модуля и схема их валидации описываются в OpenAPI-схемах в директории /openapi.
Настройки лежат в двух файлах: config-values.yaml и values.yaml.
Исключите файлы из Helm-релиза с помощью .helmignore. В случае модулей DKP директории /crds, /images, /hooks, /openapi обязательно добавляйте в .helmignore, чтобы избежать превышения лимита размера Helm-релиза в 1 Мб.
Файл для чарта, аналогичный Chart.yaml из Helm. Должен содержать, как минимум, параметр name с именем модуля и параметр version с версией. Вы можете не создавать данный файл, Deckhouse создаст его автоматически.
Пример:
Файл module.yaml в корне папки модуля содержит метаданные модуля.
Файл может отсутствовать, но рекомендуется его заполнить. Большинство метаданных будут доступны в объекте Module) и успешной синхронизации.
Параметры, которые можно использовать в module.yaml:
Если для отключения модуля требуется подтверждение (параметр confirmation установлен в true), то отключение будет возможно только в случае, если на соответствующем объекте ModuleConfig установлена аннотация modules.deckhouse.io/allow-disabling=true. Если такой аннотации нет, при попытке отключить модуль будет выведено предупреждение, включающее сообщение из параметра message.
Например, если указать tags: ["test", "myTag"], то объект Module получит лейблы module.deckhouse.io/test="" и module.deckhouse.io/myTag="".
На порядок запуска также влияют зависимости модуля.
Пример описания метаданных модуля hello-world:
Параметр accessibility позволяет задать редакции DKP и наборы модулей (bundles), в которых будет доступен модуль, а также определить, будет ли он включаться по умолчанию.
Описание параметров:
Обратите внимание, что в этот набор не входят базовые модули (например, модуль работы с CNI). Без включения базовых модулей Deckhouse может работать только в уже развернутом кластере.
Схема ниже показывает логику определения доступности и включения модуля в зависимости от настроек:
В следующем примере конфигурации модуль будет недоступен во всех редакциях, кроме DKP Enterprise Edition. В DKP Enterprise Edition модуль будет включён по умолчанию в наборе модулей Managed.
В следующем примере конфигурации модуль будет доступен во всех редакциях DKP. В наборах модулей Managed и Default модуль будет включён по умолчанию.
В следующем примере модуль будет доступен во всех редакциях DKP. Модуль будет включён в наборах модулей Default и Managed во всех редакциях, кроме DKP Basic Edition и DKP Community Edition.
Deckhouse Kubernetes Platform (DKP) использует container registry для загрузки и обновления модуля. В container registry хранятся артефакты модуля. Артефакты модуля появляются в результате сборки модуля, после чего их можно загрузить (опубликовать) в registry.
В результате сборки модуля формируются три типа артефактов, которые затем загружаются в container registry:
1. Образы контейнеров приложений
2. Образ модуля
3. Релиз
Тег семантического версионирования (аналогично образу модуля);
Тег, соответствующий каналу обновлений (например, alpha, beta и т.д.).
Для сборки артефактов модуля и загрузки их в container registry в рамках процесса CI/CD мы предлагаем воспользоваться подготовленными GitHub Actions.
В репозитории шаблона модуля представлен пример модуля, который содержит простой workflow для GitHub Actions и использует GitHub Packages (ghcr.io) в качестве container registry. В представленном примере workflow используется следующая логика:
Артефакты модуля будут загружаться по адресу ghcr.io/
Выполните следующие настройки в свойствах вашего проекта на GitHub, чтобы workflow модуля работал корректно:
Вы также можете модифицировать workflow, предусмотреть использование своего container registry и более сложный процесс сборки и публикации (например, с использованием отдельных container registry для разработки и промышленной эксплуатации).
cdПри разработке нескольких модулей и их публикации в GitHub Packages необходимо использовать Personal Access Token (PAT) аккаунта. Не используйте GITHUB_TOKEN в GitHub Workflows, чтобы избежать проблем с правами доступа при загрузке образов. Это связано с тем, что конечные релизные образы сохраняются по адресу ghcr.io//modules/, принадлежащему первому созданному репозиторию. Пример адаптации шаблона модуля для использования PAT: На странице Settings -> Secrets and variables -> Actions создайте Secret с названием TOKEN, содержащий PAT. Замените переменную GITHUB_TOKEN на TOKEN в .github/workflows/:
Артефакты модуля также можно собрать локально с помощью werf (это может потребоваться, например, при отладке).
Вы также можете самостоятельно сделать сборку артефактов модуля и публикацию для вашей системы CI/CD по аналогии с workflow для GitHub Actions, приведенном в шаблоне модуля, но это может потребовать глубокого понимания процессов сборки и публикации модуля. Обратитесь к сообществу при появлении вопросов и затруднений.
Общий сценарий работы с workflow, приведенным в шаблоне модуля:
Чтобы запустить модуль в кластере, необходимо выполнить следующие шаги:
Deckhouse Kubernetes Platform (DKP) может работать со следующими видами модулей:
Чтобы указать, откуда кластеру получать информацию о модулях, создайте ресурс ModuleSource. В нем задаются адрес хранилища образов контейнеров, из которого DKP будет загружать модули, параметры аутентификации и другие настройки доступа.
Пример ресурса ModuleSource:
После создания ресурса ModuleSource DKP начнет выполнять периодическую (раз в три минуты) синхронизацию данных с источником модулей (загружать информацию о модулях, доступны в источнике).
Проверить состояние синхронизации можно с помощью следующей команды:
Пример вывода в случае успешной синхронизации:
В случае ошибок синхронизации в столбце MSG будет указано общее описание ошибки. Пример:
Подробную информацию об ошибках можно получить в поле pullError в статусе ресурса ModuleSource.
Пример получения подробной информации об ошибках из источника модулей example:
В случае успешной синхронизации, поле .status.modules ресурса ModuleSource будет содержать список модулей, доступных для включения в кластере.
Пример получения списка модулей, доступных из источника модулей example:
Полный список модулей, доступных из всех созданных в кластере источников модулей, можно получить с помощью следующей команды:
После создания ресурса ModuleSource и успешной синхронизации, в кластере должны начать появляться модули — ресурсы Module (DKP создает их автоматически, создавать их не нужно). Посмотреть список модулей можно с помощью следующей команды:
Пример получения списка модулей:
Чтобы получить дополнительную информацию о модуле, выполните следующую команду:
Пример вывода:
В Module указаны доступные источники из которых его можно скачать (в примере он только один).
Далее нужно включить модуль. Для этого нужно создать ModuleConfig с названием модуля.
За включение модуля отвечает параметр enabled ModuleConfig. Если модуль доступен из нескольких источников (ресурс ModuleSource), необходимый источник можно указать в параметре source.
Политику обновления (имя ModuleUpdatePolicy) можно указать в параметре updatePolicy. Политику обновления можно не указывать, — в этом случае она будет унаследована от параметров обновления Deckhouse Kubernetes Platform (releaseChannel и upd ate ModuleConfig deckhouse).
Пример ModuleConfig для включения модуля module-one из источника example:
d8 k get mr -l module=Если в конфигурации модуля есть обязательные параметры, и модуль включён без их указания, произойдёт ошибка валидации конфигурации. В этом случае сработает алерт D8DeckhouseModuleValidationError, а модуль не будет успешно активирован. Для получения подробной информации используйте команду:
Убедитесь, что вы указываете необходимые параметры конфигурации в ModuleConfig согласно документации модуля.
После включения модуля, он должен перейти в фазу скачивания (Downloading):
Если модуль не перешел в фазу скачивания, проверьте источник модуля (ModuleSource), возможно модуль не может скачаться.
После успешного скачивания модуль перейдет в фазу установки (Installing):
Если модуль успешно установился, то он перейдет в фазу готовности (Ready):
Пример объекта Module в кластере, когда модуль успешно установился:
В Module можно увидеть текущую установленную версию модуля, его вес, источник откуда он скачался, зависимости и релизный канал.
При возникновении каких либо ошибок, модуль перейдет в фазу ошибки (Error):
Если у включенного модуля есть несколько доступных источников, и в его ModuleConfig явно не выбран источник модуля, модуль перейдет в фазу конфликта (Conflict):
Чтобы разрешить конфликт, укажите источник модуля (имя ModuleSource) явно в ModuleConfig.
После скачивания модуля в кластере появятся релизы модуля — объекты ModuleRelease.
Посмотреть список релизов можно с помощью следующей команды:
Пример получения списка релизов модулей:
Если релиз модуля находится в статусе Superseded, это значит что релиз модуля устарел, и есть более новый релиз, который его заменил.
d8 k annotate mrЕсли релиз модуля находится в статусе Pending, то это значит что он требует ручного подтверждения для установки (смотри далее про политику обновления модуля). Подтвердить релиз модуля можно следующей командой (укажите имя moduleRelease):
Если необходимо развернуть модуль из другого источника модулей, выполните следующие шаги:
Политика обновления модуля — это правила, по которым DKP обновляет модули в кластере. Она определяется ресурсом ModuleUpdatePolicy, в котором можно настроить:
Создавать ресурс ModuleUpdatePolicy не обязательно. Если политика обновления для модуля не определена (отсутствует соответствующий ресурс ModuleUpdatePolicy), то настройки обновления соответствуют настройкам обновления самого DKP (параметр update модуля deckhouse).
Пример ресурса ModuleUpdatePolicy, политика обновления которого разрешает автоматическое обновление модуля по понедельникам и средам с 13:30 до 14:00 UTC:
Политика обновления указывается в поле updatePolicy в ModuleConfig.
Прежде чем включить модуль, проверьте что он доступен для включения. Выполните следующую команду, чтобы вывести список всех доступных модулей DKP:
Модуль должен быть в списке.
Пример вывода:
Вывод показывает, что модуль module-one доступен для включения.
Если модуля нет в списке, то проверьте что определен источник модулей и модуль есть в списке в источнике модулей. Также проверьте политику обновления модуля (если она определена). Если политика обновления модуля не определена, то она соответствует политике обновления DKP (параметр releaseChannel и секция update параметров модуля deckhouse).
Включить модуль можно аналогично встроенному модулю DKP любым из следующих способов:
Пример ModuleConfig, для включения и настройки модуля module-one в кластере:
Если при включении модуля в кластере возникли ошибки, то получить информацию о них можно следующими способами:
Посмотреть объект ModuleConfig модуля:
Пример вывода информации об ошибке модуля module-one:
Пример вывода если у источника модуля есть проблемы со скачиванием модуля:
По аналогии с DeckhouseRelease (ресурсом релиза DKP) у модулей есть аналогичный ресурс — ModuleRelease. DKP создает ModuleRelease исходя из того, что хранится в container registry. При поиске проблем с модулем проверьте также доступные в кластере ModuleRelease:
Пример вывода:
В примере вывода показан ModuleRelease, когда режим обновления (параметр update.mode ModuleUpdatePolicy установлен в Manual. В этом случае необходимо вручную подтвердить установку новой версии модуля, установив на ModuleRelease аннотацию modules.deckhouse.io/approved="true":
Для автоматической проверки структуры модуля и, при необходимости, отправки статистики, в сборку можно подключить Deckhouse Module Tools (DMT).
Для GitHub доступен отдельный GitHub Action для подключения DMT к модулю.
Чтобы подключить DMT, в конфигурации workflow сборки [project].github/workflows/build.yml добавьте шаг для выполнения проверки:
Переменные DMT_METRICS_URL и DMT_METRICS_TOKEN – необязательные. При их наличии DMT будет отправлять телеметрию на указанный адрес.
Если модуль находится в GitHub-группе deckhouse, значения этих переменных будут автоматически получены из настроенных секретов.
Для GitLab также доступны готовые шаблоны, которые можно подключить в .gitlab-ci.yml для автоматической настройки процессов сборки и проверки корректности:
1. В файле .gitlab-ci.yml вашего проекта добавьте ссылки на шаблоны:
Пример добавления ссылок расположен в GitLab.
2.После подключения шаблонов, в той же конфигурации .gitlab-ci.yml добавьте шаг для выполнения проверки:
Если проект находится в группе https://fox.flant.com/deckhouse, переменные для отправки метрик уже заданы. Дополнительно ничего конфигурировать не требуется.
В этом разделе описаны зависимости, которые могут быть установлены для модуля.
Зависимости — это набор условий (требований), которые должны выполняться, чтобы Deckhouse Kubernetes Platform (DKP) мог запустить модуль.
DKP поддерживает следующие зависимости для модуля:
Эта зависимость определяет минимальную или максимальную версию DKP, с которой совместим модуль.
Пример настройки зависимости модуля от версии DKP 1.61 и выше в файле module.yaml:
Для тестирования можно задать переменную окружения TEST_EXTENDER_DECKHOUSE_VERSION, чтобы симулировать желаемую версию DKP.
Зависимость проверяется в следующих случаях:
1. При установке или обновлении модуля. Если версия DKP не соответствует требованиям, указанным в зависимостях модуля релиза, его установка или обновление не будут выполнены.
Пример ресурса ModuleRelease, когда версия DKP не соответствует требованиям модуля:
Выводимая информация:
2. При обновлении DKP. Проверяется, соответствует ли новая версия DKP зависимостям установленных и активных модулей. Если хотя бы один модуль несовместим с новой версией, обновление DKP не выполнится.
Пример ресурса DeckhouseRelease, когда версия DKP не соответствует требованиям модуля:
Выводимая информация:
3. При первичном анализе модулей. Проверяются текущая версия DKP и зависимости уже установленных модулей. Если обнаружено несоответствие, модуль будет отключён.
Эта зависимость определяет минимальную или максимальную версию Kubernetes, с которой совместим модуль.
Пример настройки зависимости от Kubernetes 1.28 и выше в файле module.yaml:
Для тестирования можно задать переменную окружения TEST_EXTENDER_KUBERNETES_VERSION, чтобы симулировать желаемую версию Kubernetes.
Зависимость проверяется в следующих случаях:
1. При установке или обновлении модуля. Если версия Kubernetes не соответствует требованиям, указанным в зависимостях модуля релиза, установка или обновление не будут выполнены.
Пример ресурса ModuleRelease, когда версия Kubernetes не соответствует требованиям модуля:
Выводимая информация:
2. При обновлении версии Kubernetes. Проверяются зависимости активных модулей, и если хотя бы один модуль несовместим с новой версией Kubernetes, изменение версии не будет принято.
Пример вывода при несовместимости модуля с новой версией Kubernetes:
Выводимая информация:
3. При первичном анализе модулей. Если версия Kubernetes не соответствует зависимостям уже установленных модулей, DKP отключит такие модули.
4. При обновлении DKP. Проверяется значение версии Kubernetes, установленной по умолчанию для DKP, если оно несовместимо с активными модулями, обновление DKP не будет выполнено.
Пример ресурса DeckhouseRelease, когда версия Kubernetes не соответствует требованиям модуля:
Выводимая информация:
Зависимости от версии других модулей описывают условия включения, обновления и выключения модуля. Модуль в Deckhouse Kubernetes Platform может иметь обязательные и необязательные зависимости от версий других модулей.
Обязательная зависимость определяет список включенных модулей и их версии, которые необходимы для работы модуля.
Версия встроенного модуля DKP считается равной версии DKP.
Если необходимо указать, чтобы какой-то модуль был просто включен, не важно какой версии, то можно использовать следующий синтаксис (на примере модуля user-authn):
Пример настройки зависимости от трех модулей:
Необязательные зависимости для модулей доступны для Deckhouse Kubernetes Platform, начиная с версии 1.73. Если вы планируете использовать их для какого-то модуля, задайте для него зависимость от версии DKP 1.73 и выше.
Необязательная зависимость используется, когда модуль работает самостоятельно, но может использоваться совместно с другим модулем, если он включён.
Необязательные зависимости могут влиять на возможность включения, выключения и обновления обоих модулей: зависимого и того, от которого он зависит.
Чтобы указать, что зависимость является необязательной, добавьте !optional к строке ограничения версии модуля, от которого может зависеть целевой модуль:
Ниже рассмотрены ограничения при использовании необязательных зависимостей модуля и примеры настроек, где: prometheus — целевой модуль, для которого задается необязательная зависимость; test — модуль, совместно с которым может использоваться целевой.
При наличии необязательной зависимости от версии другого модуля целевой имеет следующие ограничения по включению и выключению:
1. Если в кластере не включен test, prometheus может быть включен.
Пример: test выключен + для prometheus задано необязательное требование test: ">v0.22.1 !optional" → prometheus будет включен, требование пропускается.
2. Если в кластере уже включен test, включение prometheus с requirements возможно только, если в requirements указаны требования, которым соответствует текущая версия test.
Пример: в кластере включен test версии v0.21.1 + для prometheus задано необязательное требование test: ">v0.22.1 !optional" → установка/включение prometheus завершится ошибкой о несоответствии зависимости (текущая версия test не соответствует requirements).
3. Если test будет выключен в кластере, prometheus останется включенным.
Пример: в кластере включен test + для prometheus задано необязательное требование test: ">v0.22.1 !optional" → выключение test пройдет успешно, prometheus выключен не будет.
При наличии необязательной зависимости от версии другого модуля целевой модуль имеет следующие ограничения по обновлению:
1. prometheus может быть обновлен, даже если в кластере нет модуля test.
Пример: test выключен + для prometheus задано необязательное требование test: ">v0.22.1 !optional" → prometheus будет обновлен.
2. Обновление для prometheus будет заблокировано, пока в кластере не обновится test указанной в requirements версии.
Пример: test включен + для prometheus задано необязательное требование test: ">v0.22.1 !optional" → prometheus не будет обновлен, пока не обновится test.
Если модуль prometheus включен, невозможно включить test, версия которого не соответствует выражению, указанному в requirements для prometheus.
Пример: prometheus включен + для prometheus задано необязательное требование test: ">v0.22.1 !optional" → попытка включения test v0.21.1 завершится ошибкой о несоответствии зависимости (версия test v0.21.1 не соответствует условию в requirements для prometheus).
Если prometheus и test включены в кластере, обновление test возможно только на версию которая соответствует требованиям, указанным в requirements для prometheus.
Пример: Модули prometheus и test включены в кластере + для prometheus задано необязательное требование test: "=v0.22.1 !optional" + попытка обновления test до версии 0.23.1 → test не будет обновлен, т.к. требуемая версия не соответствует requirements для prometheus.
Включение и отключение модулей может занимать больше времени из‑за дополнительных проверок экстендера. Известное ограничение: во время обработки модулей список включённых модулей может кратковременно быть пустым. В редких случаях это позволяет ошибочно пройти проверку опциональной зависимости. Если столкнулись, повторите операцию.
В Deckhouse Kubernetes Platform (DKP) используется принцип семантического версионирования для модулей.
При выборе номера версии используйте следующие рекомендации:
Перед номером версии в теге git и контейнере registry всегда добавляется буква “v”. Например: v0.0.73, v1.0.0.
Каналы обновлений позволяют выпускать новую версию модуля постепенно, сначала для ограниченного числа пользователей, а затем для более широкой аудитории. Вы самостоятельно определяете, насколько стабильна новая версия и на какой канал обновлений её можно опубликовать.
Важно понимать, что выбор канала обновлений не определяет стабильность модуля в целом. Каналы являются инструментом доставки обновлений и определяют степень стабильности конкретного релиза.
При публикации новой версии модуля на канал обновлений сначала используйте канал обновлений Alpha. Далее, если работа версии модуля не вызывает нареканий, публикуйте версию модуля последовательно на другие каналы обновлений, с учетом их стабильности: Alpha → Beta → Early Access → Stable → Rock Solid. Если версия модуля требует исправления ошибок, то публикация такой версии должна быть остановлена. После выпуска версии с исправлениями, необходимо повторить этап публикации версии начиная с канала обновлений Alpha.
Рекомендуемая последовательность публикации версии модуля в каналах обновлений:
За время своего жизненного цикла модуль проходит следующие стадии:
Модули на стадии Experimental по умолчанию включить нельзя. Чтобы разрешить использовать такие модули установите параметр allowExperimentalModules в true.
В зависимости от стадии жизненного цикла модуля и канала обновлений, из которого была установлена версия модуля, общую стабильность можно определить по следующей таблице:
|
Стадия жизненного цикла |
Каналы обновлений |
||||
|---|---|---|---|---|---|
|
Alpha |
Beta |
Early Access |
Stable |
Rock Solid |
|
|
Experimental |
Эксперименты |
Эксперименты |
Эксперименты |
Опытная эксплуатация |
Опытная эксплуатация |
|
Preview |
Эксперименты |
Ограниченная эксплуатация |
Ограниченная эксплуатация |
Промышленная эксплуатация |
Промышленная эксплуатация |
|
General Availability |
Эксперименты |
Ограниченная эксплуатация |
Ограниченная эксплуатация |
Промышленная эксплуатация |
Промышленная эксплуатация в ответственных системах |
|
Deprecated |
Отказ от использования |
Отказ от использования |
Отказ от использования |
Отказ от использования |
Отказ от использования |
Выводы:
Модули в DKP используют кастомные ресурсы для взаимодействия с пользователями. Параметр apiVersion с версией API этих ресурсов обновляется в соответствии со следующими правилами:
При необходимости можно выпустить новую версию API v2, которая проходит те же этапы, но с префиксом v2. Важно помнить, что после выпуска версии v1stableX Kubernetes будет считать её более приоритетной, чем alpha- или beta-версии, до выпуска новой стабильной версии v2stableX. При выполнении команд kubectl apply и kubectl edit по умолчанию будет использоваться версия v1stableX.
Причины для выпуска новой версии:
Добавлять новые параметры можно без изменения версии.
Для автоматической конвертации параметров модуля из одной версии в другую включите в модуль соответствующие конверсии. Это может понадобиться, например, при переименовании или перемещении параметра в новой версии OpenAPI-спецификации.
При выходе новой версии CustomResourceDefinition (CRD) используйте следующие рекомендации:
1. Установите необходимые утилиты.
3. Укажите имя модуля в файле module.yaml.
В примере будет использоваться имя модуля helloworld, но вы можете выбрать свое, заменив helloworld в командах и в названии вашего репозитория.
Обратите внимание, что в некоторых местах в примере имя модуля может быть записано в разных форматах — kebab-case или camelCase. Если вы используете свое имя модуля, то учитывайте изменение формата имени модуля в приводимых командах.
Выполните следующую команду, чтобы указать имя модуля в файле module.yaml, либо отредактируйте его вручную:
4. Склонируйте исходный код чарта hello-world во временную директорию.
5. Скопируйте шаблоны чарта в директорию templates модуля, предварительно очистив ее.
6. Замените в шаблонах чарта путь .Values на .Values.helloworld.
sed -i -e 's/.Values/.Values.helloworld/g' $(find templates/ -type f)Это архитектурная особенность addon-operator, ей необходимо следовать для обращения к values модуля.
7. Добавьте OpenAPI-схему настроек модуля.
Параметры модуля указываются в OpenAPI-схеме в директории openapi. Выполните следующую команду, чтобы преобразовать JSON-схему параметров чарта в OpenAPI-схему модуля:
8. Опишите правило сборки образа контейнера приложения.
Правила сборки образов контейнеров приложений должны находиться в подкаталоге директории images модуля. Выполните следующую команду, чтобы создать директорию образа приложения и Dockerfile с правилами сборки образа.
9. Замените образ в манифесте Deployment на хелпер библиотеки Deckhouse Kubernetes Platform. Это позволит использовать актуальный content-based-тэг образа.
10. Удалите хуки модуля, CRD и временные файлы.
Пример не использует хуки и CustomResourceDefinition. Выполните следующие команды, чтобы очистить папки hooks и crds:
11. Настройте CI/CD.
В шаблоне проекта в директории .github находятся готовые файлы workflow GitHub Actions, которые реализуют простую схему сборки и публикации модуля с использованием registry GitHub Packages (ghcr.io). Артефакты модуля будут загружаться по адресу ghcr.io/
Выполните следующие настройки в свойствах вашего проекта на GitHub, чтобы workflow модуля работал корректно:
12. Зафиксируйте изменения в репозитории (укажите адрес Git-репозитория модуля).
13. Убедитесь, что сборка модуля выполнилась успешно.
Перейдите в раздел Actions репозитория модуля и слева, в списке workflow, выберите Build. Workflow, запущенный после того, как вы выполнили команду git push на предыдущем шаге, должен выполниться успешно.
Пример:
Пример публикации версии v0.0.1 модуля на канале обновлений Alpha:
4. Убедитесь, что workflow публикации модуля выполнился успешно.
Модуль стал доступным для подключения в кластере Deckhouse Kubernetes Platform.
Пример подключения модуля helloworld в кластере Deckhouse Kubernetes Platform.
1. Создайте токен доступа в репозитории GitHub с правами для работы с GitHub Packages.
2. Сгенерируйте строку аутентификации для доступа к GitHub Packages container registry в формате dockerconfigjson, указав имя пользователя (или организации) GitHub и токен доступа:
3. Создайте в кластере ресурс ModuleSource (укажите адрес container registry и строку аутентификации).
Синхронизация данных после создания ресурса может занять несколько секунд.
4. Посмотрите список доступных модулей:
5. Создайте ресурс ModuleUpdatePolicy, определяющий политику обновления модуля.
Выполните следующую команду, чтобы создать политику обновления с каналом обновления Alpha и режимом обновления Auto:
6. Создайте ModuleConfig, где укажите источник модуля (параметр source), политику обновления (параметр updatePolicy) и установите параметр enabled в true:
7. Проверьте ModuleSource (в статусе не должно содержаться ошибок и должны быть перечислены доступные модули):
8. Убедитесь, что были созданы новые объекты ModuleRelease для модуля:
Пример вывода:
9. В случае успешной установки релизов дождитесь перезапуска пода Deckhouse Kubernetes Platform.
Через некоторое время объекты модуля появятся в кластере.
Если при запуске модуля возникли ошибки, посмотрите журнал DKP:
или проверьте состояние очереди DKP:
Если в кластере существует ModuleUpdatePolicy версии v1alpha1, то необходимо выполнить следующие шаги по миграции на версию v1alpha2:
Если в кластере в каком-либо ModuleUpdatePolicy версии v1alpha1 определен moduleReleaseSelector, то для всех модулей, которые подходят под этот селектор, в системе мониторинга будут гореть алерты ModuleHasDeprecatedUpdatePolicy. В этом случае выполните следующие шаги по миграции на версию v1alpha2 ModuleUpdatePolicy:
При разработке модулей может возникнуть необходимость загрузить и развернуть модуль в обход каналов обновления. Для этого используется ресурс ModulePullOverride.
Ресурс ModulePullOverride предназначен только для использования в средах разработки и отладки. Его применение в production-кластерах не рекомендуется. Поддержка ресурса может быть исключена в следующих версиях Deckhouse Kubernetes Platform.
Пример ModulePullOverride:
Также для целей разработки может использоваться режим обслуживания модуля (maintenance mode). В этом режиме Deckhouse отключает управление ресурсами модуля и не применяет изменения автоматически. Этот режим не предназначен для эксплуатации в production-кластерах.
Пример:
Требования к параметрам ресурса:
Необязательный параметр spec.scanInterval устанавливает интервал времени для проверки образов в registry. По умолчанию задан интервал в 15 секунд. Для принудительного обновления можно изменить интервал, либо установить на ModulePullOverride аннотацию renew="".
Необязательный параметр spec.rollback — если установить этот параметр в true, это восстановит развернутый модуль до предыдущего состояния после удаления ModulePullOverride.
Результат применения ModulePullOverride можно увидеть в сообщении (колонка MESSAGE) при получении информации об ModulePullOverride. Значение Ready означает применение параметров ModulePullOverride. Любое другое значение означает конфликт.
Пример отсутствия конфликтов при применении ModulePullOverride:
Требования к модулю:
Пример:
Пример:
Пример:
Пример:
Пример:
Чтобы обновить модуль не дожидаясь начала следующего цикла обновления, можно выполнить следующую команду:
Чтобы назначить редакции Deckhouse, в которых должен быть доступен модуль, а также наборы модулей (bundles), в составе которых модуль должен быть включен по умолчанию, используйте поле accessibility в файле module.yaml:
В данном примере модуль будет доступен в редакции ee (DKP Enterprise Edition) и может быть включен через объект ModuleConfig, а также будет по умолчанию включен в составе набора модулей Default.
Чтобы использовать этот механизм, файл module.yaml должен быть включён в релизный образ. Модуль по-прежнему можно отключить с помощью объекта ModuleConfig. Модуль останется на последнем доступном релизе, если в следующем релизе он будет отключён (например, при установке available: false в соответствующей редакции).
После создания ModulePullOverride, соответствующий модуль не будет учитывать ModuleUpdatePolicy, а также не будет загружать и создавать объекты ModuleRelease. Модуль будет загружаться при каждом изменении параметра imageDigest, после чего будет применяться в кластере. В статусе ModuleSource модуль получит признак overridden: true, который указывает на то, что используется ModulePullOverride, а не ModuleUpdatePolicy. Также, соответствующий объект Module будет иметь в своем статусе поле IsOverridden и версию модуля из imageTag.
Пример:
После удаления ModulePullOverride модуль продолжит работать. Но, если для модуля существует ModuleUpdatePolicy, то загрузятся новые релизы модуля (ModuleRelease), которые заменят текущую “версию разработчика”.
1. В ModuleSource присутствуют два модуля echo и hello-world. Для них определена политика обновления, они загружаются и устанавливаются в DKP:
2. Включите модуль и создайте ModulePullOverride для модуля echo:
После создания ModulePullOverride, для модуля будет использоваться тег образа registry.example.com/deckhouse/modules/echo:main-patch-03354 (ms:spec.registry.repo/mpo:metadata.name:mpo:spec.imageTag).
3. Данные ModulePullOverride будут меняться при каждом обновлении модуля:
где:
4. При этом ModuleSource приобретет вид:
Версии ModuleRelease v1.0.0 и v1.1.1 приведены в качестве примера.
1. Установка модуля. При включении модуля (enable module
2. Отключение модуля. При отключении модуля (disable module
3. Поведение при повторном включении.
Если модуль включён в течение 72 часов:
Если модуль включён позже 72 часов:
4. Поведение выключенного модуля. Если модуль отключён, то релизы для него не загружаются. Задеплоенная версия модуля (последняя включённая) удаляется через 72 часа, если модуль так и не был повторно включён.
Механизм from-to позволяет пропускать пошаговые обновления модуля. Если текущая установленная версия модуля (в статусе Deployed) попадает в диапазон from-to, DKP пропускает промежуточные релизы и устанавливает последнюю доступную версию в пределах to.
Чтобы включить механизм, задайте правила перехода в конфигурации модуля (module.yaml). Пример:
Релиз с ограничениями (constrained release) — это релиз модуля, в чьём module.yaml задана секция update.versions. Механизм from-to работает только с такими релизами.
Условия применения from-to:
Проверить доступные релизы (ModuleRelease) можно с помощью команды:
Пример вывода, если текущая версия модуля — 0.3.33, а в module.yaml задано правило from: "0.3" → to: "0.7":
В этом примере вывода текущая установленная версия — 0.3.33 (в статусе Deployed). По правилу from: 0.3 → 0.7 к установке выбирается последняя доступная версия в пределах 0.7 — p-o-test-v0.7.25 (в статусе Pending). После подтверждения версии 0.4.1, 0.5.27 и 0.6.11 становятся в статусе Skipped, а p-o-test-v0.7.25 в статусе Deployed.
Подтвердить релиз модуля можно применив аннотацию с помощью команды:
Пример вывода после подтверждения:
Нужна ли аннотация зависит от политики обновления модуля. Подробнее — Политика обновления модуля.
Пример 1. Релиз назначения содержит правило, и его версия совпадает с to — переход выполняется.
В этом примере правило from-to прописано в самом релизе назначения, и значение to равно версии этого релиза. Текущая установленная версия (Deployed) не ниже значения from, значит переход возможен. Как только релиз появляется в кластере, DKP готовит обновление. Если по политике обновления требуется подтверждение — пометьте релиз аннотацией. После подтверждения промежуточные релизы будут пропущены, релиз назначения станет Deployed:
Также если текущая версия ещё выше значения from, переход также выполняется:
Пример 2. Текущая версия ниже from — переход не выполняется.
Если текущая установленная версия меньше значения from, правило не применяется. Обновление идёт по порядку (без пропуска):
Пример 3. Несовпадение to с версией релиза с правилом — переход не выполняется.
Переход возможен только в релиз, где to равно версии этого релиза. Если правило описано в другом релизе (например, to: "1.74" лежит в релизе v1.75.25), оно не сработает — обновление пойдёт по порядку.
После сборки модуля его артефакты должны быть загружены в хранилище образов контейнеров по пути, который является источником для загрузки и запуска модулей в DKP. Путь, по которому загружаются артефакты модулей в хранилище образов, указывается в ресурсе ModuleSource.
Пример иерархии образов контейнеров после загрузки артефактов модулей module-1 и modules-2 в registry:
Пример:
Пример:
В примере в модуле module-1 присутствуют два образа модуля и два образа контейнеров приложений.
Пример:
Модули могут включать дополнительные образы (например, базы данных уязвимостей или другие вспомогательные данные) путем добавления файла extra_images.json. Этот файл указывает дополнительные образы, которые необходимо вручную загрузить в реестр и которые отделены от основных образов модуля.
Для просмотра конфигурации дополнительных образов:
Пример файла extra_images.json для базы уязвимостей neuvector:
Важные замечания:
Пример:
примере в хранилище образов два релиза и используются два канала обновлений: alpha и beta.
Пример:
Опишите вашу задачу, и мы поможем вам ее решить