docs: lifecycle test — 44/44 PASS; 2 бага оператора задокументированы в errors/log.md + progress.md
Баги: 1. memory_mb через PUT не обновляет k8s Deployment Resources → controllers/service_controller.go:~241 2. нет self-healing при ручном удалении Deployment → нет RequeueAfter / cross-namespace watch
This commit is contained in:
@@ -4,6 +4,85 @@
|
||||
|
||||
---
|
||||
|
||||
## 2026-03-21 — БАГ: memory_mb через PUT не применяется в k8s Deployment (НЕ ИСПРАВЛЕН)
|
||||
|
||||
### Симптом
|
||||
|
||||
```
|
||||
PUT /v1/namespaces/sless-xxx/services/my-svc
|
||||
{ "memory_mb": 256, ... }
|
||||
→ HTTP 200 OK
|
||||
|
||||
kubectl get deployment my-svc -n sless-fn-xxx
|
||||
containers[0].resources.limits.memory: 128Mi ← было 128, осталось 128
|
||||
```
|
||||
|
||||
### Причина
|
||||
|
||||
`controllers/service_controller.go:ensureServiceDeployment` при UPDATE существующего Deployment обновляет только два поля:
|
||||
```go
|
||||
existing.Spec.Template.Spec.Containers[0].Image = svc.Status.ImageRef
|
||||
existing.Spec.Template.Spec.Containers[0].Env = desired.Spec.Template.Spec.Containers[0].Env
|
||||
// Resources (memory limit) НЕ обновляется!
|
||||
```
|
||||
`desired` Deployment строится с правильным `memory_mb`, но в `existing` он не копируется.
|
||||
|
||||
### Фикс (не применён)
|
||||
|
||||
```go
|
||||
// В ensureServiceDeployment, блок else (UPDATE):
|
||||
existing.Spec.Template.Spec.Containers[0].Image = svc.Status.ImageRef
|
||||
existing.Spec.Template.Spec.Containers[0].Env = desired.Spec.Template.Spec.Containers[0].Env
|
||||
existing.Spec.Template.Spec.Containers[0].Resources = desired.Spec.Template.Spec.Containers[0].Resources // ← ДОБАВИТЬ
|
||||
existing.Spec.Template.Spec.ImagePullSecrets = desired.Spec.Template.Spec.ImagePullSecrets
|
||||
```
|
||||
|
||||
### Файл
|
||||
|
||||
`controllers/service_controller.go` ~ строка 241
|
||||
|
||||
### Обнаружен
|
||||
|
||||
`operator_lifecycle_test.sh`, тест 2.13
|
||||
|
||||
---
|
||||
|
||||
## 2026-03-21 — БАГ: нет self-healing — ручное удаление Deployment не восстанавливается (НЕ ИСПРАВЛЕН)
|
||||
|
||||
### Симптом
|
||||
|
||||
```
|
||||
kubectl delete deployment my-svc -n sless-fn-sless-xxx
|
||||
# Deployment исчез.
|
||||
# Ждём 90s — контроллер не пересоздаёт.
|
||||
# GET /fn/sless-xxx/my-svc → 502 (pod отсутствует, CRD=Ready)
|
||||
```
|
||||
|
||||
### Причина
|
||||
|
||||
`ServiceReconciler` реагирует только на изменения объектов типа `Service` (sless CRD) в namespace `sless`.
|
||||
Deployment живёт в `sless-fn-sless-xxx` — другой namespace. controller-runtime не допускает `Owns()` для cross-namespace ресурсов.
|
||||
`ensureServiceDeployment` вызывается только когда `phase=Ready` И пришёл reconcile event (=изменение CRD). Просто удалённый Deployment event не генерирует.
|
||||
|
||||
### Фикс (вариант)
|
||||
|
||||
Добавить `RequeueAfter: 60s` в `ensureServiceDeployment` — тогда контроллер будет периодически проверять и пересоздавать:
|
||||
```go
|
||||
// В конце ensureServiceDeployment:
|
||||
return ctrl.Result{RequeueAfter: 60 * time.Second}, nil
|
||||
```
|
||||
Или использовать `Watches()` с cross-namespace mapper (сложнее).
|
||||
|
||||
### Файл
|
||||
|
||||
`controllers/service_controller.go` ~ строка 340
|
||||
|
||||
### Обнаружен
|
||||
|
||||
`operator_lifecycle_test.sh`, тест 3.2
|
||||
|
||||
---
|
||||
|
||||
## 2026-03-21 — Баг: DELETE несуществующего ресурса → HTTP 204 вместо 404
|
||||
|
||||
### Симптом
|
||||
|
||||
Reference in New Issue
Block a user