rbac: allow full fetcher role provisioning in dynamic namespaces

This commit is contained in:
Naeel
2026-04-26 08:59:02 +03:00
parent 8ccc9fb342
commit f617913ad9
3 changed files with 114 additions and 6 deletions
+18 -4
View File
@@ -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-*`
+83 -2
View File
@@ -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`