“Naeel” 1fa92e069f feat: переменные окружения функций (env vars в CRD)
- Backend: handleGetFunctionEnvVars / handlePutFunctionEnvVars в function_crud.go
- API: GET/PUT /functions/:name/envvars
- handleGetFunction теперь возвращает env_vars в ответе
- Frontend: блок env vars в edit modal (key=value + [×] + [+ Добавить])
- TF-функции показывают env vars в режиме read-only
- Документация: doc/descriptions/function-envvars-flow.md
- Версия v1.3.72
2026-05-09 06:50:52 +04:00

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. Собрать бинарник провайдера:
cd terraform/provider
go build -o bin/terraform-provider-fission .
  1. Положить бинарник в локальный каталог dev plugins:
mkdir -p ~/.terraform.d/dev-plugins/Nail/fission
cp terraform/provider/bin/terraform-provider-fission ~/.terraform.d/dev-plugins/Nail/fission/
  1. Создать файл Terraform CLI config (пример /tmp/terraformrc-fission):
provider_installation {
  dev_overrides {
    "nail/fission" = "/home/naeel/.terraform.d/dev-plugins/Nail/fission"
  }
  direct {}
}
  1. Запустить пример:
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-тесты:

cd terraform/provider
go test ./...

Acceptance-тест (реальный кластер, опционально):

cd terraform/provider
ACCEPTANCE_TEST=1 KUBECONFIG=/home/naeel/.kube/config go test ./internal/client -run TestAcceptanceFissionCRUD -v

Импорт существующего ресурса (пример):

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.

Суровый нагрузочный прогон:

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):

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

Создать функцию

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 по языку)

* Одно из двух.

Ответ:

{
  "name": "hello",
  "route": "/hello",
  "httptrigger": "hello-route",
  "package": "hello-pkg",
  "expires_at": "2026-04-19T15:00:00Z"
}

Вызвать функцию

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 '{}'

Ответ:

{
  "invoke_url": "http://router.fission.svc.cluster.local/hello",
  "latency_ms": 268,
  "status": 200,
  "response_raw": "Hello!"
}

Языки и формат кода

NodeJS (рекомендуется)

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

def main():
    return {"body": '{"ok": true}', "status": 200}

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

curl https://fission.kube5s.ru/health
curl https://fission.kube5s.ru/console/health

Сборка образа

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.mainmain)
  • Namespace isolation: SHA256(sub)[:8]
  • TTL + expiry reaper
  • TEST_MODE
  • Lazy Environment creation / cleanup
S
Description
No description provided
Readme
1.2 MiB
Languages
Go 82.3%
HTML 17.3%
Shell 0.2%
Dockerfile 0.2%