# 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`** ✅ ## Результат после RBAC fix (2026-04-26) Применено, RBAC проверка: `yes/yes/yes` ✅ SA `fission-fetcher` создаётся в новом NS за 15 сек ✅ Тест `test_layer1.sh` всё равно 4/5 FAIL ❌ --- ## Новая проблема — executor timeout при вызове функции ### Симптом Шаг 5 (`вызываем функцию`): `HTTP 500 — error sending request to function` Лог router: ``` function service entry timeout (60.000000)s exceeded error posting to getting service for function: POST http://executor.fission/v2/getServiceForFunction giving up after 4 attempt(s): context deadline exceeded function: {namespace: l1-test-78841, name: hello} ``` ### Что происходит Router обращается к executor `/v2/getServiceForFunction`, executor не отвечает в течение 60 сек. SA `fission-fetcher` уже есть (RBAC fix помог). Но poolmgr pod так и не запустился или executor не может создать service entry. ### Что нужно проверить 1. Есть ли pod poolmgr в NS `l1-test-78841`? 2. Если pod не создаётся — события в NS (`kubectl get events -n l1-test-78841`) 3. Если pod есть — логи executor (`kubectl logs -n fission deploy/executor`) 4. Может ли executor вообще видеть функции в динамически добавленном NS? ### Гипотезы A. **Executor не видит функцию** — NS зарегистрирован в NSWatcher, но executor informer не получил Function объект → `getServiceForFunction` не знает о функции → timeout. B. **poolmgr pod не стартует** — новая RBAC проблема или другой ресурс отсутствует. C. **Executor видит функцию, но pool не готов** — cold start > 60 сек (маловероятно для Python hello). --- ## Обновление анализа — найден реальный RBAC root cause ### Подтверждённые факты - Pool pod в новом NS создаётся и выходит в `Running`. - `readyPod controller started` есть в логах executor. - Ошибка возникает раньше/ниже: при `EnsureNamespaceSA` executor создаёт `ServiceAccount`, но не может создать `Role` полностью. ### Точный лог ошибки ``` error while creating role for sa fission-fetcher in namespace diag-ns-82702 roles.rbac.authorization.k8s.io ... is forbidden: user "system:serviceaccount:fission:fission-executor" is attempting to grant RBAC permissions not currently held: {APIGroups:[""], Resources:["events"], Verbs:["create"]} ``` Также перед этим: ``` localsubjectaccessreviews.authorization.k8s.io is forbidden User "system:serviceaccount:fission:fission-executor" cannot create resource "localsubjectaccessreviews" ``` ### Вывод Предыдущий RBAC fix был неполным. Для динамического SA provisioning executor нужны не только: - `serviceaccounts.create/update/patch` - `roles.create/update/patch` - `rolebindings.create/update/patch` Но и ещё: - `events.create` — иначе Kubernetes запрещает executor создавать Role, которая выдаёт `events.create` fetcher-у. - `authorization.k8s.io/localsubjectaccessreviews.create` — иначе `checkPermission()` не может проверить текущие права SA. ### Исправление Расширить `deploy/multitenant/rbac.yaml` для `fission-executor-sa-provisioner`: - core `events`: `create` - `authorization.k8s.io` `localsubjectaccessreviews`: `create` После этого нужно: 1. `kubectl apply -f deploy/multitenant/rbac.yaml` 2. Создать новый test NS 3. Убедиться, что `Role` и `RoleBinding` для `fission-fetcher` создаются 4. Повторить `test_layer1.sh` --- ## Следующий найденный blocker — router RBAC После полного executor RBAC fix `test_layer1.sh` изменил симптом: - раньше шаг 5 падал с `500` и timeout на `executor /v2/getServiceForFunction` - теперь шаг 5 падает с постоянным `404` Лог router: ``` Failed to watch err="failed to list *v1.Namespace: namespaces is forbidden: User \"system:serviceaccount:fission:fission-router\" cannot list resource \"namespaces\" in API group \"\" at the cluster scope" ``` ### Вывод Executor-path уже починен, но router NSWatcher не работает, потому что у SA `fission-router` нет cluster-scope прав `list/watch` на `namespaces`. ### Исправление Добавить в `deploy/multitenant/rbac.yaml` ещё один набор ресурсов: - `ClusterRole/fission-router-ns-watcher` - `ClusterRoleBinding/fission-router-ns-watcher` С правами: - core `namespaces`: `list`, `watch`