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

6.6 KiB
Raw Blame History

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-77773no
  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/rolebindingsyes/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