fix(namespace): executor/router/buildermgr RemoveNamespace + per-NS informer lifecycle

- 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
This commit is contained in:
“Naeel”
2026-05-18 09:04:13 +04:00
parent 3b93c5dc8b
commit 4eedf95f5c
17 changed files with 347 additions and 29 deletions
+72
View File
@@ -0,0 +1,72 @@
# 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.