- Add RemoveNamespace(ctx, ns) to executortype.ExecutorType interface - Implement RemoveNamespace in poolmgr, newdeploy, container executor types - Add per-namespace context cancellation (nsCancels map) in all three types so informer factories are stopped when namespace is removed (fixes goroutine leak) - Add PoolPodController.RemoveNamespace to clear envLister/podLister maps - Add deregisterNamespace() in executor multitenant subscriber - Switch executor/router/buildermgr watcher strategy from TrackOnly to DispatchRemove so RemoveFunc is called when fission.io/managed label is removed - Add RemoveFunc to executor/router/buildermgr namespace subscribers - Add RemoveNamespace to environmentWatcher and packageWatcher with per-NS cancel - Add RemoveNamespace to HTTPTriggerSet: cancels informers, removes from maps, calls syncTriggers - Fix ns_watcher_test.go fakeExecutorType to implement new RemoveNamespace method Fixes: - Executor dedup gap: re-added namespace was silently skipped (envLister/deplLister still present) - Goroutine/FD leak: old informer factories ran forever after namespace removal - Router stale routes: HTTPTriggers for removed namespace stayed in routing table
3.7 KiB
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:
-
Создаёт Namespace с лейблами:
managed-by=fission-consolefission.io/managed=true← триггер для NSWatcher
-
Создаёт ServiceAccounts:
fission-fetcher,fission-builder -
Создаёт RoleBindings с
cluster-adminClusterRole для всех Fission SA:fission-executor,fission-router,fission-buildermgr,fission-kubewatcher,fission-timerfission-fetcher(из fission NS + локально в user NS)fission-builder(из fission NS + локально в user NS)
Взаимодействие с EnsureNamespaceSA
EnsureNamespaceSA вызывается NSWatcher после того как консоль создала NS.
Логика (в setupSAAndRoleBindings):
- Создаёт/получает SA
fission-fetcher→ SA уже существует →IsAlreadyExists→ OK - Для каждого permission из
fetcherCheckвызываетcheckPermissionчерезlocalsubjectaccessreviews - Поскольку у
fission-fetcherуже естьcluster-adminRoleBinding (создан консолью) → все проверки возвращаютexists=true→rulesостаётся пустым → Role и RoleBinding не создаются
Итог: EnsureNamespaceSA является no-op если консоль уже настроила namespace. Никаких конфликтов.
Что нужно на кластере
Для работы NSWatcher нужен deploy/multitenant/rbac.yaml применён один раз:
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.