- 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
73 lines
3.7 KiB
Markdown
73 lines
3.7 KiB
Markdown
# 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.
|