From 8ccc9fb342dbd9afcb54701302be1196d821bed4 Mon Sep 17 00:00:00 2001 From: Naeel Date: Sun, 26 Apr 2026 07:46:33 +0300 Subject: [PATCH] rbac: add fission-executor-sa-provisioner for SA/Role/RoleBinding creation in user NS Fixes EnsureNamespaceSA getting 403 Forbidden when provisioning fission-fetcher SA in dynamically registered namespaces. Adds ClusterRole + ClusterRoleBinding with create/update/patch for serviceaccounts, roles, rolebindings. Also adds doc/progress.md and doc/thinking/2026-04-26-rbac-fix.md. --- deploy/multitenant/rbac.yaml | 35 ++++++++++++++++++++++++++ doc/progress.md | 38 +++++++++++++++++++++++++++++ doc/thinking/2026-04-26-rbac-fix.md | 27 ++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 doc/progress.md create mode 100644 doc/thinking/2026-04-26-rbac-fix.md diff --git a/deploy/multitenant/rbac.yaml b/deploy/multitenant/rbac.yaml index 36cfc217..66a786c5 100644 --- a/deploy/multitenant/rbac.yaml +++ b/deploy/multitenant/rbac.yaml @@ -40,3 +40,38 @@ subjects: - kind: ServiceAccount name: fission-executor namespace: fission +--- +# ClusterRole: allows fission-executor to create/update fission-fetcher SA, +# Role and RoleBinding in any user namespace managed by NSWatcher. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: fission-executor-sa-provisioner + labels: + app.kubernetes.io/name: fission + app.kubernetes.io/component: executor + app.kubernetes.io/part-of: fission-multitenant +rules: + - apiGroups: [""] + resources: ["serviceaccounts"] + verbs: ["get", "list", "watch", "create", "update", "patch"] + - apiGroups: ["rbac.authorization.k8s.io"] + resources: ["roles", "rolebindings"] + verbs: ["get", "list", "watch", "create", "update", "patch"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: fission-executor-sa-provisioner + labels: + app.kubernetes.io/name: fission + app.kubernetes.io/component: executor + app.kubernetes.io/part-of: fission-multitenant +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: fission-executor-sa-provisioner +subjects: + - kind: ServiceAccount + name: fission-executor + namespace: fission diff --git a/doc/progress.md b/doc/progress.md new file mode 100644 index 00000000..36eeed23 --- /dev/null +++ b/doc/progress.md @@ -0,0 +1,38 @@ +# Fission Multi-Tenant — Progress + +## Задача +Добиться 5/5 PASS в `test_layer1.sh`: динамически добавленный NS с меткой `fission.io/managed=true` должен работать без рестарта Fission. + +--- + +## Статус задач + +| # | Задача | Статус | +|---|--------|--------| +| 1 | Добавить `EnsureNamespaceSA` в `pkg/utils/serviceaccount.go` | ✅ DONE | +| 2 | Вызов `EnsureNamespaceSA` из `ns_watcher.go` при регистрации NS | ✅ DONE | +| 3 | Сборка образа `naeel/fission-bundle:v1.22.0-multi-ns-8` | ✅ DONE | +| 4 | Деплой образа v8 в кластер (executor/router/buildermgr) | ✅ DONE | +| 5 | Коммит `161de70` "multi-tenant: EnsureNamespaceSA + ns_watcher SA provisioning (v8)" | ✅ DONE | +| 6 | Исправить RBAC: добавить `create/update/patch` для SA/roles/rolebindings в `deploy/multitenant/rbac.yaml` | 🔄 IN PROGRESS | +| 7 | Применить RBAC через `kubectl apply`, верифицировать | ⏳ TODO | +| 8 | Коммит RBAC fix | ⏳ TODO | +| 9 | Запустить `test_layer1.sh`, добиться 5/5 PASS | ⏳ TODO | + +--- + +## Текущий результат теста +`test_layer1.sh` — 4/5: +- Шаг 5 падает: `serviceaccount "fission-fetcher" not found` в NS `l1-test-77773` + +## Диагностика (2026-04-26) +- Код `EnsureNamespaceSA` присутствует в `serviceaccount.go` ✅ +- `ns_watcher.go` строка 168 вызывает `EnsureNamespaceSA` ✅ +- RBAC: `kubectl auth can-i create serviceaccounts --as=...fission-executor -n l1-test-77773` → **`no`** ❌ +- ClusterRole `fission-executor-multi-ns` не имеет `create` для `serviceaccounts`, и нет rules для `roles`/`rolebindings` +- Вывод: `setupSAAndRoleBindings` вызывается, но получает 403 Forbidden и тихо фейлится → SA не создаётся → pod не стартует + +## Решение +Добавить в `deploy/multitenant/rbac.yaml` новый ClusterRole + ClusterRoleBinding с правами `create/update/patch` для `serviceaccounts`, `roles`, `rolebindings`. Применить через `kubectl apply`. + +**Пересборка образа НЕ нужна** — логика правильная, проблема только в RBAC. diff --git a/doc/thinking/2026-04-26-rbac-fix.md b/doc/thinking/2026-04-26-rbac-fix.md new file mode 100644 index 00000000..ba85c830 --- /dev/null +++ b/doc/thinking/2026-04-26-rbac-fix.md @@ -0,0 +1,27 @@ +# 2026-04-26 — RBAC fix для multi-tenant SA provisioning + +## Симптом +`test_layer1.sh` шаг 5 падает: pod poolmgr не создаётся в динамически добавленном NS. +Event: `serviceaccount "fission-fetcher" not found` + +## Путь диагностики + +1. **Код есть** — `EnsureNamespaceSA` добавлена в `serviceaccount.go`, вызывается из `ns_watcher.go:168` +2. **Образ задеплоен** — v8 работает, executor регистрирует NS (шаги 1-4 PASS) +3. **RBAC проверка**: `kubectl auth can-i create serviceaccounts --as=...fission-executor -n l1-test-77773` → **`no`** +4. **ClusterRole `fission-executor-multi-ns`** имеет только `get/list/watch` для serviceaccounts, нет rules для `roles`/`rolebindings` + +## Вывод +`setupSAAndRoleBindings` вызывается, но k8s отвечает 403 → функция тихо логирует ошибку и возвращает → SA не создаётся. + +## Решение +Исправить `deploy/multitenant/rbac.yaml` — добавить ClusterRole с нужными правами + ClusterRoleBinding. + +## Сделано +- Добавлен ClusterRole `fission-executor-sa-provisioner` с `create/update/patch` для `serviceaccounts`, `roles`, `rolebindings` (namespace-scoped через ClusterRole) +- Добавлен ClusterRoleBinding к SA `fission-executor` в NS `fission` +- `kubectl apply` — применено +- Верификация: `kubectl auth can-i create serviceaccounts/roles/rolebindings` → **`yes/yes/yes`** ✅ + +## Следующий шаг +Применить `kubectl apply -f deploy/multitenant/rbac.yaml`, коммит, запустить тест.