Оператор согласования прав (permissions operator)

Компонент развёртывается как stp-controller в составе Helm chart shturval-backend. Отдельного Helm chart только для оператора прав нет: вместе с ним в chart входят backend API, Envoy, OPA и Swagger UI.

Содержание

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

1. Обзор

Назначение: оператор согласует объекты Permission, Scope, UserRole, GroupRole, Tenant с фактическими правами: агрегирующие и клиентские ClusterRole, привязки субъектов через плагины (RBAC, Argo CD, Kubeflow, tenant), дочерние области для тенантов и in-memory модель для политик. HTTP endpoint /bundle (типовой порт 8082) отдаёт данные для OPA; при включённых webhook выполняется валидация UserRole, GroupRole, Tenant.

Функции

КонтурНазначение в эксплуатации
Области (Scope)Вычисление путей, аннотаций кластеров, списка имён Permission, статусов привязанных объектов
Кастомные роли (Permission)Агрегирующий ClusterRole на платформе и ClusterRole в клиентских кластерах по granted_cluster_rules (через kubeconfig из Secret на платформе)
Привязки (UserRole, GroupRole)Плагины применяют права субъекта в области; идемпотентность отражается в статусах плагинов
Тенант (Tenant)Создание/обновление дочернего Scope, платформенные Role для прав tenant-get / tenant-edit
AdmissionВалидация UserRole, GroupRole, Tenant при включённых webhook
Bundle HTTPВыдача revision OPA-bundle; периодическая пересборка по интервалу (по умолчанию 60 с)

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

Что происходитКто инициируетНаблюдаемый эффект
Согласование CRПлоскость управления Kubernetes (события CR, relist, watch)Обновление связанных ClusterRole, статусов, аннотаций, модели для bundle
Валидация привязокAPI-сервер при Update UserRole / GroupRoleОтклонение недопустимых изменений ключевых полей spec
Валидация тенантаAPI-сервер при Create/Update Tenant по пути webhookОтклонение недопустимых изменений
Пересборка bundleТаймер и запросы потребителей к HTTP /bundleАктуальная revision в ответе
Реакция на кластерыСобытия CAPI Cluster (готовность control plane, удаление, пауза)Повторное согласование затронутых Permission, Scope, ролей

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

ОграничениеСледствие для администратора
После создания UserRole нельзя менять spec.usernameИзменение блокируется validating webhook при Update
Удаление Permission при привязанных UserRole / GroupRoleФиналайзер не снимается до освобождения; повторная попытка с интервалом около 1 минуты
Удаление Tenant при наличии дочерних tenantsСогласование удаления завершается ошибкой до устранения иерархии
Поле open_search_roles в PermissionПомечено устаревшим (deprecated) в CRD; новые конфигурации лучше не опираться на него

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

Цепочка на высоком уровне: объекты Tenant порождают/обновляют связанный Scope; согласование Scope обновляет модель хранения и статусы (в т.ч. аннотации кластеров); UserRole / GroupRole требуют существования соответствующего Scope и выставляют ссылку владельца; Permission обновляет платформенные и клиентские ClusterRole, изменения Permission через watch влияют на дальнейшее согласование Scope.

Цепочка управления: CR, оператор, клиентские кластеры и bundle

Цепочка управления: CR, оператор, клиентские кластеры и bundle

Пользователь или CI применяет CR через Kubernetes API. API-сервер сохраняет объекты Tenant, Scope, Permission, UserRole и GroupRole, после чего permissions operator читает их, выполняет согласование и обращается к внешним контурам: плагинам RBAC, Argo CD, Kubeflow, клиентским кластерам и объектам CAPI Cluster.

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

ХарактеристикаЗначение
API grouppermissions.shturval.tech, версия v1beta1
Scope CRDNamespaced
kubectl shortNamesВ сгенерированных CRD для перечисленных видов не заданы
Namespace типовой установки (Kustomize для разработки)stp-system, префикс ресурсов stp-
Namespace процесса при установке chart в shturval-backendСовпадает с namespace Helm-релиза; в контейнер пробрасываются namespace и serviceAccountName из полей Pod
Значение namespace для StorageEngine по умолчанию в бинареshturval-backend (переопределяется переменной окружения)
Leader election IDpermissions.shturval.tech
МетрикиПараметры задаются патчами развёртывания и флагами процесса (см. §6)
WebhookПорт 9443; отключение через ENABLE_WEBHOOKS=false
HTTP/2По умолчанию отключён для TLS-серверов метрик и webhook
BundleАдрес привязки по умолчанию :8082, путь /bundle

Компоненты и контроллеры

Имя / рольНазначение
CRDpermissions, scopes, userroles, grouproles, tenants (cluster-wide определения)
Deployment менеджераОдин Pod с контейнером manager
RBACClusterRole / привязки для доступа менеджера к API
PermissionReconcilerСинхронизация Permission с ClusterRole, финалайзер, watch Cluster
ScopeReconcilerМодель области, статусы, аннотации; периодические requeue для уровней cluster/namespace
UserRoleReconciler / GroupRoleReconcilerПлагины прав в области
TenantReconcilerScope и роли тенанта; ограничения на удаление

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

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

КомпонентKindScopeОписание
CRDCustomResourceDefinitionClusterРесурсы API группы permissions.shturval.tech
МенеджерDeploymentNamespacedОдин Pod с контейнером manager
RBACClusterRole, RoleBinding и др.По манифестамДоступ оператора к нужным ресурсам API

Архитектура runtime: Deployment менеджера, RBAC, webhook, bundle

Архитектура runtime: Deployment менеджера, RBAC, webhook, bundle

Схема показывает состав процесса менеджера внутри Pod: контроллеры ресурсов, HTTP endpoint bundle на порту 8082, метрики через kube-rbac-proxy, readiness-пробу на 8081 и admission webhook для UserRole, GroupRole и Tenant. Менеджер работает с Kubernetes API, CRD группы permissions.shturval.tech, сервисным аккаунтом, CAPI-кластерами и потребителями OPA bundle.

Граф связей CR и движка хранения прав

Граф связей CR и движка хранения прав

Диаграмма описывает, как CR связаны между собой и с in-memory StorageEngine. Tenant владеет связанным Scope и создаёт роли tenant-get / tenant-edit; UserRole и GroupRole ссылаются на Scope и имена Permission; Permission наполняет модель прав и порождает ClusterRole на платформе и в клиентских кластерах.

Связь с внешними объектами

Объект / системаРоль
CAPI ClusterОпределение клиентских кластеров и событий готовности / удаления
Secret kubeconfigИмя <имя-кластера>-kubeconfig, ключ value — ожидаемый формат для доступа к API клиентских кластеров
Потребители OPAHTTP GET (и связанная логика ожидания обновления bundle) к /bundle
Плагины интеграцийArgo CD, Kubeflow, RBAC Kubernetes, tenant — по типу прав в spec

RBAC детализируется манифестами поставки; перечень точных правил в данном документе не дублируется.


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

Платформа и Helm

Компонент входит в chart shturval-backend: Deployment stp-controller, сервис для bundle и связанные объекты задаются шаблонами chart. Отдельного Helm chart только для permissions-operator нет — используется общий chart backend.

Типовая установка на management-кластер выполняется через cluster-manager: создаются и обновляются объекты ShturvalServiceConfig (SSC) с указанием имени чарта shturval-backend, namespace shturval-backend, зависимостей от shturval-backend-crds и shturval-ingress-controller, версии chart из параметров релиза платформы и пользовательских values.

Локальная установка CRD/RBAC через Kustomize для разработки использует namespace stp-system; в эксплуатации через платформу типичен namespace релиза shturval-backend — это должно согласовываться с переменной окружения namespace процесса.

Зависимости для клиентских правил

Для Permission с granted_cluster_rules (политики в клиентских кластерах) на платформе должны существовать Secret’ы kubeconfig по соглашению имени и ключа (см. §2). Отдельные SSH-ключи к узлам в описанной цепочке getter не используются.

Настройка через SSP

Любые изменения Helm values.yaml для компонента оператора в продакшене должны подаваться через ShturvalServicePatch (SSP) поверх соответствующего SSC, без прямого редактирования релиза в обход платформенных практик.

При необходимости тонкой настройки аргументов контейнера и ресурсов сверяйте фактический chart и документацию релиза платформы для используемой версии.


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

Типовые проверки (namespace подставьте фактический для релиза, обычно shturval-backend):

  • состояние Pod’ов Deployment stp-controller;
  • события Pod’ов и логи контейнера manager при ошибках согласования или webhook;
  • доступность пробы здоровья на адресе, заданном аргументами (типово :8081);
  • для политик OPA — доступность сервиса bundle (порт 8082 в типовой конфигурации флагов).

Готовность и статусы (Ready, плагины)

РесурсПоле / конструкцияИнтерпретация
Permissionstatus.readyСводный статус применения правил
Scopestatus.ready, status.objectsStatusГотовность области и состояние объектов
UserRole, GroupRolestatus (RoleStatus)Карта permissions → кластеры/платформа → плагины → PluginObject
Tenantstatus.conditionСм. таблицу условий ниже

Статусы плагинов (PluginApplyStatus)

ЗначениеСмысл для эксплуатации
appliedПлагин успешно применён
not appliedЕщё не применён
not requiredНе требуется (например, при удалении)
undefinedСетевая или иная ошибка; записи могут очищаться при успешном проходе

Условия Tenant (status.condition)

ConditionTrueFalse / причины
TenantSynced—Ошибка создания/patch Scope, получения Scope (CreateOrPatchTenantFailed, GetScopeFailed)
TenantCreatedТенант и scope синхронизированы (Created)—
TenantRoleCreated—Ошибка создания Role tenant-get / tenant-edit
TenantDeleted—Дочерние tenants или ошибка удаления Scope/Role/родительского scope

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

СимптомВозможная причинаДействие
Permission «завис» в удаленииСуществуют UserRole/GroupRole, ссылающиеся на имя permissionУдалить или изменить привязки; ожидать повторного согласования (~1 мин)
Нет прав в клиентском кластереНет/битый kubeconfig Secret, пауза/удаление CAPI ClusterПроверить Secret <cluster>-kubeconfig, ключ value, состояние Cluster
Webhook не отвечаетНет сертификатов / неправильная конфигурация при ENABLE_WEBHOOKS включёнПроверить TLS и конфигурацию webhook; при аварийной диагностике — режим отключения webhook (см. §6)
Долгое обновление scope уровня cluster/namespaceЗадланные интервалы повторного входа в reconcileУчитывать периодичность (до ~30 мин для cluster, ~5 мин для namespace в описанной логике)
Ошибка удаления TenantДочерние tenantsСначала удалить/перенести дочерние объекты

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

Общая схема взаимодействия контуров:

ШагАкторДействие
1Согласование TenantСоздаётся или обновляется Scope с тем же именем, owner reference на Tenant
2Согласование ScopeОбновляется модель хранения и статусы; аннотации кластеров
3Согласование UserRole / GroupRoleТребуется существующий Scope; выставляется controller reference
4Согласование PermissionОбновляются кластерные роли; изменения Permission инициируют дальнейшее согласование Scope через watch

Упрощённый сквозной контур: API Kubernetes и согласование ресурсов

Упрощённый сквозной контур: API Kubernetes и согласование ресурсов

Схема показывает типовую последовательность: пользователь или CI применяет Scope, Permission и UserRole; API-сервер запускает соответствующие reconcile-проходы. ScopeReconciler обновляет статус и аннотации, PermissionReconciler создаёт или обновляет ClusterRole, а UserRoleReconciler читает Scope, выставляет owner reference, применяет плагины интеграций и обновляет статус роли.

Permission

  • Финалайзер: permissions.shturval.tech/finalizer.
  • Создание / обновление: очистка status.applied_to_clusters, запись в модель; при платформенных правилах — обновление агрегирующего ClusterRole; при клиентских — выборка кластеров и обновление ClusterRole в каждом; выставление Ready при успехе.
  • Удаление: если есть привязки ролей к данному permission — перенос повторной попытки примерно через минуту; иначе удаление платформенных и клиентских ClusterRole, снятие финалайзера.
  • События CAPI: при готовности control plane или удалении кластера — повторное согласование затронутых Permission (с фильтром по применённым кластерам).

Scope

  • Удаление: если в модели ещё есть пользователи/группы для имени scope — повтор через ~5 с; иначе удаление из модели и снятие финалайзера.
  • Обновление: пересчёт кластеров, аннотации, статусы namespace; для уровня namespace — проверки существования namespace в целевых кластерах; периодические повторы для уровней cluster (до ~30 мин) и namespace (~5 мин) при необходимости.

UserRole и GroupRole

  • Удаление: сброс статусов плагинов, вызов удаления у всех плагинов, расчёт готовности, снятие финалайзера и удаление из модели.
  • Обновление: финалайзер, привязка к Scope, обновление модели, последовательное применение плагинов; при ошибках — немедленный requeue; при успехе — очистка «неопределённых» статусов плагинов.
  • Наблюдение: изменения связанного Scope; для UserRole — также изменение Cluster.Spec.Paused.

Tenant

  • Создание / обновление: при первом добавлении финалайзера — немедленный повтор входа; генерация и применение Scope, создание ролей tenant-get / tenant-edit, регистрация в модели, условие TenantCreated.
  • Удаление: проверка отсутствия дочерних tenants; удаление Scope; пока Scope существует — повтор через ~5 с; затем удаление ролей и записей в модели, очистка родительского scope, снятие финалайзера.

Префиксы имён создаваемых ClusterRole: shturval: для пользовательских ролей, platform: для платформенных.

Диаграммы переходов при согласовании

Ниже — схемы, ориентированные на понимание состояний объекта в кластере: готовность, удаление и финалайзеры.

Согласование Permission: создание/обновление ClusterRole, удаление

Согласование <code>Permission</code>: создание/обновление <code>ClusterRole</code>, удаление

Если объект Permission отсутствует, reconcile завершается пустым результатом. Для существующего объекта оператор разделяет путь удаления и путь обновления: при удалении ждёт, пока UserRole и GroupRole перестанут ссылаться на permission, затем удаляет платформенные и клиентские ClusterRole, запись из движка и финалайзер; при обновлении добавляет финалайзер, обновляет модель, синхронизирует нужные ClusterRole и выставляет успешную готовность.

Согласование UserRole: привязка к Scope, плагины, готовность

Согласование <code>UserRole</code>: привязка к <code>Scope</code>, плагины, готовность

При обновлении UserRole оператор добавляет финалайзер, получает Scope, устанавливает controller reference, обновляет запись в движке и применяет права через плагины. Затем пересчитывается готовность: при незавершённом применении объект ставится в повторную обработку, а при успехе очищаются неопределённые результаты и reconcile завершается без повторного запуска; при удалении плагины вызываются на очистку, пересчитывается готовность удаления и снимается финалайзер.

Согласование GroupRole: симметрично UserRole

Согласование <code>GroupRole</code>: симметрично <code>UserRole</code>

Поток для GroupRole повторяет логику UserRole, но субъектом является claim группы. Оператор добавляет финалайзер, читает связанный Scope, выставляет owner reference, обновляет модель и применяет разрешения через плагины; при удалении удаляет плагиновые права, проверяет готовность очистки и только после этого снимает финалайзер.

Согласование Scope: кластеры, namespace, повторные попытки

Согласование <code>Scope</code>: кластеры, namespace, повторные попытки

Для активного Scope оператор добавляет финалайзер, фильтрует кластеры по идентификаторам и аннотациям, обновляет пути в StorageEngine, записывает в статус permissions, paths и objectsStatus, после чего выставляет готовность. Если scope уровня platform или cluster/namespace требует повторной проверки, reconcile планируется повторно с интервалами для cluster и namespace; при удалении оператор ждёт, пока в движке не останется пользователей или групп, затем удаляет scope из модели и снимает финалайзер.

Согласование Tenant: дочерний Scope, роли tenant-get / tenant-edit

Согласование <code>Tenant</code>: дочерний <code>Scope</code>, роли tenant-get / tenant-edit

При создании или обновлении Tenant оператор добавляет финалайзер, генерирует и применяет связанный Scope, создаёт роли tenant-get и tenant-edit, добавляет tenant в движок и выставляет условие TenantCreated=True. При удалении сначала проверяется отсутствие дочерних tenants; затем оператор удаляет Scope, ждёт его исчезновения, удаляет роли, удаляет tenant из модели, очищает ссылку в родительском scope и снимает финалайзер.


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

Аргументы процесса задаются флагами в точке входа. В поставке они передаются через шаблон Deployment chart и SSP; администратор может переопределять их только через согласованные с платформой механизмы, без импровизации имён:

ФлагПо умолчаниюНазначение
--metrics-bind-address0 (отключено в коде; в патче может быть 127.0.0.1:8080)Адрес метрик
--health-probe-bind-address:8081Проба здоровья
--leader-electfalseЛидер-выборы (в типовом деплое включается аргументами)
--metrics-securetrueTLS для метрик
--enable-http2falseHTTP/2
--bundle-bind-address:8082Прослушивание bundle
--bundle-path/bundleHTTP-путь bundle
--bundle-rebuild-duration60 (секунды)Период пересборки bundle
--max-reconciles5Параллельность согласований
--webhook-port9443Порт webhook
--webhook-cert-dir/tmp/k8s-webhook-server/serving-certs/Каталог сертификатов webhook

Опции логгера zap также пробрасываются через стандартный механизм флагов.

Переменные окружения

ПеременнаяНазначение
ENABLE_WEBHOOKSПри значении false отключается регистрация webhook (полезно для отладки без согласованных сертификатов)
namespaceNamespace области хранения модели (override значения по умолчанию shturval-backend)
serviceAccountNameУчётная запись для tenant webhook (по умолчанию stp-tenant-webhook)
oidcClientRefСсылка на auth client (по умолчанию shturval-backend/backend)
DEBUGПри true — режим логов разработки

Обратите внимание! при ENABLE_WEBHOOKS=false валидация на admission для перечисленных типов не выполняется на стороне оператора; использование только в контролируемых сценариях диагностики.


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

Общие сведения: group permissions.shturval.tech, version v1beta1, scope всех CR — Namespaced.

Permission

spec

ПутьТипОбязательноОписание
scope_levelstring (ScopeLevel)ДаУровень области для определения Permission
granted_cluster_rules[]PolicyRuleНетПравила RBAC для ClusterRole в клиентских кластерах
granted_platform_permissions[]stringНетИмена платформенных разрешений для агрегирующего ClusterRole
argo_cd_roles[]stringНетРоль Argo CD
kubeflow_roles[]stringНетРоль для доступа в Kubeflow
open_search_roles[]stringНетУстарело (deprecated)

status

ПутьТипОписание
applied_to_clusters[]stringКластеры, где выставлен клиентский ClusterRole
readyReadyСводный статус (ready, status, reason, message)

Отдельных условий типа metav1.Condition нет — только поле ready.

Scope

spec

ПутьОбязательноОписание
spec.objectsДаКарта уровней → имена (ScopeObjects): platform, clustergroups, clusters, namespaces, tenants, custom

status

ПутьОписание
pathsПути scope
permissionsИмена Permission, доступные на уровне scope
readyReady
objectsStatusСостояние кластеров и namespace

UserRole

spec

ПутьОбязательно
spec.scopeДа

status: RoleStatus — ready, вложенная карта permissions → кластеры/платформа → плагины → PluginObject.

GroupRole

spec

ПутьОбязательно
spec.scopeДа

status: как у UserRole.

Tenant

spec

ПутьОписание
spec.objectsScopeObjects границ тенанта
spec.parentRefРодительский tenant (name, namespace)
spec.immutableЗапрет изменений spec

status

ПутьОписание
objectsStatusКопия из связанного Scope при успешном согласовании
conditionОдна metav1.Condition (см. §4)