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,
|
# ClusterRole: allows fission-executor to create/update fission-fetcher SA,
|
||||||
# Role and RoleBinding in any user namespace managed by NSWatcher.
|
# 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
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
kind: ClusterRole
|
kind: ClusterRole
|
||||||
metadata:
|
metadata:
|
||||||
@@ -55,6 +62,12 @@ rules:
|
|||||||
- apiGroups: [""]
|
- apiGroups: [""]
|
||||||
resources: ["serviceaccounts"]
|
resources: ["serviceaccounts"]
|
||||||
verbs: ["get", "list", "watch", "create", "update", "patch"]
|
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"]
|
- apiGroups: ["rbac.authorization.k8s.io"]
|
||||||
resources: ["roles", "rolebindings"]
|
resources: ["roles", "rolebindings"]
|
||||||
verbs: ["get", "list", "watch", "create", "update", "patch"]
|
verbs: ["get", "list", "watch", "create", "update", "patch"]
|
||||||
|
|||||||
+18
-4
@@ -14,9 +14,9 @@
|
|||||||
| 3 | Сборка образа `naeel/fission-bundle:v1.22.0-multi-ns-8` | ✅ DONE |
|
| 3 | Сборка образа `naeel/fission-bundle:v1.22.0-multi-ns-8` | ✅ DONE |
|
||||||
| 4 | Деплой образа v8 в кластер (executor/router/buildermgr) | ✅ DONE |
|
| 4 | Деплой образа v8 в кластер (executor/router/buildermgr) | ✅ DONE |
|
||||||
| 5 | Коммит `161de70` "multi-tenant: EnsureNamespaceSA + ns_watcher SA provisioning (v8)" | ✅ 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 |
|
| 6 | Исправить RBAC: добавить полный набор прав для SA provisioning в `deploy/multitenant/rbac.yaml` | ✅ DONE |
|
||||||
| 7 | Применить RBAC через `kubectl apply`, верифицировать | ⏳ TODO |
|
| 7 | Применить RBAC через `kubectl apply`, верифицировать SA/Role/RoleBinding | ✅ DONE |
|
||||||
| 8 | Коммит RBAC fix | ⏳ TODO |
|
| 8 | Коммит RBAC fix | 🔄 IN PROGRESS |
|
||||||
| 9 | Запустить `test_layer1.sh`, добиться 5/5 PASS | ⏳ TODO |
|
| 9 | Запустить `test_layer1.sh`, добиться 5/5 PASS | ⏳ TODO |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -33,6 +33,20 @@
|
|||||||
- Вывод: `setupSAAndRoleBindings` вызывается, но получает 403 Forbidden и тихо фейлится → SA не создаётся → pod не стартует
|
- Вывод: `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.
|
**Пересборка образа НЕ нужна** — логика правильная, проблема только в 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 apply` — применено
|
||||||
- Верификация: `kubectl auth can-i create serviceaccounts/roles/rolebindings` → **`yes/yes/yes`** ✅
|
- Верификация: `kubectl auth can-i create serviceaccounts/roles/rolebindings` → **`yes/yes/yes`** ✅
|
||||||
|
|
||||||
## Следующий шаг
|
## Результат после RBAC fix (2026-04-26)
|
||||||
Применить `kubectl apply -f deploy/multitenant/rbac.yaml`, коммит, запустить тест.
|
|
||||||
|
Применено, 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