fix: rollout restart после kaniko rebuild (operator v0.1.11)

- controllers/function_controller.go: в ensureDeployment добавить аннотацию
  kubectl.kubernetes.io/restartedAt = fn.Status.LastBuiltAt при обновлении
  существующего Deployment — принудительный rolling restart после каждой сборки
- deployments/k8s/operator.yaml: образ обновлён до v0.1.11
- doc/errors/log.md: задокументирована причина и решение
- doc/decisions/log.md: добавлено правило restartedAt + :latest
- doc/progress.md: версия обновлена до v0.1.11

Причина бага: imagePullPolicy=IfNotPresent + :latest — kubelet кешировал
старый образ, pod не рестартовал после успешного kaniko build.
This commit is contained in:
“Naeel”
2026-03-08 20:55:47 +04:00
parent df540e6b81
commit 79719e078d
8 changed files with 46 additions and 5 deletions
+17
View File
@@ -245,3 +245,20 @@
**Правило проекта:** В `sless_function.code_hash` всегда использовать `filesha256(source_file)`, не `archive_file.output_md5`.
---
## 2026-03-08 — Rollout restart после kaniko build (imagePullPolicy + :latest)
**Проблема:** После успешной kaniko сборки pod не перезапускался — kubelet брал кешированный образ `:latest` (imagePullPolicy: IfNotPresent). Функция возвращала старый код.
**Решение:** В `ensureDeployment` при обновлении существующего Deployment проставляем аннотацию:
```go
existing.Spec.Template.Annotations["kubectl.kubernetes.io/restartedAt"] = fn.Status.LastBuiltAt.Time.Format(time.RFC3339)
```
Значение привязано к `fn.Status.LastBuiltAt` → меняется при каждой сборке → Kubernetes делает rolling restart → свежий образ гарантированно пул-ится.
**Правило проекта:** При использовании `:latest` tag всегда явно проставлять `restartedAt` annotation при обновлении кода.
**Версия:** operator `naeel/sless-operator:v0.1.11`
+15
View File
@@ -301,3 +301,18 @@ k8s.io/api should be direct
**Решение:** `go mod tidy` автоматически расставил правильные аннотации.
---
## 2026-03-08 — После kaniko rebuild функция возвращает старый код
**Проблема:** `terraform apply` с изменённым кодом успешно завершал kaniko build, но функция продолжала возвращать старую версию кода.
**Причина:** `imagePullPolicy: IfNotPresent` (default в k8s) + `:latest` тег — после успешной сборки оператор обновлял `.spec.template.spec.containers[0].image`, но image tag не менялся (всегда `:latest`). Kubernetes видел что образ уже есть на ноде и не пул-ил новый. Pod оставался запущенным со старым образом.
**Решение:** В `controllers/function_controller.go`, функция `ensureDeployment`, после обновления image добавлена аннотация:
```go
existing.Spec.Template.Annotations["kubectl.kubernetes.io/restartedAt"] = fn.Status.LastBuiltAt.Time.Format(time.RFC3339)
```
Аннотация меняется при каждой новой сборке (значение = `lastBuiltAt`) → Kubernetes делает rolling restart → kubelet пул-ит свежий образ.
Оператор: **v0.1.11**.
---
+1 -1
View File
@@ -1,6 +1,6 @@
# Прогресс разработки
Последнее обновление: 2026-03-08 (operator v0.1.10, provider v0.1.5)
Последнее обновление: 2026-03-08 (operator v0.1.11, provider v0.1.5)
## Статусы: ✅ готово | 🔄 в процессе | ⏳ не начато