# Console ↔ fission-src multitenant: compatibility check (2026-05-15) ## Что изменилось в fission-src (feature/multitenant) | Изменение | Файл | |---|---| | Удалён старый partial RBAC | `deploy/executor-ns-watcher-rbac.yaml` | | Добавлен полный RBAC для NSWatcher | `deploy/multitenant/rbac.yaml` | | Добавлен `EnsureNamespaceSA` | `pkg/utils/serviceaccount.go` | | NSWatcher вызывает `EnsureNamespaceSA` при обнаружении NS с `fission.io/managed=true` | `pkg/executor/multitenant/ns_watcher.go` | | Добавлен тест NSWatcher с fake k8s | `pkg/utils/namespace_manager_test.go` | --- ## Что делает консоль при создании namespace `SetupFissionNamespace` в `console/internal/fission/namespace.go`: 1. Создаёт Namespace с лейблами: - `managed-by=fission-console` - `fission.io/managed=true` ← триггер для NSWatcher 2. Создаёт ServiceAccounts: `fission-fetcher`, `fission-builder` 3. Создаёт RoleBindings с `cluster-admin` ClusterRole для всех Fission SA: - `fission-executor`, `fission-router`, `fission-buildermgr`, `fission-kubewatcher`, `fission-timer` - `fission-fetcher` (из fission NS + локально в user NS) - `fission-builder` (из fission NS + локально в user NS) --- ## Взаимодействие с EnsureNamespaceSA `EnsureNamespaceSA` вызывается NSWatcher **после** того как консоль создала NS. Логика (в `setupSAAndRoleBindings`): 1. Создаёт/получает SA `fission-fetcher` → SA уже существует → `IsAlreadyExists` → OK 2. Для каждого permission из `fetcherCheck` вызывает `checkPermission` через `localsubjectaccessreviews` 3. Поскольку у `fission-fetcher` уже есть `cluster-admin` RoleBinding (создан консолью) → **все проверки возвращают `exists=true`** → `rules` остаётся пустым → Role и RoleBinding **не создаются** **Итог: EnsureNamespaceSA является no-op если консоль уже настроила namespace. Никаких конфликтов.** --- ## Что нужно на кластере Для работы NSWatcher нужен `deploy/multitenant/rbac.yaml` применён **один раз**: ```bash kubectl apply -f ~/terra/fission-src/deploy/multitenant/rbac.yaml ``` Это даёт: - `fission-executor` → `list/watch namespaces` (NSWatcher) - `fission-router` → `list/watch namespaces` (NSWatcher) - `fission-executor` → `create SA/Role/RoleBinding` в user NS (`fission-executor-sa-provisioner`) Без этого RBAC `EnsureNamespaceSA` будет падать с Forbidden, но **консоль продолжит работать** — она создаёт SA/RoleBindings сама и не зависит от NSWatcher. --- ## Вердикт | Сценарий | Статус | |---|---| | Новый NS создаётся через консоль | ✅ работает как раньше | | NSWatcher обнаруживает NS по `fission.io/managed=true` | ✅ совместимо | | `EnsureNamespaceSA` вызывается в уже настроенном NS | ✅ no-op, нет конфликтов | | Старый NS (без нового fission-bundle) | ✅ консоль не зависит от NSWatcher | | Сборка консоли (`go build ./...`) | ✅ BUILD OK | **Код консоли менять не нужно.** Нужно только применить `deploy/multitenant/rbac.yaml` при деплое нового fission-bundle.