- Replace two-file zip (_userfn.cjs + main.js) with single-file approach - User code embedded via new Function(module, exports, code) for safe CJS isolation - Auto-adds status:200 when function omits it - Add fission-console technical README section (v0.6.7)
288 lines
8.8 KiB
Markdown
288 lines
8.8 KiB
Markdown
# Terraform Provider Fission (MVP)
|
||
|
||
Текущий MVP провайдера управляет Fission CRD через Kubernetes API:
|
||
- `fission_environment`
|
||
- `fission_package`
|
||
- `fission_function`
|
||
- `fission_http_trigger`
|
||
|
||
Все ресурсы поддерживают `terraform import` в формате `namespace/name`.
|
||
|
||
## Быстрый запуск (dev override)
|
||
|
||
1. Собрать бинарник провайдера:
|
||
|
||
```bash
|
||
cd terraform/provider
|
||
go build -o bin/terraform-provider-fission .
|
||
```
|
||
|
||
2. Положить бинарник в локальный каталог dev plugins:
|
||
|
||
```bash
|
||
mkdir -p ~/.terraform.d/dev-plugins/Nail/fission
|
||
cp terraform/provider/bin/terraform-provider-fission ~/.terraform.d/dev-plugins/Nail/fission/
|
||
```
|
||
|
||
3. Создать файл Terraform CLI config (пример `/tmp/terraformrc-fission`):
|
||
|
||
```hcl
|
||
provider_installation {
|
||
dev_overrides {
|
||
"nail/fission" = "/home/naeel/.terraform.d/dev-plugins/Nail/fission"
|
||
}
|
||
direct {}
|
||
}
|
||
```
|
||
|
||
4. Запустить пример:
|
||
|
||
```bash
|
||
cd examples/hello-python
|
||
TF_CLI_CONFIG_FILE=/tmp/terraformrc-fission terraform plan
|
||
TF_CLI_CONFIG_FILE=/tmp/terraformrc-fission terraform apply -auto-approve
|
||
```
|
||
|
||
## Тесты
|
||
|
||
Unit-тесты:
|
||
|
||
```bash
|
||
cd terraform/provider
|
||
go test ./...
|
||
```
|
||
|
||
Acceptance-тест (реальный кластер, опционально):
|
||
|
||
```bash
|
||
cd terraform/provider
|
||
ACCEPTANCE_TEST=1 KUBECONFIG=/home/naeel/.kube/config go test ./internal/client -run TestAcceptanceFissionCRUD -v
|
||
```
|
||
|
||
Импорт существующего ресурса (пример):
|
||
|
||
```bash
|
||
terraform import fission_environment.python default/tf-python-env
|
||
terraform import fission_package.hello default/tf-hello-pkg
|
||
terraform import fission_function.hello default/tf-hello-fn
|
||
terraform import fission_http_trigger.hello default/tf-hello-route
|
||
```
|
||
|
||
## Ограничения MVP
|
||
|
||
- `fission_package.source_dir` в текущей реализации ожидает один из файлов: `main.py`, `main.js`, `main.go`.
|
||
- Реализация ориентирована на Python flow через `spec.deployment.literal`.
|
||
- Дополнительные сценарии сборки (`build_command`, многофайловые архивы и т.д.) будут расширены в следующих этапах.
|
||
|
||
## Stress Suite (много функций + нагрузка)
|
||
|
||
Добавлен отдельный пример `examples/stress-suite`:
|
||
- 3 функции: `fast`, `cpu`, `json`
|
||
- 3 endpoint-а: `/stress/fast`, `/stress/cpu`, `/stress/json`
|
||
- Terraform разворачивает полный набор ресурсов для каждого endpoint.
|
||
|
||
Суровый нагрузочный прогон:
|
||
|
||
```bash
|
||
cd examples/stress-suite
|
||
TF_CLI_CONFIG_FILE=/tmp/terraformrc-fission terraform apply -auto-approve
|
||
./scripts/load_test.sh https://fission.kube5s.ru 900 90
|
||
```
|
||
|
||
Где:
|
||
- `900` — число запросов на endpoint
|
||
- `90` — параллелизм
|
||
|
||
---
|
||
|
||
# fission-console
|
||
|
||
Backend сервис для управления serverless-функциями поверх Fission.
|
||
Предоставляет REST API + embedded Web UI. Каждый пользователь изолирован в отдельном Kubernetes namespace.
|
||
|
||
## Деплой
|
||
|
||
| Параметр | Значение |
|
||
|---|---|
|
||
| Кластер | `kube5s.ru` |
|
||
| Namespace | `fission` |
|
||
| URL | `https://fission.kube5s.ru/console/` |
|
||
| Образ | `naeel/fission-console:<version>` |
|
||
| Порт | `8090` |
|
||
| Текущая версия | `v0.6.7` |
|
||
|
||
## Переменные окружения
|
||
|
||
| Переменная | По умолчанию | Описание |
|
||
|---|---|---|
|
||
| `PORT` | `8090` | Порт HTTP-сервера |
|
||
| `FISSION_ROUTER_URL` | `http://router.fission.svc.cluster.local` | URL Fission Router для invoke |
|
||
| `FISSION_INVOKE_TIMEOUT` | `20s` | Таймаут вызова функции |
|
||
| `REAPER_INTERVAL` | `5m` | Интервал очистки истёкших TTL |
|
||
| `FISSION_TEST_MODE` | `false` | Тестовый режим — отключает JWT, включает `X-Test-Sub` |
|
||
| `FISSION_SYSTEM_NAMESPACE` | `fission` | Namespace самого Fission |
|
||
| `KUBECONFIG` | — | Путь к kubeconfig (если не in-cluster) |
|
||
|
||
## Аутентификация
|
||
|
||
**Production:** `Authorization: Bearer <jwt>` через `/console/api/auth`.
|
||
|
||
**Test Mode** (`FISSION_TEST_MODE=true`):
|
||
|
||
```bash
|
||
curl -H "X-Test-Sub: user@example.com" https://fission.kube5s.ru/console/api/functions
|
||
```
|
||
|
||
## Изоляция по namespace
|
||
|
||
```
|
||
sub → SHA256(sub)[:8] → namespace = "fission-{16 hex chars}"
|
||
```
|
||
|
||
При первом обращении namespace + RoleBinding-и создаются автоматически. Namespace регистрируется в `FISSION_RESOURCE_NAMESPACES` всех Fission deployments.
|
||
|
||
## API
|
||
|
||
Базовый путь: `/console/api`
|
||
|
||
| Метод | Путь | Описание |
|
||
|---|---|---|
|
||
| `GET` | `/console/api/functions` | Список функций |
|
||
| `POST` | `/console/api/functions` | Создать функцию |
|
||
| `GET` | `/console/api/functions/{name}` | Получить функцию |
|
||
| `DELETE` | `/console/api/functions/{name}` | Удалить функцию |
|
||
| `PUT` | `/console/api/functions/{name}/code` | Обновить код |
|
||
| `POST` | `/console/api/functions/{name}/invoke` | Вызвать функцию |
|
||
| `GET` | `/console/api/environments` | Список environments |
|
||
| `GET` | `/console/api/packages` | Список packages |
|
||
| `GET` | `/console/api/httptriggers` | Список HTTP triggers |
|
||
|
||
### Создать функцию
|
||
|
||
```bash
|
||
curl -X POST https://fission.kube5s.ru/console/api/functions \
|
||
-H "X-Test-Sub: user@example.com" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"name": "hello",
|
||
"language": "nodejs",
|
||
"ttl": "1h",
|
||
"code": "module.exports = async function(ctx) { return { body: \"Hello!\" }; };"
|
||
}'
|
||
```
|
||
|
||
**Поля запроса:**
|
||
|
||
| Поле | Обязательно | Описание |
|
||
|---|---|---|
|
||
| `name` | да | Имя функции |
|
||
| `language` | да* | Язык: `nodejs`, `python`, `go`, `php`, `ruby`, `perl` |
|
||
| `environment` | да* | Имя существующего Environment CRD |
|
||
| `code` | да | Исходный код |
|
||
| `ttl` | нет | Время жизни: `30m`, `1h`, `7d`, `2m` |
|
||
| `entrypoint` | нет | Точка входа (auto-detect по языку) |
|
||
|
||
\* Одно из двух.
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"name": "hello",
|
||
"route": "/hello",
|
||
"httptrigger": "hello-route",
|
||
"package": "hello-pkg",
|
||
"expires_at": "2026-04-19T15:00:00Z"
|
||
}
|
||
```
|
||
|
||
### Вызвать функцию
|
||
|
||
```bash
|
||
curl -X POST https://fission.kube5s.ru/console/api/functions/hello/invoke \
|
||
-H "X-Test-Sub: user@example.com" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{}'
|
||
```
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"invoke_url": "http://router.fission.svc.cluster.local/hello",
|
||
"latency_ms": 268,
|
||
"status": 200,
|
||
"response_raw": "Hello!"
|
||
}
|
||
```
|
||
|
||
## Языки и формат кода
|
||
|
||
### NodeJS (рекомендуется)
|
||
|
||
```js
|
||
module.exports = async function(ctx) {
|
||
return { body: JSON.stringify({ ok: true }) };
|
||
};
|
||
```
|
||
|
||
- Node.js 22, ESM mode
|
||
- `status: 200` добавляется автоматически, если не указан
|
||
- Код изолируется через `new Function('module', 'exports', code)`
|
||
- Поддерживается `module.exports.handler`, `.main`, `.default`
|
||
|
||
### Python
|
||
|
||
```python
|
||
def main():
|
||
return {"body": '{"ok": true}', "status": 200}
|
||
```
|
||
|
||
### Go
|
||
|
||
```go
|
||
func Handler(w http.ResponseWriter, r *http.Request) {
|
||
w.Write([]byte("Hello!"))
|
||
}
|
||
```
|
||
|
||
## TTL
|
||
|
||
| Пример | Значение |
|
||
|---|---|
|
||
| `30m` | 30 минут |
|
||
| `1h` | 1 час |
|
||
| `7d` | 7 дней |
|
||
| `2m` | 2 минуты |
|
||
|
||
По истечении TTL функция + package + httptrigger удаляются reaperом. Пустой environment удаляется вместе с последней функцией.
|
||
|
||
## Health
|
||
|
||
```bash
|
||
curl https://fission.kube5s.ru/health
|
||
curl https://fission.kube5s.ru/console/health
|
||
```
|
||
|
||
## Сборка образа
|
||
|
||
```bash
|
||
cd console/
|
||
go build . # проверка компиляции
|
||
docker build -t naeel/fission-console:vX.Y.Z .
|
||
docker push naeel/fission-console:vX.Y.Z
|
||
kubectl set image deployment/fission-console console=naeel/fission-console:vX.Y.Z -n fission
|
||
```
|
||
|
||
## Changelog
|
||
|
||
### v0.6.7
|
||
- NodeJS: однофайловый zip (`main.js` с `new Function` wrapper)
|
||
- NodeJS: автоматический `status: 200` если функция не возвращает его
|
||
|
||
### v0.6.6
|
||
- NodeJS: упаковка кода в zip (ESM mode требует `.js`)
|
||
- NodeJS: исправлена точка входа (`main.main` → `main`)
|
||
- Namespace isolation: SHA256(sub)[:8]
|
||
- TTL + expiry reaper
|
||
- TEST_MODE
|
||
- Lazy Environment creation / cleanup
|