Terraform Provider Fission (MVP)
Текущий MVP провайдера управляет Fission CRD через Kubernetes API:
fission_environmentfission_packagefission_functionfission_http_trigger
Все ресурсы поддерживают terraform import в формате namespace/name.
Быстрый запуск (dev override)
- Собрать бинарник провайдера:
cd terraform/provider
go build -o bin/terraform-provider-fission .
- Положить бинарник в локальный каталог dev plugins:
mkdir -p ~/.terraform.d/dev-plugins/Nail/fission
cp terraform/provider/bin/terraform-provider-fission ~/.terraform.d/dev-plugins/Nail/fission/
- Создать файл Terraform CLI config (пример
/tmp/terraformrc-fission):
provider_installation {
dev_overrides {
"nail/fission" = "/home/naeel/.terraform.d/dev-plugins/Nail/fission"
}
direct {}
}
- Запустить пример:
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— число запросов на endpoint90— параллелизм
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 Functionwrapper) - 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