rbac: add fission-executor-sa-provisioner for SA/Role/RoleBinding creation in user NS
Fixes EnsureNamespaceSA getting 403 Forbidden when provisioning fission-fetcher SA in dynamically registered namespaces. Adds ClusterRole + ClusterRoleBinding with create/update/patch for serviceaccounts, roles, rolebindings. Also adds doc/progress.md and doc/thinking/2026-04-26-rbac-fix.md.
This commit is contained in:
@@ -40,3 +40,38 @@ subjects:
|
||||
- kind: ServiceAccount
|
||||
name: fission-executor
|
||||
namespace: fission
|
||||
---
|
||||
# ClusterRole: allows fission-executor to create/update fission-fetcher SA,
|
||||
# Role and RoleBinding in any user namespace managed by NSWatcher.
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
name: fission-executor-sa-provisioner
|
||||
labels:
|
||||
app.kubernetes.io/name: fission
|
||||
app.kubernetes.io/component: executor
|
||||
app.kubernetes.io/part-of: fission-multitenant
|
||||
rules:
|
||||
- apiGroups: [""]
|
||||
resources: ["serviceaccounts"]
|
||||
verbs: ["get", "list", "watch", "create", "update", "patch"]
|
||||
- apiGroups: ["rbac.authorization.k8s.io"]
|
||||
resources: ["roles", "rolebindings"]
|
||||
verbs: ["get", "list", "watch", "create", "update", "patch"]
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: fission-executor-sa-provisioner
|
||||
labels:
|
||||
app.kubernetes.io/name: fission
|
||||
app.kubernetes.io/component: executor
|
||||
app.kubernetes.io/part-of: fission-multitenant
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: fission-executor-sa-provisioner
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: fission-executor
|
||||
namespace: fission
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
# Fission Multi-Tenant — Progress
|
||||
|
||||
## Задача
|
||||
Добиться 5/5 PASS в `test_layer1.sh`: динамически добавленный NS с меткой `fission.io/managed=true` должен работать без рестарта Fission.
|
||||
|
||||
---
|
||||
|
||||
## Статус задач
|
||||
|
||||
| # | Задача | Статус |
|
||||
|---|--------|--------|
|
||||
| 1 | Добавить `EnsureNamespaceSA` в `pkg/utils/serviceaccount.go` | ✅ DONE |
|
||||
| 2 | Вызов `EnsureNamespaceSA` из `ns_watcher.go` при регистрации NS | ✅ DONE |
|
||||
| 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 |
|
||||
| 9 | Запустить `test_layer1.sh`, добиться 5/5 PASS | ⏳ TODO |
|
||||
|
||||
---
|
||||
|
||||
## Текущий результат теста
|
||||
`test_layer1.sh` — 4/5:
|
||||
- Шаг 5 падает: `serviceaccount "fission-fetcher" not found` в NS `l1-test-77773`
|
||||
|
||||
## Диагностика (2026-04-26)
|
||||
- Код `EnsureNamespaceSA` присутствует в `serviceaccount.go` ✅
|
||||
- `ns_watcher.go` строка 168 вызывает `EnsureNamespaceSA` ✅
|
||||
- RBAC: `kubectl auth can-i create serviceaccounts --as=...fission-executor -n l1-test-77773` → **`no`** ❌
|
||||
- ClusterRole `fission-executor-multi-ns` не имеет `create` для `serviceaccounts`, и нет rules для `roles`/`rolebindings`
|
||||
- Вывод: `setupSAAndRoleBindings` вызывается, но получает 403 Forbidden и тихо фейлится → SA не создаётся → pod не стартует
|
||||
|
||||
## Решение
|
||||
Добавить в `deploy/multitenant/rbac.yaml` новый ClusterRole + ClusterRoleBinding с правами `create/update/patch` для `serviceaccounts`, `roles`, `rolebindings`. Применить через `kubectl apply`.
|
||||
|
||||
**Пересборка образа НЕ нужна** — логика правильная, проблема только в RBAC.
|
||||
@@ -0,0 +1,27 @@
|
||||
# 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-77773` → **`no`**
|
||||
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/rolebindings` → **`yes/yes/yes`** ✅
|
||||
|
||||
## Следующий шаг
|
||||
Применить `kubectl apply -f deploy/multitenant/rbac.yaml`, коммит, запустить тест.
|
||||
Reference in New Issue
Block a user