rbac: allow full fetcher role provisioning in dynamic namespaces
This commit is contained in:
@@ -43,6 +43,13 @@ subjects:
|
||||
---
|
||||
# ClusterRole: allows fission-executor to create/update fission-fetcher SA,
|
||||
# Role and RoleBinding in any user namespace managed by NSWatcher.
|
||||
#
|
||||
# It also needs two less-obvious permissions:
|
||||
# 1. localsubjectaccessreviews.create — setupSAAndRoleBindings checks whether
|
||||
# the target SA already has each permission before creating missing rules.
|
||||
# 2. events.create — Kubernetes forbids creating a Role that grants permissions
|
||||
# the caller does not currently hold. Since fission-fetcher gets events.create,
|
||||
# fission-executor must hold it too in order to create that Role.
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
@@ -55,6 +62,12 @@ rules:
|
||||
- apiGroups: [""]
|
||||
resources: ["serviceaccounts"]
|
||||
verbs: ["get", "list", "watch", "create", "update", "patch"]
|
||||
- apiGroups: [""]
|
||||
resources: ["events"]
|
||||
verbs: ["create"]
|
||||
- apiGroups: ["authorization.k8s.io"]
|
||||
resources: ["localsubjectaccessreviews"]
|
||||
verbs: ["create"]
|
||||
- apiGroups: ["rbac.authorization.k8s.io"]
|
||||
resources: ["roles", "rolebindings"]
|
||||
verbs: ["get", "list", "watch", "create", "update", "patch"]
|
||||
|
||||
+18
-4
@@ -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-*`
|
||||
|
||||
@@ -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`
|
||||
|
||||
Reference in New Issue
Block a user