feat: sless_service CRD + ServiceReconciler, RBAC fix, split postgres/functions.tf, operator v0.1.41
This commit is contained in:
+127
-1
@@ -1,6 +1,132 @@
|
||||
# Прогресс разработки
|
||||
|
||||
Последнее обновление: 2026-03-19 22:30
|
||||
Последнее обновление: 2026-03-20 17:00
|
||||
|
||||
---
|
||||
|
||||
## 2026-03-20 — Архитектурный рефакторинг: sless_function + sless_service (ветка feat/function-service-split)
|
||||
|
||||
### Цель
|
||||
|
||||
Разделить единый тип `sless_function` на два независимых:
|
||||
- `sless_function` — **oneshot** (запускается один раз через Kubernetes Job, нет постоянного URL)
|
||||
- `sless_service` — **long-running** (постоянный Deployment, Ingress, встроенный URL без sless_trigger)
|
||||
|
||||
Мотивация: устранить архитектурное несоответствие — функции с постоянным HTTP URL не должны требовать отдельного sless_trigger.
|
||||
|
||||
### Изменения в operator (Go)
|
||||
|
||||
| Файл | Что сделано |
|
||||
|------|-------------|
|
||||
| `api/v1alpha1/service_types.go` | Новый CRD-тип `Service` с фазами Pending/Building/Ready/Failed, поле `URL` в статусе |
|
||||
| `api/v1alpha1/zz_generated.deepcopy.go` | DeepCopy методы для Service/ServiceList/ServiceSpec/ServiceStatus |
|
||||
| `controllers/service_controller.go` | Полный `ServiceReconciler`: kaniko build → Deployment → k8s Service → Ingress → Status.URL |
|
||||
| `controllers/function_controller.go` | Удалены мёртвые методы: `ensureDeployment`, `buildDeployment`, `ensureRegistrySecret`. Function = только oneshot (Job). |
|
||||
| `internal/api/handler/services.go` | CRUD handlers: ListServices, CreateService, GetService, UpdateService, DeleteService, UploadServiceCode |
|
||||
| `internal/api/handler/invoke.go` | Dual-mode invoke: сначала проверяет Service CRD (proxy к Deployment), затем Function CRD (FunctionJob poll) |
|
||||
| `internal/api/router.go` | 6 новых маршрутов `/namespaces/{ns}/services/...` |
|
||||
| `main.go` | Регистрация ServiceReconciler |
|
||||
|
||||
### Изменения в Terraform-провайдере
|
||||
|
||||
| Файл | Что сделано |
|
||||
|------|-------------|
|
||||
| `terraform/provider/internal/client/client.go` | `ServiceRequest`, `ServiceResponse`, `CreateService/Get/Update/Delete`, `UploadServiceCode`, `WaitServiceReady` |
|
||||
| `terraform/provider/internal/resources/service_resource.go` | Новый ресурс `sless_service` с полями name/runtime/entrypoint/memory_mb/timeout_sec/env_vars/source_dir/url (computed) |
|
||||
| `terraform/provider/internal/provider/provider.go` | `NewServiceResource` добавлен в список ресурсов |
|
||||
|
||||
### Изменения в примерах (examples/POSTGRES/)
|
||||
|
||||
| Файл | Что сделано |
|
||||
|------|-------------|
|
||||
| `resources.tf` | Разбит на два файла; содержит только комментарий-указатель |
|
||||
| `postgres.tf` | Managed PostgreSQL ресурсы: `locals`, `nubes_postgres`, `nubes_postgres_user`, `nubes_postgres_database` |
|
||||
| `functions.tf` | Sless ресурсы: `sless_function` (только postgres_sql_runner_create_table + stress-*), `sless_service` (pg-info, pg-table-reader, pg-table-writer), `sless_job`; все `sless_trigger` блоки удалены |
|
||||
|
||||
### Изменения в deployments/k8s/
|
||||
|
||||
| Файл | Что сделано |
|
||||
|------|-------------|
|
||||
| `operator.yaml` | Обновлён image `v0.1.33` → `v0.1.41` |
|
||||
| `rbac.yaml` | Добавлен `services` в rules группы `sless.kube5s.ru` (resources + status + finalizers) |
|
||||
|
||||
### Полная миграция terraform state
|
||||
|
||||
```
|
||||
# Удалено из state (миграция Function → Service):
|
||||
terraform state rm sless_function.pg_info ✅
|
||||
terraform state rm sless_trigger.pg_info_http ✅
|
||||
terraform state rm sless_function.postgres_table_reader ✅
|
||||
terraform state rm sless_trigger.postgres_table_reader_http ✅
|
||||
terraform state rm sless_function.postgres_table_writer ✅
|
||||
terraform state rm sless_trigger.postgres_table_writer_http ✅
|
||||
|
||||
# Дополнительно удалено 9 sless_trigger для stress-* функций:
|
||||
terraform state rm sless_trigger.stress_bigloop_http ✅
|
||||
terraform state rm sless_trigger.stress_divzero_http ✅
|
||||
terraform state rm sless_trigger.stress_go_fast_http ✅
|
||||
terraform state rm sless_trigger.stress_go_nil_http ✅
|
||||
terraform state rm sless_trigger.stress_go_pgstorm_http ✅
|
||||
terraform state rm sless_trigger.stress_js_async_http ✅
|
||||
terraform state rm sless_trigger.stress_js_badenv_http ✅
|
||||
terraform state rm sless_trigger.stress_slow_http ✅
|
||||
terraform state rm sless_trigger.stress_writer_http ✅
|
||||
```
|
||||
|
||||
### RBAC fix (2026-03-20)
|
||||
|
||||
ClusterRole `sless-operator` не содержала прав на новый CRD `services.sless.kube5s.ru`.
|
||||
Причина: `rbac.yaml` создавался до введения `Service` CRD; `controller-gen rbac` не запускался перед деплоем v0.1.41.
|
||||
|
||||
Исправление:
|
||||
```bash
|
||||
kubectl patch clusterrole sless-operator --type=json -p='[
|
||||
{"op":"add","path":"/rules/0/resources/-","value":"services"},
|
||||
{"op":"add","path":"/rules/1/resources/-","value":"services/status"},
|
||||
{"op":"add","path":"/rules/2/resources/-","value":"services/finalizers"}
|
||||
]'
|
||||
```
|
||||
|
||||
После патча `terraform apply` завершился успешно. Файл `deployments/k8s/rbac.yaml` синхронизирован.
|
||||
|
||||
### Статус задач
|
||||
|
||||
| # | Задача | Статус |
|
||||
|---|--------|--------|
|
||||
| 1 | Создать `service_types.go` + DeepCopy | ✅ |
|
||||
| 2 | `service_controller.go` с полным lifecycle | ✅ |
|
||||
| 3 | Очистить `function_controller.go` от мёртвых методов | ✅ |
|
||||
| 4 | API handler `services.go` | ✅ |
|
||||
| 5 | Dual-mode `invoke.go` | ✅ |
|
||||
| 6 | `router.go` + 6 маршрутов | ✅ |
|
||||
| 7 | `main.go` + ServiceReconciler | ✅ |
|
||||
| 8 | Terraform client + service_resource.go + provider.go | ✅ |
|
||||
| 9 | Разбить `resources.tf` → `postgres.tf` + `functions.tf` | ✅ |
|
||||
| 10 | terraform state rm (15 ресурсов: 6 pg + 9 stress triggers) | ✅ |
|
||||
| 11 | Удалить все `sless_trigger` блоки из `functions.tf` | ✅ |
|
||||
| 12 | Новый провайдер скомпилирован на VM (v0.1.18 dev) | ✅ |
|
||||
| 13 | Build + push operator image `v0.1.41` | ✅ |
|
||||
| 14 | Apply CRD Service + deploy оператора v0.1.41 | ✅ |
|
||||
| 15 | Исправить RBAC ClusterRole: добавить services.sless.kube5s.ru | ✅ |
|
||||
| 16 | `terraform apply -target sless_service.*` | ✅ |
|
||||
| 17 | Удалить старые Function объекты pg-info/reader/writer из k8s | ✅ |
|
||||
| 18 | Smoke test curl (pg-info, pg-table-reader, pg-table-writer) | ✅ |
|
||||
| 19 | Синхронизировать `deployments/k8s/rbac.yaml` с кластером | ✅ |
|
||||
| 20 | Commit + push | ✅ |
|
||||
|
||||
### Итоговое состояние кластера (sless-ffd1f598c169b0ae)
|
||||
|
||||
```
|
||||
service.sless.kube5s.ru/pg-info nodejs20 Ready https://sless.kube5s.ru/fn/.../pg-info
|
||||
service.sless.kube5s.ru/pg-table-reader python3.11 Ready https://sless.kube5s.ru/fn/.../pg-table-reader
|
||||
service.sless.kube5s.ru/pg-table-writer python3.11 Ready https://sless.kube5s.ru/fn/.../pg-table-writer
|
||||
|
||||
function.sless.kube5s.ru/pg-create-table-runner python3.11 Ready
|
||||
function.sless.kube5s.ru/stress-bigloop python3.11 Ready
|
||||
... (8 stress functions)
|
||||
```
|
||||
|
||||
Старые `function.sless.kube5s.ru/pg-info`, `pg-table-reader`, `pg-table-writer` — удалены.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user