136 lines
6.6 KiB
Markdown
136 lines
6.6 KiB
Markdown
# 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`
|