6.6 KiB
2026-04-26 — RBAC fix для multi-tenant SA provisioning
Симптом
test_layer1.sh шаг 5 падает: pod poolmgr не создаётся в динамически добавленном NS.
Event: serviceaccount "fission-fetcher" not found
Путь диагностики
- Код есть —
EnsureNamespaceSAдобавлена вserviceaccount.go, вызывается изns_watcher.go:168 - Образ задеплоен — v8 работает, executor регистрирует NS (шаги 1-4 PASS)
- RBAC проверка:
kubectl auth can-i create serviceaccounts --as=...fission-executor -n l1-test-77773→no - 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в NSfission 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.
Что нужно проверить
- Есть ли pod poolmgr в NS
l1-test-78841? - Если pod не создаётся — события в NS (
kubectl get events -n l1-test-78841) - Если pod есть — логи executor (
kubectl logs -n fission deploy/executor) - Может ли 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.- Ошибка возникает раньше/ниже: при
EnsureNamespaceSAexecutor создаёт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/patchroles.create/update/patchrolebindings.create/update/patch
Но и ещё:
events.create— иначе Kubernetes запрещает executor создавать Role, которая выдаётevents.createfetcher-у.authorization.k8s.io/localsubjectaccessreviews.create— иначеcheckPermission()не может проверить текущие права SA.
Исправление
Расширить deploy/multitenant/rbac.yaml для fission-executor-sa-provisioner:
- core
events:create authorization.k8s.iolocalsubjectaccessreviews:create
После этого нужно:
kubectl apply -f deploy/multitenant/rbac.yaml- Создать новый test NS
- Убедиться, что
RoleиRoleBindingдляfission-fetcherсоздаются - Повторить
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-watcherClusterRoleBinding/fission-router-ns-watcher
С правами:
- core
namespaces:list,watch