Для реализации механизма управления кластерами Deckhouse Platform (DP) используются модули commander и commander-agent.
Кластер DP, в котором установлен модуль commander, является управляющим кластером. Кластер DP с установленным модулем commander-agent является управляемым.
Модуль commander
Модуль commander реализует веб-приложение, позволяющее создавать однотипные кластеры на базе DP, управлять их конфигурациями и жизненным циклом.
Для установки модуля commander требуется экземпляр PostgreSQL, который может быть развёрнут вне кластера или в нём с помощью модуля managed-postgresql.
Для работы модуля commander в production-окружениях рекомендуется использовать выделенный экземпляр PostgreSQL.
При установке commander происходит генерация ключа шифрования данных в PostgreSQL. Этот ключ сохраняется в неймспейсе d8-commander в ресурсе Secret commander-envs.
Подробнее с описанием возможностей, настройки и примерами использования модуля можно ознакомиться в разделе документации модуля.
Архитектура модуля commander
Для упрощения схемы приняты следующие допущения:
- На схеме показано, что контейнеры разных подов взаимодействуют друг с другом напрямую. Фактически они взаимодействуют через соответствующие сервисы Kubernetes (внутренние балансировщики). Названия сервисов не указываются, если они очевидны из контекста. В остальных случаях название сервиса указано над стрелкой.
- Поды могут быть запущены в нескольких репликах, однако на схеме все поды изображены в одной реплике.
- На схеме изображены только основные контейнеры каждого компонента.
Архитектура модуля commander на уровне 2 модели C4 и его взаимодействие с другими компонентами DP изображены на следующей диаграмме:
Компоненты модуля commander
Модуль включает в себя базовые, служебные и опциональные компоненты.
Базовые компоненты
В базовые компоненты модуля commander входят:
-
Frontend (Deployment) — компонент предоставляет веб-интерфейс для управления кластерами.
Состоит из следующих контейнеров:
- wait-postgres — init-контейнер, проверяющий доступность экземпляра PostgreSQL;
- wait-migrations — init-контейнер, ожидающий выполнения всех миграций в базе данных;
- frontend — основной контейнер.
-
Backend (Deployment) — основной компонент, реализующий следующие API-интерфейсы:
- UI API — управление настройками кластеров, шаблонов и рабочих пространств;
- внешний API для интеграций и автоматизации — операции с кластерами, задачами, шаблонами, проектами, ролями и др.;
- API для работы с cluster-manager — обмен состояниями задач кластера и обработка фаз развёртывания и настройки управляемых кластеров;
- API для работы с
commander-agent— авторизация и приём агентских метрик, а также получение целевой конфигурации управляемого кластера.
Backend обеспечивает следующие возможности:
- управление жизненным циклом кластеров — создание, изменение или удаление кластера (через cluster-manager), перезапуск задач с ошибками и связанные проверки;
- управление кластерным RBAC и ограничение прав на API-операции;
- управление шаблонами, хранение целевых и текущих настроек кластеров;
- управление хранилищами образов;
- управление проектами и шаблонами проекта;
- управление настройками биллинга (если компонент включён).
Компонент хранит целевое состояние системы в экземпляре PostgreSQL, а также использует экземпляр Redis для публикации задач в управляемых кластерах и для получения результатов их обработки.
Состоит из следующих контейнеров:
- wait-postgres — init-контейнер, проверяющий доступность экземпляра PostgreSQL;
- wait-migrations — init-контейнер, ожидающий выполнения всех миграций в базе данных;
- backend — основной контейнер;
- kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищенного доступа к основному контейнеру.
-
Cable (Deployment) — компонент обеспечивает работу WebSocket для обновления UI в реальном времени.
Состоит из следующих контейнеров:
- wait-postgres — init-контейнер, проверяющий доступность экземпляра PostgreSQL;
- wait-migrations — init-контейнер, ожидающий выполнения всех миграций в базе данных;
- cable — основной контейнер;
- kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищенного доступа к основному контейнеру.
-
Sidekiq (Deployment) — компонент, реализованный на базе библиотеки Sidekiq и обеспечивающий работу с очередями в Ruby on Rails.
Состоит из следующих контейнеров:
- wait-postgres — init-контейнер, проверяющий доступность экземпляра PostgreSQL;
- wait-migrations — init-контейнер, ожидающий выполнения всех миграций в базе данных;
- sidekiq — основной контейнер;
- kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищенного доступа к основному контейнеру.
-
Cluster-manager (Deployment) — компонент, реализующий выполнение задач по развёртыванию и управлению конфигурацией управляемых кластеров DP, запрошенных компонентом backend.
При создании нового кластера cluster-manager создаёт следующие ресурсы в неймспейсе
d8-commanderв управляющем кластере:- Deployment и Secret с именем
dhctl-<REGISTRY_HASH>-<VERSION>— запуск dhctl в режиме gRPC-сервера. Cluster-manager использует RPC-вызовы для установки и настройки кластера DP; - для обработки подключений от
commander-agentи реализации обратного канала взаимодействия с control plane соответствующего кластера:- Deployment (
ampg-connector-<UUID>); - Service:
ampg-connector-<UUID>;ampg-console-backend-<UUID>;ampg-api-server-<UUID>;ampg-deckhouse-tools-<UUID>;ampg-aggregating-proxy-<UUID>;ampg-upmeter-<UUID>;ampg-label-proxy-<UUID>;
- Secret (
ampg-console-backend-<UUID>); - Ingress (
ampg-agent-api-connector-<UUID>,ampg-console-backend-<UUID>);
- Deployment (
- DexClient (
cluster-<UUID>) — настройка сервиса аутентификации для управляемого кластера с использованием возможностей модуляuser-authn.
Во время бутстрапа кластера cluster-manager также выполняет следующие действия в управляемом кластере:
- устанавливает модуль
commander-agent; - отключает модуль
terraform-manager; - выполняет настройку аутентификации на основе контроллера Dex модуля
user-authn. В качестве Dex-провайдера cluster-manager устанавливает DexClientcluster-<UUID>управляющего кластера; - настраивает подключение управляемого кластера к хранилищу образов;
- если биллинг включён, создаёт кастомный ресурс PrometheusRemoteWrite для отправки метрик в компонент billing-prometheus управляющего кластера.
Состоит из следующих контейнеров:
- wait-postgres — init-контейнер, проверяющий доступность экземпляра PostgreSQL;
- wait-migrations — init-контейнер, ожидающий выполнения всех миграций в базе данных;
- cluster-manager — основной контейнер;
- kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищенного доступа к основному контейнеру.
- Deployment и Secret с именем
-
Dhctl-<REGISTRY_HASH>-<VERSION> (Deployment) — компонент, состоящий из одного контейнера dhctl, запускает утилиту dhctl в режиме gRPC-сервера. Cluster-manager выполняет RPC-вызовы к серверу
dhctlдля установки или настройки управляемого кластера DP. -
Ampg-connector-<UUID> (Deployment) — компонент, состоящий из одного контейнера main. Создаёт туннель и позволяет проксировать запросы к control plane управляемого кластера DP через входящее подключение от
commander-agent.Компонент создаётся cluster-manager для каждого управляемого кластера DP.
-
Cluster-checker (Deployment) — компонент периодически выполняет запуск задач по проверке кластеров.
Состоит из следующих контейнеров:
- wait-postgres — init-контейнер, проверяющий доступность экземпляра PostgreSQL;
- wait-migrations — init-контейнер, ожидающий выполнения всех миграций в базе данных;
- backend — основной контейнер.
-
Cluster-task-checker (Deployment) — компонент периодически выполняет поиск запущенных задач, которые давно не сообщали о своём статусе, и переводит их в статус
lostилиlost_in_critical.Состоит из следующих контейнеров:
- wait-postgres — init-контейнер, проверяющий доступность экземпляра PostgreSQL;
- wait-migrations — init-контейнер, ожидающий выполнения всех миграций в базе данных;
- backend — основной контейнер.
-
Redis (Deployment) — компонент состоит из одного контейнера redis и реализует отдельный экземпляр базы данных Redis, отвечающий за хранение данных об очередях задач и состояниях сессий commander.
-
Console-frontend (Deployment) — предоставляет веб-интерфейс администрирования управляемого кластера DP.
Состоит из следующих контейнеров:
- wait-postgres — init-контейнер, проверяющий доступность экземпляра PostgreSQL;
- wait-migrations — init-контейнер, ожидающий выполнения всех миграций в базе данных;
- nginx — основной контейнер.
-
Console-backend (Deployment) — API-бэкенд администрирования управляемого кластера DP, обслуживающий запросы от компонента cluster-manager.
Console-backend использует ресурсы Secret и Service, создаваемые компонентом cluster-manager, для подключения к control plane управляемого кластера DP.
Состоит из следующих контейнеров:
- wait-postgres — init-контейнер, проверяющий доступность экземпляра PostgreSQL;
- wait-migrations — init-контейнер, ожидающий выполнения всех миграций в базе данных;
- backend — основной контейнер.
Служебные компоненты
В служебные компоненты модуля commander входят:
-
Cluster-task-cleaner (CronJob) — компонент запускается один раз в сутки и выполняет удаление завершённых задач, созданных более 30 дней назад.
Состоит из следующих контейнеров:
- wait-postgres — init-контейнер, проверяющий доступность экземпляра PostgreSQL;
- wait-migrations — init-контейнер, ожидающий выполнения всех миграций в базе данных;
- cluster-task-cleaner — основной контейнер.
-
Agent-tokens-rotation (CronJob) — регулярно выполняет обновление токенов для
commander-agent.Состоит из следующих контейнеров:
- wait-postgres — init-контейнер, проверяющий доступность экземпляра PostgreSQL;
- wait-migrations — init-контейнер, ожидающий выполнения всех миграций в базе данных;
- agent-tokens-rotation — основной контейнер.
-
Encryption-migrator (CronJob) — компонент запускается один раз в сутки и выполняет миграцию зашифрованных данных с SHA-1 на SHA-256. За один проход могут быть обработаны не все данные. Кроме того, после восстановления из резервной копии или из-за отложенных миграций могут появиться записи SHA-1.
Состоит из следующих контейнеров:
- wait-postgres — init-контейнер, проверяющий доступность экземпляра PostgreSQL;
- wait-migrations — init-контейнер, ожидающий выполнения всех миграций в базе данных;
- encryption-migrator — основной контейнер.
-
Audits-cleaner (CronJob) — компонент запускается один раз в сутки и удаляет старые аудит-логи.
Deckhouse-контроллер модуля
deckhouseсоздаёт audits-cleaner, если параметр модуляsettings.featureFlags.auditsRetentionDaysзадан и определяет срок хранения аудит-логов.Состоит из следующих контейнеров:
- wait-postgres — init-контейнер, проверяющий доступность экземпляра PostgreSQL;
- wait-migrations — init-контейнер, ожидающий выполнения всех миграций в базе данных;
- audits-cleaner — основной контейнер.
Опциональные компоненты
В опциональные компоненты модуля commander входят:
-
Billing-prometheus (StatefulSet) — компонент запускает Deckhouse Prom++ в режиме приёма метрик по протоколу Prometheus Remote Write.
Модуль
prometheus, установленный в управляемом кластере DP, отправляет метрики. Компонент хранит историю потребления ресурсов всеми управляемыми кластерами, что является важным источником данных для формирования отчётов по биллингу.Состоит из следующих контейнеров:
- prometheus — основной контейнер;
- kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищенного доступа к основному контейнеру.
-
Billing-reports (StatefulSet) — компонент, запускающий веб-сервер nginx в качестве хранилища отчётов биллинга. Отчёты загружаются в nginx по протоколу Web-based Distributed Authoring and Versioning (WebDAV).
Состоит из следующих контейнеров:
- nginx — основной контейнер;
- kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищенного доступа к основному контейнеру.
-
Billing-schedules-reporter (Deployment) — компонент реализует планировщик запуска и контроля задач для генерации требуемых отчётов биллинга.
Компонент billing-schedules-reporter сохраняет сформированный отчёт в компоненте billing-reports по протоколу WebDAV.
Состоит из следующих контейнеров:
- wait-postgres — init-контейнер, проверяющий доступность экземпляра PostgreSQL;
- wait-migrations — init-контейнер, ожидающий выполнения всех миграций в базе данных;
- backend — основной контейнер.
-
Billing-aggregating-proxy (Deployment) — компонент выполняет агрегацию PromQL-запросов, проксирует их в billing-prometheus и возвращает результаты запросов.
Состоит из следующих контейнеров:
- billing-aggregating-proxy — сайдкар-контейнер, реализованный на базе Grafana Mimir, который обеспечивает оптимизацию запросов и кеширование данных. При отсутствии данных в кеше Grafana Mimir пересылает запрос на компонент billing-prometheus через сайдкар-контейнер promxy;
- promxy — сайдкар-контейнер, реализованный на базе Promxy, который проксирует запросы к компоненту billing-prometheus и предоставляет единый эндпоинт для доступа к данным нескольких экземпляров Deckhouse Prom++;
- kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищенного доступа к основному контейнеру.
Компоненты billing-prometheus, billing-reports, billing-schedules-reporter и billing-aggregating-proxy создаются Deckhouse-контроллером модуля deckhouse в случае, если в параметре модуля settings.featureFlags.billingEnabled задано значение true.
Взаимодействия модуля
Модуль взаимодействует со следующими компонентами:
-
Kube-apiserver:
-
работа с ресурсами Deployment, Service, Secret и Ingress в неймспейсе
d8-commander; -
авторизация запросов.
-
-
Хранилище образов — получение доступных релизов DP по каналам обновлений.
-
Экземпляр PostgreSQL — долговременное хранение состояния и метаданных кластеров, задач, токенов, проектов, параметров биллинга и отчётов.
-
Управляемый кластер — создание, изменение или удаление кластера DP.
С модулем взаимодействуют следующие внешние компоненты:
-
Controller-nginx — пересылка внешних запросов к эндпоинтам компонентов модуля.
-
Prometheus-main — сбор метрик с компонентов модуля.
Модуль commander-agent
Модуль commander-agent реализует служебное подключение к управляющему кластеру DP.
Подробнее с описанием настроек модуля можно ознакомиться в разделе документации модуля.
Архитектура модуля commander-agent
Архитектура модуля commander-agent на уровне 2 модели C4 и его взаимодействие с другими компонентами DP изображены на следующей диаграмме:
Компоненты модуля commander-agent
Модуль состоит из одного компонента agent и одного контейнера commander-agent.
Agent выполняет следующие действия:
- приводит конфигурацию управляемого кластера в соответствие с целевой конфигурацией, полученной от backend модуля
commander; - собирает метрики управляемого кластера:
CPU cores— количество ядер узлов;Memory— общий объём памяти узлов, ГиБ;Filesystem— общий объём корневых дисков на узлах, ГиБ;PVC— общий объём подключаемых дисков, ГиБ;Nodes— общее количество узлов;
- собирает информацию о доступности кластера;
- устанавливает защищённое подключение к управляющему кластеру DP;
- отправляет метрики и информацию о доступности кластера в управляющий кластер DP;
- настраивает аутентификацию пользователей через Dex-провайдер управляющего кластера;
- если в управляющем кластере включён биллинг, agent создаёт кастомный ресурс PrometheusRemoteWrite для отправки метрик в сервис биллинга управляющего кластера DP.
Взаимодействия модуля
Модуль взаимодействует со следующими компонентами:
-
Kube-apiserver — управление ресурсами управляемого кластера.
-
Prometheus — получение метрик управляемого кластера.
-
Upmeter — получение информации о доступности управляемого кластера.
-
Dex — синхронизация токенов доступа для запросов в API Kubernetes API из управляющего кластера в управляемый.
-
Управляющий кластер:
- организация проксирующего подключения к управляющему кластеру;
- получение целевой конфигурации кластера;
- отправка метрик в сервис биллинга.