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

3. Установка / развёртывание
Зависимости среды
- cert-manager версии 1.x или выше в кластере — для TLS webhook оператора (см. Ограничения).
Порядок поставки Helm
Поставка разделена на два чарта с фиксированными именами в Chart.yaml (см. §2):
- shturval-services-crds — CRD;
- 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)

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

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

Интервалы повторов (ориентиры из логики согласования): добавление финалайзера — порядка секунды; репо не готово — порядка 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 (
appliedPatchespredicate). - Координация 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 (см. скриншот ниже).

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).