Модуль управления сервисами (shturval-services)

О сервисе

Параметр Значение
Название в интерфейсе Модуль управления сервисами
Системное название (идентификатор) shturval-services
Назначение в кластере Оркестрация установки и обновления платформенных сервисов: реагирует на ShturvalServiceConfig (SSC) и ShturvalServicePatch (SSP), разворачивает и обновляет Helm-релизы. Не предназначен для развёртывания пользовательских приложений (для этого используется ArgoCD, shturval-cd).
Критический Да
Публичный репозиторий — (компонент платформы «Штурвал», на базе Helm и Flux)
Зависимости shturval-services-crds, shturval-networking
Неймспейс shturval-services-system

Содержание

  1. Обзор
  2. Архитектура
  3. Установка / развёртывание
  4. Диагностика
  5. Жизненный цикл
  6. Параметры оператора
  7. Справочник CRD/API

1. Обзор

Назначение: оператор автоматизирует установку, обновление, откат и удаление Helm-чартов в кластере по объектам ShturvalRepoConfig, ShturvalServiceConfig и ShturvalServicePatch. Область ответственности — регистрация Helm-репозиториев в runtime-движке Helm внутри Pod’а оператора, согласование релизов (install / upgrade / rollback / uninstall), проверка дрейфа манифестов и здоровья ресурсов, помеченных как управляемые Helm.

Функции

Компонент Назначение Заметки для эксплуатации
Регистрация репозиториев (ShturvalRepoConfig) Добавление/удаление записей Helm-репозитория в runtime Операции с файлом репозиториев в Pod’е сериализованы (мьютекс), согласование идемпотентно
Согласование сервисов (ShturvalServiceConfig) Install/upgrade/rollback/uninstall релиза, режимы auto / manual / absent, дрейф и health Зависимости между SSC, обработка «зависших» релизов, финалайзеры
Патчи (ShturvalServicePatch) Переопределение mode и customValues поверх SSC Связь с SSC через ownerReference; порядок по patchOrder
Mutating webhook для ShturvalServiceConfig Синхронизация spec.serviceclass в метку shturval.tech/class Требуется рабочий TLS для webhook
Validating webhook для ShturvalServiceConfig Зарезервировано Логика валидации не реализована (заглушка)
Подсистема проверки здоровья (GitOpsEngine) Проверка здоровья и дрейфа ресурсов релиза Учитываются объекты с меткой app.kubernetes.io/managed-by

Сценарии инициации

Что происходит Кто инициирует Наблюдаемый эффект
Согласование репозитория Плоскость управления (события ShturvalRepoConfig) Обновление status, регистрация репозитория в движке Helm в Pod’е
Согласование сервиса Плоскость управления (события ShturvalServiceConfig и связанных SSP) Изменение Helm-релиза в целевом namespace, обновление условий и status
Согласование патча Плоскость управления (события SSP и изменения appliedPatches у SSC) OwnerReference, лейблы, условия Accepted / Applied
Mutating webhook API-сервер при Create/Update ShturvalServiceConfig Установка/актуализация лейбла класса сервиса
Validating webhook API-сервер при Create/Update ShturvalServiceConfig Без подтверждённой бизнес-логики валидации
Фоновая проверка здоровья Запуск процесса оператора Готовность движка к проверкам drift/health

Ограничения и следствия

Ограничение Следствие
TLS для webhooks ожидается через cert-manager Без настроенного механизма выдачи сертификатов webhook’и не введутся в рабочее состояние
ShturvalServiceConfig с именем shturval-services обрабатывается с write-lock и задержкой 1 минута после разблокировки При изменении такого SSC остальные согласования SSC могут ожидать до ~1 минуты
spec.iscritical: true запрещает удаление в режиме absent Перед снятием релиза необходимо снять критичность в спецификации
Клиентская TLS-аутентификация для Helm-репозитория (поля вроде cert/key/ca для репо) не поддержана в API Аутентификация — по учётным данным и флагу insecure в рамках описанного ShturvalRepoConfig
MaxHistory в Helm-логике фиксирован (значение 2 в поставке оператора) Для откатов доступно ограниченное число ревизий; изменение требует новой версии образа
Validating webhook для SSC — без реализованной валидации Ошибки в spec SSC на уровне admission не отлавливаются этим webhook’ом
Метрики по умолчанию отключены (--metrics-bind-address=0) Сбор метрик с процесса потребует явной настройки в манифесте развёртывания
HTTP/2 по умолчанию отключён для серверов метрик и webhook Поведение при интеграции с внешними прокси — учитывать настройки

Место в цепочке управления

Схема ниже — цепочка Helm-репозиторий / CRD / оператор / Helm-релиз и точки, где вмешиваются webhook и согласование (объекты ShturvalServiceConfig и ShturvalServicePatch в API Kubernetes, релизы и ресурсы в data plane).

Иллюстрация: Место в цепочке управления

Цепочка управления: репозиторий, релиз, патч, вебхуки

Ключевые характеристики

Характеристика Значение
API Group ops.shturval.tech
Версии API v1beta1 (spoke), v1beta2 (hub, storage)
Типовой namespace развёртывания (Kustomize / Helm) shturval-services-system
Leader election По умолчанию выключена
Метрики По умолчанию отключены
Webhook Mutating + Validating для ShturvalServiceConfig (v1beta2); в поставке также предусмотрен шаблон для RepoConfig
Параллельность согласования SSC До 5 одновременных reconciles (значение из поставки контроллера)
Поведение при панике в контроллере SSC Включён recover panic

Компоненты в кластере

Компонент Тип Kubernetes Scope Назначение
ShturvalRepoConfig CRD Cluster Helm-репозиторий (URL, учётные данные)
ShturvalServiceConfig CRD Cluster Параметры одного Helm-релиза
ShturvalServicePatch CRD Cluster Патч mode/customValues для выбранного SSC
Pod оператора Deployment Namespaced Процесс в типовом namespace shturval-services-system
MutatingWebhook (SSC) MutatingWebhookConfiguration Cluster Синхронизация класса в лейбл
ValidatingWebhook (SSC) ValidatingWebhookConfiguration Cluster Без бизнес-логики валидации

2. Архитектура

Поставка Helm (имена из Chart.yaml)

Модуль поставляется двумя отдельными Helm-чартами (не путать с CRD ShturvalServiceConfig / «SSC» в API):

Имя чарта (Helm name) Каталог в исходниках Назначение
shturval-services-crds helm/crds Установка CRD (ShturvalRepoConfig, ShturvalServiceConfig, ShturvalServicePatch)
shturval-services helm/main Развёртывание оператора: Deployment, RBAC, webhook, сервисы

Включение и жизненный цикл контроллера в кластере обеспечивает cluster-manager (сервис платформы); объекты ShturvalServiceConfig (SSC) для связанных чартов создаются и сопровождаются как часть платформенной конфигурации, а не как произвольная ручная установка Helm-чарта администратором.

Роль оператора

Оператор разворачивается как один Deployment в namespace платформенных сервисов. Внутри Pod’а хранятся репозиторный файл и кеш Helm (пути задаются аргументами процесса, типово каталог в образе). Контроллеры обращаются к Kubernetes API и к движку Helm; подсистема health/drift использует gitops-engine и отслеживает объекты с меткой app.kubernetes.io/managed-by.

Компоненты рабочей нагрузки

Элемент Описание
Контейнер оператора Бинарь shturval-operator, пробы health/readiness на адресе, заданном флагом (типово :8081)
Роли и привязки ClusterRole/Binding для работы с CRD и кластерными операциями согласно поставляемым манифестам
Webhook Service и TLS (через cert-manager в типовой поставке) для mutating/validating
cert-manager Ожидается в кластере для выдачи сертификатов webhook (см. ограничения)

Обратите внимание! без описанного механизма TLS для webhook развёртывание в продакшене с включёнными webhook’ами не будет соответствовать ожидаемой конфигурации.

Связь с внешними системами

Система / объект Роль
HTTP(S) Helm-репозитории Источник чартов по ShturvalRepoConfig
API Kubernetes Объекты CRD, Secret’ы, Namespace, отслеживаемые ресурсы релизов
Сторонние чарты в целевых namespace Разворачиваются Helm’ом согласно ShturvalServiceConfig

Диаграммы

Развёртывание оператора (контроллеры, webhook, движок Helm, health checker в Pod’е; доступ к API кластера и внешним Helm-репозиториям).

Архитектура развёртывания

Связи CRD и сопутствующих объектов (репозиторий, конфигурация сервиса, патч, Helm release, ссылки spec.dependency / reponame и т.д.).

Иллюстрация: Диаграммы

CRD и связи ресурсов


3. Установка / развёртывание

Зависимости среды

  • cert-manager версии 1.x или выше в кластере — для TLS webhook оператора (см. Ограничения).

Порядок поставки Helm

Поставка разделена на два чарта с фиксированными именами в Chart.yaml (см. §2):

  1. shturval-services-crds — CRD;
  2. shturval-services — оператор (контроллеры, webhook) в namespace shturval-services-system.

Имена Helm release и URL репозитория чартов задаются в вашем контуре поставки платформы.

Параметры чарта (обобщение из технического описания)

В типовом values основного чарта (без ссылки на внутренние пути) по умолчанию предусматриваются, в частности:

Параметр (логически) Смысл
replicaCount Число реплик Deployment (типово 1)
tolerations / affinity Сходимость с узлами инфраструктуры / control-plane (шаблон под конкретный кластер)

Обратите внимание! пользовательские правки values в эксплуатации под платформой Штурвал согласуются с политикой поставки; для настраиваемых оверлей-значений используйте ShturvalServicePatch (SSP) там, где это применимо к сервису, которым доставляется оператор.

Проверка после развёртывания (без жёстких команд)

Убедитесь, что Pod оператора в целевом namespace перешёл в Ready, CRD зарегистрированы, объекты Mutating/ValidatingWebhookConfiguration ссылаются на работающий Service и сертификаты (при согласованной схеме с cert-manager). Конкретные команды kubectl в техническом руководстве не приведены; используйте стандартные процедуры вашей среды.


4. Диагностика

Условия: ShturvalRepoConfig

Condition При True При False / причины
Install Репозиторий добавлен в движок Ошибка при добавлении/обновлении репозитория
Sync Репозиторий синхронизирован ErrorCheckHelmRepo, ErrorRemoveHelmRepo
Uninstall Для сценария удаления — через финалайзер, отдельная логика

Условия: ShturvalServiceConfig

Condition При True При False / причины
Install Релиз установлен, версия соответствует spec RuntimeRepositoryNotReady, RepositoryNotUpdated, WaitingInstallDependency, ErrConvertParams, ErrCheckSscStatus, ErrorInstallService, ErrorUpdateService, ErrorRollbackService, ReleasePending, ReleaseRollback
Sync Нет дрейфа values и манифестов GitOpsEngineNotReady, ErrorRenderManifests, ErrorCheckValuesDrift, ErrorCheckDrift, ErrorUpdateService, ReleasePending, ErrGetPendingTime
Healthy Управляемые ресурсы здоровы ErrorCheckServiceHealth, ErrorServiceNotHealthy
Uninstall Релиз удалён (когда сценарий — удаление) ServiceIsCritical, WaitingUninstallDependency, ServiceUninstalling, ErrRemoveService, ErrorRemoveService, ErrorConvertParams, ErrorCheckSscStatus
Patch Патчи применены PatchFailed
UpdateNamespace Метки namespace обновлены GetNamespaceFailed, UpdateNamespaceFailed

Условия: ShturvalServicePatch

Condition При True При False / причины
Accepted SSC найден, ownerReference установлен SSCNotFound
Applied Имя SSP в ssc.status.appliedPatches NotAppliedYet

Типичные симптомы

Симптом Возможная причина Действие
Webhook не готов, ошибки при создании SSC Нет cert-manager / сертификатов, неверные пути к TLS Проверить схему cert-manager и статус Certificate
RepositoryNotUpdated / репо не готово ShturvalRepoConfig не в Sync / нет регистрации Проверить ShturvalRepoConfig и сетевой доступ к Helm-репо
Долгая блокировка при изменениях Изменяется SSC с именем shturval-services Планировать окна; учитывать задержку до ~1 минуты
Нельзя снять релиз (absent) iscritical: true Снять флаг в spec
ServiceIsCritical при удалении См. выше Снять критичность
ReleasePending / откат Релиз «висел» в pending дольше порога (в поставке — 5 минут) Анализ событий Helm, логи оператора; при необходимости ручной разбор внешнего релиза
Нет валидации на admission Validating webhook — заглушка Доп. проверки spec до применения (политика организации)

5. Жизненный цикл

Сквозной сценарий (E2E)

Последовательность: репозиторий → ShturvalServiceConfig / патчи → согласование и состояния релиза. Полезна для понимания порядка шагов при разборе задержек и conditions.

Иллюстрация: Сквозной сценарий (E2E)

Сквозной сценарий E2E

ShturvalRepoConfig

  • Назначение (ресурсы K8s): cluster-scoped CRD, описывающий один логический Helm-репозиторий для движка в Pod’е.
  • Создание/обновление: из spec формируется запись; при успехе status.ready, условия Install/Sync, добавляется финалайзер ops.shturval.tech/finalizer.
  • Удаление: репозиторий удаляется из движка, финалайзер снимается. (см. скриншот ниже)

Схема согласования (создание/обновление, удаление, ключевые ветки и статус status.ready).

Иллюстрация: ShturvalRepoConfig

Согласование ShturvalRepoConfig

ShturvalServiceConfig

  • Назначение: один объект описывает один Helm-релиз в spec.namespace с заданным именем чарта, версией, репозиторием и режимом.

Режимы (spec.mode):

Режим Поведение
auto Install → обнаружение дрейфа → синхронизация → health; при смене версии — принудительный upgrade
manual Оператор не изменяет релиз; status.ready без проверок
absent Uninstall, если iscritical не мешает
  • Создание/обновление (auto, обобщение): проверка репозитория; при необходимости обновление кеша; ожидание готовностей dependency / dependencyclass; анализ состояния релиза; install/update; ожидание готовности движка health/drift; проверка дрейфа и health с возможными upgrade/requeue; проставление лейбла shturval.tech/system-namespace на namespace из spec.
  • Self-update / SSC с именем shturval-services: для этого имени применяется write-lock к области блокировок и задержка 1 минута после снятия lock — планируйте пики нагрузки и окна изменений.
  • Удаление: при iscritical — согласование останавливается с ServiceIsCritical; иначе ожидается отсутствие зависимых SSC, затем удаление релиза и снятие финалайзера ops.shturval.tech/finalizer.

Схема согласования (обзор): ветвление по spec.mode, движок Helm, health/drift, условия в status.

Согласование ShturvalServiceConfig — обзор

Схема согласования в режиме auto: репозиторий, зависимости, install/update, дрейф, откат при «зависании» релиза, повторы.

Согласование ShturvalServiceConfig — режим auto

Интервалы повторов (ориентиры из логики согласования): добавление финалайзера — порядка секунды; репо не готово — порядка 5 с; движок health не готов / сервис нездоров — порядка 1 мин; зависимости — повтор; успешное завершение без requeue.

ShturvalServicePatch

  • Назначение: переопределить mode и/или customValues у выбранного имени ShturvalServiceConfig без прямого редактирования самого SSC.
  • Создание/обновление: фиксация observedGeneration, проверка существования SSC, установка ownerReference, лейбл ops.shturval.tech/ssc → имя SSC; сопоставление с status.appliedPatches у SSC.
  • Слияние customValues (правила): ключ с префиксом - удаляет соответствующий ключ из базы; вложенные map мержатся рекурсивно; скаляры заменяются значением из патча.
  • Удаление: отдельного финалайзера у SSP нет; при удалении родительского SSC дочерние объекты с ownerReference утилизируются по правилам GC. Контроллер SSP не обрабатывает Delete самого SSC (appliedPatches predicate).
  • Координация SSC ↔ SSP (шаги):
Шаг Ресурс / сигнал Действие (смысловой)
1 ShturvalServicePatch Проверка целевого SSC, выставление Accepted
2 SSP + SSC OwnerReference и лейбл связи
3 ShturvalServiceConfig (согласование) Применение патчей, обновление appliedPatches
4 SSP Applied по факту попадания имени в ssc.status.appliedPatches

Схема согласования SSP: поиск SSC, Accepted / Applied, ownerReference, сопоставление с status.appliedPatches у ShturvalServiceConfig (см. скриншот ниже).

Согласование ShturvalServicePatch


6. Параметры оператора

Перечислены параметры процесса, явно описанные в техническом руководстве. На практике они задаются аргументами контейнера и, при необходимости, переменными окружения в манифесте/Helm-значениях поставки. Любые изменения values для чарта, которым доставляется оператор, в среде платформы Штурвал выполняйте через ShturvalServicePatch, если это относится к соответствующему ShturvalServiceConfig.

Параметр По умолчанию (из руководства) Смысл
--metrics-bind-address 0 0 — метрики отключены; иначе адрес/порт
--health-probe-bind-address :8081 Прослушивание health/readiness
--leader-elect false Leader election
--metrics-secure true HTTPS для метрик (если включены)
--enable-http2 false HTTP/2 для серверов метрик и webhook
--webhook-cert-path пусто Каталог TLS для webhook
--webhook-cert-name tls.crt Имя файла сертификата
--webhook-cert-key tls.key Имя файла ключа
--metrics-cert-path пусто Каталог TLS для сервера метрик
--metrics-cert-name tls.crt Имя сертификата метрик
--metrics-cert-key tls.key Имя ключа метрик
--repo-config /helm Каталог с repositories.yaml
--repo-cache /helm Кеш репозиториев
--helm-timeout 5m Тайм-аут операций Helm
ENABLE_WEBHOOKS (не задана — webhook включены) false — отключение регистрации webhook (например среда без TLS)

Ограничения, не выведенные в пользовательский Helm chart: MaxHistory=2 для релизов, пороги ожидания pending-релиза, длительности wait для install/uninstall, фиксированные задержки self-update — заданы в образе поставляемой версии; для изменения требуется новая версия образа/оператора.


7. Справочник CRD/API

Группа API: ops.shturval.tech. Storage-версия: v1beta2. Spoke: v1beta1 (конверсия).

7.1 ShturvalRepoConfig — Cluster

Short name: (не задан в выдержке; Kind — ShturvalRepoConfig.) Scope: Cluster.

Без зарегистрированного и готового репозитория не обслуживаются ShturvalServiceConfig, ссылающиеся на это имя.

spec

Поле Тип Обязательность Описание
url string Да URL Helm-репозитория
username string Нет Логин
password string Нет Пароль
insecure bool Нет Пропуск проверки TLS сертификата

Важно: поля TLS клиента для репозитория в API недоступны (закомментированы/не используются) — mTLS/клиентские сертификаты не поддерживаются без изменения продукта.

status

Поле Тип Описание
ready bool true при успешной регистрации
conditions массив Condition Состояние

Conditions

Condition True False / причины
Install Репозиторий добавлен Ошибка при RepoAddOrUpdate
Sync Синхронизирован ErrorCheckHelmRepo, ErrorRemoveHelmRepo
Uninstall (актуально в потоке удаления через finalizer)

7.2 ShturvalServiceConfig — Cluster (shortName: ssc)

Один объект — один Helm-релиз в spec.namespace.

spec

Поле Тип Обязательность Описание
mode enum: auto / manual / absent Да Режим; по умолчанию auto
chart string Да Имя чарта (шаблон имени из CRD)
version string Нет Версия чарта
namespace string Да Namespace установки
reponame string Да Имя ShturvalRepoConfig
dependency []string Нет Имена SSC-зависимостей
dependencyclass []string Нет Классы SSC (достаточно одного Ready SSC с лейблом shturval.tech/class)
serviceclass string Нет Класс сервиса; webhook копирует в лейбл shturval.tech/class
extraargs map[string]string Нет Доп. аргументы Helm
customvalues map[string]interface{} Нет Значения Helm (без жёсткой схемы)
iscritical bool Нет Если true, удаление через absent запрещено

status

Поле Тип Описание
ready bool Общая готовность
currentMode enum Фактический режим
currentVersion string Установленная версия
conditions массив Condition Состояние
appliedCustomValues map Итоговые values после патчей
appliedMode enum Режим после патчей
appliedPatches []string Имена применённых ShturvalServicePatch

Conditions

См. §4. Диагностика.


7.3 ShturvalServicePatch — Cluster (shortName: ssp)

Патч для mode и/или customValues у указанного SSC.

spec

Поле Тип Обязательность Описание
shturvalServiceConfigName string Да Имя целевого ShturvalServiceConfig
patchOrder *int Нет Порядок (меньше — раньше; nil трактуется как 0)
mode enum Нет Переопределяет spec.mode SSC
customvalues map[string]interface{} Нет Рекурсивный merge поверх spec.customvalues SSC

status

Поле Тип Описание
observedGeneration int64 Последнее обработанное поколение
conditions массив Condition Состояние

Conditions

См. §4. Диагностика.


Финалайзер (все перечисленные CRD согласно логике): ops.shturval.tech/finalizer (для SSP отдельный финалайзер не требуется — см. §5).