Files
fission-src/doc/thinking/2026-04-26-rbac-fix.md
T

136 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`