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:
+39
-4
@@ -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
|
||||
|
||||
|
||||
@@ -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`).
|
||||
|
||||
@@ -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`.
|
||||
|
||||
@@ -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) |
|
||||
|
||||
## Мониторинг
|
||||
|
||||
|
||||
Reference in New Issue
Block a user