doc: document operator deploy, nodejs20 runtime, Dockerfile fixes, go.mod fix
This commit is contained in:
@@ -103,3 +103,30 @@
|
||||
**Решение:** Postgres нужен только для логов вызовов (`invocations`). Для базового деплоя функций — не нужен. Оператор работает без него (просто не пишет логи).
|
||||
|
||||
**Минимальные зависимости для production:** k8s кластер + S3 + Docker registry + Ingress.
|
||||
|
||||
## 2026-03-07 — Версионированные теги для runtime образов (не :latest)
|
||||
|
||||
**Решение:** Runtime базовые образы (`sless-runtime-python3.11`, `sless-runtime-nodejs20`) и образ оператора (`sless-operator`) тегируются по схеме `v<major>.<minor>.<patch>`. `:latest` не используется.
|
||||
|
||||
**Причина:**
|
||||
- `:latest` приводит к непредсказуемому поведению: kaniko может взять старый кешированный образ, pod не перезапускается если `imagePullPolicy: IfNotPresent`.
|
||||
- Версионированные теги дают явный контроль: при изменении runtime нужно обновить тег в `upload.go` → это принудительно пересобирает все функции с новым базовым образом.
|
||||
- Аудит и откат: можно пинить конкретную версию runtime.
|
||||
|
||||
**Соглашение:**
|
||||
- Runtime образы: `naeel/sless-runtime-{lang}:v{версия}` (например `v0.1.0`)
|
||||
- Оператор: `naeel/sless-operator:v{версия}`
|
||||
- При изменении runtime — инкрементировать минорную версию образа и обновить константу в `upload.go`
|
||||
|
||||
---
|
||||
|
||||
## 2026-03-07 — nodejs20 как второй поддерживаемый runtime
|
||||
|
||||
**Решение:** Добавлен nodejs20 runtime (`node:20-alpine` base, `server.js` HTTP wrapper, `exports.handle(event)`).
|
||||
|
||||
**Причина:** Node.js — стандарт для serverless (AWS Lambda, Vercel). Покрывает JS/TypeScript аудиторию. Паттерн идентичен python3.11: runtime image → kaniko → Deployment.
|
||||
|
||||
**Детали реализации:**
|
||||
- `runtimes/nodejs20/server.js` — `http.createServer`, динамический `require(HANDLER_PATH)`
|
||||
- Зависимости через `package.json` → `npm install --omit=dev` (аналог `requirements.txt` → `pip install`)
|
||||
- `entrypoint` в HCL игнорируется для Node.js (всегда `handler.js` + `exports.handle`) — TODO: поддержать произвольный entrypoint в v1.1
|
||||
|
||||
@@ -150,3 +150,44 @@ deployment.Spec.Template.Annotations["kubectl.kubernetes.io/restartedAt"] = time
|
||||
**Решение:** В `Makefile` заменить `CONTROLLER_TOOLS_VERSION ?= v0.11.1` на `v0.14.0`.
|
||||
|
||||
---
|
||||
|
||||
## 2026-03-07 — Dockerfile: operator не находит migrations/ при старте
|
||||
|
||||
**Проблема:** Оператор в кластере сразу падает в CrashLoopBackOff:
|
||||
```
|
||||
level=ERROR msg="read migration file" err="open migrations/001_initial.sql: no such file or directory"
|
||||
```
|
||||
**Причина:** Оригинальный `Dockerfile` копировал только `api/`, `controllers/`, `main.go`. Директории `internal/` и `migrations/` в образ не попадали.
|
||||
**Решение:** Добавить в оба stage Dockerfile:
|
||||
```dockerfile
|
||||
COPY internal/ internal/ # в builder stage
|
||||
COPY migrations/ migrations/ # и в builder, и в финальный alpine stage
|
||||
```
|
||||
`migrations/` нужен в финальном образе — оператор читает SQL-файлы в runtime при каждом старте.
|
||||
|
||||
---
|
||||
|
||||
## 2026-03-07 — Dockerfile: golang:1.23 несовместим с go.mod (требует 1.25)
|
||||
|
||||
**Проблема:** `docker build` падает на `go mod download`:
|
||||
```
|
||||
go: go.mod requires go >= 1.25 (running go 1.23.12; GOTOOLCHAIN=local)
|
||||
```
|
||||
**Причина:** В `go.mod` указан `go 1.25`, Dockerfile использовал `golang:1.23-alpine`.
|
||||
**Решение:** `FROM golang:1.23-alpine` → `FROM golang:1.25-alpine`.
|
||||
|
||||
---
|
||||
|
||||
## 2026-03-07 — go.mod: прямые зависимости помечены как indirect
|
||||
|
||||
**Проблема:** gopls показывал ошибки в `go.mod`:
|
||||
```
|
||||
github.com/gorilla/mux should be direct
|
||||
github.com/lib/pq should be direct
|
||||
github.com/minio/minio-go/v7 should be direct
|
||||
k8s.io/api should be direct
|
||||
```
|
||||
**Причина:** Пакеты получили `// indirect` несмотря на прямые импорты — побочный эффект scaffold-генерации operator-sdk.
|
||||
**Решение:** `go mod tidy` автоматически расставил правильные аннотации.
|
||||
|
||||
---
|
||||
|
||||
+9
-2
@@ -43,7 +43,7 @@
|
||||
| # | Компонент | Статус | Заметки |
|
||||
|---|-----------|--------|---------|
|
||||
| 1 | runtimes/python3.11/server.py | ✅ | HTTP wrapper :8080, loads /app/function/handler.py |
|
||||
| 2 | runtimes/python3.11/Dockerfile | ✅ | FROM python:3.11-slim, naeel/sless-runtime-python3.11:latest |
|
||||
| 2 | runtimes/python3.11/Dockerfile | ✅ | FROM python:3.11-slim, naeel/sless-runtime-python3.11:v0.1.0 |
|
||||
| 3 | Secret sless-registry-auth | ✅ | DockerHub creds для kaniko в namespace sless |
|
||||
| 4 | internal/api/handler/upload.go | ✅ | POST /v1/namespaces/{ns}/functions/{name}/upload |
|
||||
| 5 | Fix: kaniko S3 endpoint | ✅ | https:// + S3_FORCE_PATH_STYLE=true (Ceph) |
|
||||
@@ -58,6 +58,8 @@
|
||||
| 3 | Function phase=Ready, Deployment Running | ✅ namespace sless-fn-default |
|
||||
| 4 | `GET /health` | ✅ `{"status": "ok"}` |
|
||||
| 5 | `POST / {"name":"Naeel"}` | ✅ `{"message": "Hello, Naeel!"}` |
|
||||
| 6 | terraform apply (pg-query python3.11) | ✅ `{"invocations": [], "count": 0}` через https://sless-api.kube5s.ru |
|
||||
| 7 | hello-node (nodejs20) E2E | ✅ `{"message": "Hello, Naeel! (nodejs20)"}` |}
|
||||
|
||||
### Terraform провайдер (2026-03-07)
|
||||
|
||||
@@ -81,8 +83,13 @@
|
||||
|---|-----------|--------|---------|
|
||||
| 1 | terraform apply e2e — функция с postgres | ✅ | `{"invocations": [], "count": 0}` — функция подключилась к postgres.sless.svc, таблица пустая |
|
||||
| 2 | HTTP trigger e2e тест | ⏳ | Service+Ingress через TriggerController |
|
||||
| 3 | deployments/k8s/operator.yaml | ✅ | Deployment+Service+Ingress, naeel/sless-operator:v0.1.1, Running |
|
||||
| 3 | deployments/k8s/operator.yaml | ✅ | Deployment+Service+Ingress, naeel/sless-operator:v0.1.2, Running |
|
||||
| 4 | Внешний доступ к API оператора | ✅ | https://sless-api.kube5s.ru → HTTP/2 200, TLS cert OK |
|
||||
| 5 | DNS запись sless-api.kube5s.ru | ✅ | A → 5.172.178.182, TTL 3600, zone kube5s.ru |
|
||||
| 6 | nodejs20 runtime | ✅ | runtimes/nodejs20/server.js + Dockerfile, naeel/sless-runtime-nodejs20:v0.1.0 |
|
||||
| 7 | upload.go: nodejs20 + package.json | ✅ | runtimeBaseImage switch, hasPackageJSON → npm install |
|
||||
| 8 | go.mod: direct/indirect fix | ✅ | go mod tidy — gorilla/mux, lib/pq, minio-go, k8s.io/api помечены direct |
|
||||
| 9 | Runtime образы: версионированные теги | ✅ | python3.11:v0.1.0, nodejs20:v0.1.0 (убираем :latest) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user