docs: обновить всю документацию по результатам сессии 2026-03-07

- infrastructure/overview.md: исправить S3 URL, Container Registry (DockerHub),
  namespace sless, Terraform Registry terra.k8c.ru
- errors/log.md: добавить 3 ошибки — kaniko S3 scheme, бесконечный цикл сборки,
  docker credStore desktop.exe
- decisions/log.md: добавить решения — DockerHub, terraform провайдер в той же
  репе, WaitReady паттерн, code_hash для версионирования кода
- api/design.md: обновить базовый URL, добавить upload endpoint с описанием
  процесса, исправить runtime список
This commit is contained in:
“Naeel”
2026-03-07 10:26:13 +04:00
parent 19c9e016a8
commit dc7542148e
4 changed files with 132 additions and 9 deletions
+39 -4
View File
@@ -3,7 +3,19 @@
## Базовый URL
```
https://sless.api.ngcloud.ru/v1
http://<operator-host>:9090/v1
```
Локально: `http://localhost:9090/v1`
В кластере (будущее): `http://sless-operator.sless.svc.cluster.local:9090/v1`
**Реализовано** (текущий namespace-aware формат):
```
/v1/namespaces/{namespace}/functions[/{name}]
/v1/namespaces/{namespace}/functions/{name}/upload
/v1/namespaces/{namespace}/triggers[/{name}]
/v1/namespaces/{namespace}/functions/{name}/invocations
```
## Аутентификация
@@ -49,11 +61,34 @@ Authorization: Bearer <cloud-token>
| GET | /functions/{id}/invocations | История вызовов |
| GET | /functions/{id}/invocations/{iid} | Детали вызова + логи |
## Upload endpoint
```
POST /v1/namespaces/{namespace}/functions/{name}/upload
Content-Type: multipart/form-data
Authorization: Bearer <token>
field: code = <zip-file>
```
Процесс:
1. Принимает zip (max 32MB)
2. Распаковывает zip
3. Генерирует `Dockerfile` (`FROM naeel/sless-runtime-{runtime}:latest\nCOPY . /app/function/`)
4. Перепаковывает в `tar.gz` (kaniko требует tar format)
5. Загружает в S3: `contexts/{ns}/{name}/{timestamp}.tar.gz`
6. Обновляет `fn.Spec.S3Key` → контроллер видит изменение и запускает kaniko Job
Ответ `200 OK`:
```json
{"message": "build queued", "phase": "Pending", "s3_key": "contexts/..."}
```
## Поддерживаемые runtime (v1)
- `go1.21`
- `python3.11`
- `nodejs20`
- `python3.11` — реализован и протестирован
- `go1.21` — планируется
- `nodejs20` — планируется
## Модель Function
+32
View File
@@ -45,3 +45,35 @@
**Решение:** В v1 только HTTP и Cron триггеры. RabbitMQ/event triggers — в v2.
**Причина:** Упрощение первой итерации.
---
## 2026-03-07 — DockerHub вместо внутреннего registry
**Решение:** Образы функций и runtime базовые образы публикуются на DockerHub (user `naeel`).
**Причина:** Namespace `registry` в кластере — это Apache NiFi Registry (NOT Docker). Отдельный Docker registry не поднят. DockerHub доступен и достаточен для разработки.
---
## 2026-03-07 — Terraform провайдер sless — отдельный модуль в той же репе
**Решение:** `terraform/provider/` — независимый Go-модуль внутри репы `sless`.
**Причина:** Удобно держать рядом. Код провайдера писался с прицелом на перенос в nubes провайдер (`/home/naeel/remote_dev/terraform`). Клиент (`internal/client/`) → `internal/core/` nubes, ресурсы → `internal/resources_gen/`.
---
## 2026-03-07 — WaitReady в Terraform провайдере при создании функции
**Решение:** После `UploadCode` провайдер ждёт `phase=Ready` (polling каждые 5 сек, таймаут 5 мин).
**Причина:** Kaniko-сборка занимает ~1 минуту. Без ожидания `terraform apply` завершился бы с `phase=Building` в state, что неверно отображало бы реальное состояние ресурса.
---
## 2026-03-07 — code_hash для детектирования изменений кода функции
**Решение:** Атрибут `code_hash` в `sless_function` — пользователь задаёт через `filemd5("./handler.zip")`. Изменение hash → провайдер перезагружает zip и запускает пересборку.
**Причина:** Terraform не отслеживает содержимое файлов автоматически. Это стандартный паттерн (аналогично `aws_lambda_function.source_code_hash`).
+34
View File
@@ -14,6 +14,40 @@
**Решение:** ...
```
## 2026-03-07 — kaniko: unsupported protocol scheme ""
**Проблема:** kaniko Job падает с `unsupported protocol scheme ""` при доступе к S3.
**Причина:** В env `S3_ENDPOINT` передавался хост без схемы (`s3.msk-1.ngcloud.ru`), kaniko ожидает полный URL.
**Решение:** В `builder.go` добавить `"https://" + b.s3Endpoint` при формировании env для kaniko. Также добавить `S3_FORCE_PATH_STYLE=true` — Ceph требует path-style URLs.
---
## 2026-03-07 — Бесконечный цикл сборки (94 job'а)
**Проблема:** После upload оператор создавал сотни kaniko Job'ов.
**Причина:** Upload handler вызывал `Status().Update(phase=Pending)` ПОСЛЕ того как контроллер уже выставил `Building`. Контроллер видел `Pending` → создавал новый Job, upload снова сбрасывал → цикл.
**Решение:**
1. `startBuild()` СНАЧАЛА ставит аннотацию `last-built-s3key = spec.S3Key` (idempotency guard), затем обновляет статус.
2. Reconcile запускает сборку только если `spec.S3Key != annotations["last-built-s3key"]`.
3. Upload handler убран `Status().Update()` — контроллер сам управляет фазой.
4. `IsAlreadyExists` при создании Job не считается ошибкой (parallel reconcile).
---
## 2026-03-07 — Docker credStore: exec "docker-credential-desktop.exe"
**Проблема:** `docker push` падал с `exec: "docker-credential-desktop.exe": executable file not found`.
**Причина:** В `~/.docker/config.json` осталась запись `"credsStore": "desktop.exe"` от Docker Desktop.
**Решение:** Удалить поле `credsStore` из `~/.docker/config.json`, оставить только `auths` с base64 credentials.
---
## 2026-03-07 — controller-gen v0.11.1 паникует с Go 1.23
**Проблема:** `operator-sdk create api` падает с panic в `controller-gen` при `make generate`.
+27 -5
View File
@@ -14,20 +14,42 @@
| Namespace | Что там |
|-----------|---------|
| `sless` | API сервер, PostgreSQL, Redis |
| `sless-fn-{id}` | Функции пользователей (Jobs/Deployments) |
| `sless` | PostgreSQL, Secret sless-registry-auth, RBAC |
| `sless-fn-{namespace}` | Deployments функций и их Services/Ingress |
| `terra` | Terraform registry-server, terraform-operator |
## Terraform Registry
- **URL:** `https://terra.k8c.ru`
- Image: `naeel/terraform-registry-server:gpg-key-20260208`
- Хранилище: S3 `terraform-registry`, путь: `{hostname}/{namespace}/{provider}/{version}/`
- Провайдер sless: `terra.k8c.ru/naeel/sless` v0.1.0 опубликован
- GPG ключ подписи: `CB3A0DF161ECC416` (файл: `terraform/secrets/private_key.asc`)
## S3
- **URL:** `http://ceph.tst.nubes.ru/`
- **URL:** `https://s3.msk-1.ngcloud.ru` (HTTPS обязателен — Ceph требует схему)
- **Тип:** Ceph S3 compatible
- Доступ: внешний, через access/secret key
- Бакет для кода функций: `sless-functions`
- Бакет для Terraform registry: `terraform-registry`
- **Важно:** kaniko требует `S3_FORCE_PATH_STYLE=true` и полный URL с `https://`
- Путь для контекстов сборки: `contexts/{namespace}/{name}/{timestamp}.tar.gz`
## Container Registry
- Внутренний registry кластера в namespace `registry`
- Service: `registry.registry.svc.cluster.local:18080`
- Namespace `registry` — это **Apache NiFi Registry** (НЕ Docker registry), порты 18080/18443
- Docker registry: **DockerHub**, user `naeel`
- Образы функций: `naeel/sless-{namespace}-{name}:latest`
- Runtime образы: `naeel/sless-runtime-{runtime}:latest`
- Для kaniko: Secret `sless-registry-auth` (docker-registry type) в namespace `sless`
## DockerHub образы
| Образ | Назначение |
|-------|------------|
| `naeel/sless-runtime-python3.11:latest` | Base runtime для python3.11 функций |
| `naeel/sless-default-hello:latest` | Пример собранной функции (kaniko) |
## Мониторинг