diff --git a/deploy/multitenant/rbac.yaml b/deploy/multitenant/rbac.yaml index 66a786c5..02548fa2 100644 --- a/deploy/multitenant/rbac.yaml +++ b/deploy/multitenant/rbac.yaml @@ -43,6 +43,13 @@ subjects: --- # ClusterRole: allows fission-executor to create/update fission-fetcher SA, # Role and RoleBinding in any user namespace managed by NSWatcher. +# +# It also needs two less-obvious permissions: +# 1. localsubjectaccessreviews.create — setupSAAndRoleBindings checks whether +# the target SA already has each permission before creating missing rules. +# 2. events.create — Kubernetes forbids creating a Role that grants permissions +# the caller does not currently hold. Since fission-fetcher gets events.create, +# fission-executor must hold it too in order to create that Role. apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: @@ -55,6 +62,12 @@ rules: - apiGroups: [""] resources: ["serviceaccounts"] verbs: ["get", "list", "watch", "create", "update", "patch"] + - apiGroups: [""] + resources: ["events"] + verbs: ["create"] + - apiGroups: ["authorization.k8s.io"] + resources: ["localsubjectaccessreviews"] + verbs: ["create"] - apiGroups: ["rbac.authorization.k8s.io"] resources: ["roles", "rolebindings"] verbs: ["get", "list", "watch", "create", "update", "patch"] diff --git a/doc/progress.md b/doc/progress.md index 36eeed23..e9e9dd7e 100644 --- a/doc/progress.md +++ b/doc/progress.md @@ -14,9 +14,9 @@ | 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 | +| 6 | Исправить RBAC: добавить полный набор прав для SA provisioning в `deploy/multitenant/rbac.yaml` | ✅ DONE | +| 7 | Применить RBAC через `kubectl apply`, верифицировать SA/Role/RoleBinding | ✅ DONE | +| 8 | Коммит RBAC fix | 🔄 IN PROGRESS | | 9 | Запустить `test_layer1.sh`, добиться 5/5 PASS | ⏳ TODO | --- @@ -33,6 +33,20 @@ - Вывод: `setupSAAndRoleBindings` вызывается, но получает 403 Forbidden и тихо фейлится → SA не создаётся → pod не стартует ## Решение -Добавить в `deploy/multitenant/rbac.yaml` новый ClusterRole + ClusterRoleBinding с правами `create/update/patch` для `serviceaccounts`, `roles`, `rolebindings`. Применить через `kubectl apply`. +Добавить в `deploy/multitenant/rbac.yaml` новый ClusterRole + ClusterRoleBinding с правами: +- `serviceaccounts`: `get/list/watch/create/update/patch` +- `roles`, `rolebindings`: `get/list/watch/create/update/patch` +- `events`: `create` +- `localsubjectaccessreviews.authorization.k8s.io`: `create` + +Применить через `kubectl apply`. **Пересборка образа НЕ нужна** — логика правильная, проблема только в RBAC. + +## Последняя верификация +- `kubectl auth can-i create events --as=system:serviceaccount:fission:fission-executor` → `yes` +- `kubectl auth can-i create localsubjectaccessreviews.authorization.k8s.io --as=system:serviceaccount:fission:fission-executor` → `yes` +- В новом NS `rbac-verify-83117` автоматически созданы: + - `ServiceAccount/fission-fetcher` + - `Role/fission-fetcher-role-*` + - `RoleBinding/fission-fetcher-rolebinding-*` diff --git a/doc/thinking/2026-04-26-rbac-fix.md b/doc/thinking/2026-04-26-rbac-fix.md index ba85c830..beb8c94b 100644 --- a/doc/thinking/2026-04-26-rbac-fix.md +++ b/doc/thinking/2026-04-26-rbac-fix.md @@ -23,5 +23,86 @@ Event: `serviceaccount "fission-fetcher" not found` - `kubectl apply` — применено - Верификация: `kubectl auth can-i create serviceaccounts/roles/rolebindings` → **`yes/yes/yes`** ✅ -## Следующий шаг -Применить `kubectl apply -f deploy/multitenant/rbac.yaml`, коммит, запустить тест. +## Результат после 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`