doc: switch provider MVP plan from REST v2 to Kubernetes CRD API

This commit is contained in:
Naeel
2026-04-14 21:53:34 +03:00
parent ef0f4e3c00
commit 2e775e73a4
+64 -47
View File
@@ -3,6 +3,20 @@
# Агент: GPT 5.3 Codex # Агент: GPT 5.3 Codex
# Домен: fission.kube5s.ru # Домен: fission.kube5s.ru
## ОБНОВЛЕНИЕ ПО ФАКТУ ПРОВЕРКИ В КЛАСТЕРЕ (2026-04-14)
Проверено на кластере `iot-naeel`:
- Fission `v1.22.1` поднят и работает (env/function/route через `fission` CLI успешны)
- путь `GET /v2/environments` через ingress (`185.247.187.151`) возвращает `404 page not found`
- отдельного `controller` service/deployment в текущем `fission-all` релизе нет
**Критичное решение:**
MVP провайдера делать через Kubernetes API (CRD Fission) с использованием `client-go`/dynamic client,
а не через REST `/v2/*`.
Provider продолжает управлять теми же сущностями (`Environment`, `Package`, `Function`, `HTTPTrigger`),
но операции Create/Read/Update/Delete выполняются через Kubernetes CRD ресурсы.
--- ---
## КОНТЕКСТ ПРОЕКТА ## КОНТЕКСТ ПРОЕКТА
@@ -17,20 +31,20 @@ Fission используется как managed FaaS-сервис в нашем
### Архитектура ### Архитектура
``` ```
Terraform Provider (Go) → HTTP → Fission Controller API (порт 443 через Ingress) Terraform Provider (Go) → Kubernetes API (client-go/dynamic) → Fission CRD
Fission делает всё сам: Fission делает всё сам:
- StorageSvc (PV, позже S3) - StorageSvc (PV, позже S3)
- Builder Manager → Builder Pods - Builder Manager → Builder Pods
- Executor → Function Pods - Executor → Function Pods
- Router → HTTP routing - Router → HTTP routing
``` ```
**Provider НЕ управляет S3, PV, Kubernetes напрямую.** Только HTTP-вызовы к Fission Controller REST API. **Provider НЕ управляет S3/PV напрямую.** Он управляет только Fission CRD через Kubernetes API.
Fission сам хранит код (StorageSvc), собирает (Builder), запускает (Executor), маршрутизирует (Router). Fission сам хранит код (StorageSvc), собирает (Builder), запускает (Executor), маршрутизирует (Router).
### Ключевые решения ### Ключевые решения
- Без proxy/operator — provider напрямую к Fission Controller API - Без proxy/operator — provider напрямую к Kubernetes API (Fission CRD)
- StorageSvc на PV (local storage) — позже мигрируем на S3 - StorageSvc на PV (local storage) — позже мигрируем на S3
- terraform-plugin-framework (НЕ старый SDKv2) - terraform-plugin-framework (НЕ старый SDKv2)
- Паттерны из существующего sless-провайдера (структура, client, build script) - Паттерны из существующего sless-провайдера (структура, client, build script)
@@ -75,6 +89,9 @@ Fission сам хранит код (StorageSvc), собирает (Builder), з
## FISSION API REFERENCE ## FISSION API REFERENCE
> ⚠️ Для текущей установки Fission v1.22.1 в этом кластере REST `/v2/*` недоступен (`404`).
> Раздел ниже оставлен как историческая справка; для реализации MVP использовать Kubernetes CRD API.
### Fission Controller REST API ### Fission Controller REST API
Fission Controller слушает на порте 8888 (внутри кластера) или через Ingress. Fission Controller слушает на порте 8888 (внутри кластера) или через Ingress.
@@ -323,7 +340,7 @@ helm install fission fission-charts/fission-all \
--set authentication.enabled=true --set authentication.enabled=true
``` ```
**0.2** Настроить Ingress на fission.kube5s.ru → Fission Router + Controller **0.2** Настроить Ingress на fission.kube5s.ru → Fission Router
**0.3** Установить fission CLI и проверить: **0.3** Установить fission CLI и проверить:
```bash ```bash
@@ -332,9 +349,10 @@ fission fn create --name hello --env python --code hello.py
fission fn test --name hello fission fn test --name hello
``` ```
**0.4** Проверить REST API: **0.4** Проверить CRD API через Kubernetes:
```bash ```bash
curl -H "Authorization: Bearer $TOKEN" https://fission.kube5s.ru/v2/environments kubectl get crd environments.fission.io functions.fission.io packages.fission.io httptriggers.fission.io
kubectl get environments -n default
``` ```
--- ---
@@ -350,20 +368,19 @@ curl -H "Authorization: Bearer $TOKEN" https://fission.kube5s.ru/v2/environments
- `.gitignore` — бинарники, .terraform, *.tfstate - `.gitignore` — бинарники, .terraform, *.tfstate
#### 1.2 Client (internal/client/client.go) #### 1.2 Client (internal/client/client.go)
HTTP-клиент к Fission Controller API. Клиент к Kubernetes API для работы с Fission CRD.
**Структура:** **Структура:**
```go ```go
package client package client
type Client struct { type Client struct {
httpClient *http.Client dynClient dynamic.Interface
endpoint string // https://fission.kube5s.ru k8sClient kubernetes.Interface
token string // Bearer JWT namespace string // namespace для функций (дефолт "default")
namespace string // namespace для функций (дефолт "fission-function")
} }
func New(endpoint, token, namespace string) *Client func New(kubeconfigPath, kubeContext, namespace string) (*Client, error)
// Environments // Environments
func (c *Client) CreateEnvironment(ctx, env) error func (c *Client) CreateEnvironment(ctx, env) error
@@ -390,30 +407,30 @@ func (c *Client) UpdateHTTPTrigger(ctx, trigger) error
func (c *Client) DeleteHTTPTrigger(ctx, name) error func (c *Client) DeleteHTTPTrigger(ctx, name) error
``` ```
**Формат запросов:** **Формат работы:**
- Content-Type: application/json (для CRUD) - dynamic client для CRD `*.fission.io`
- Content-Type: multipart/form-data (для upload в Package) - операции CRUD через Kubernetes API
- Authorization: Bearer <token> - Namespace через metadata и provider config
- Namespace в metadata объекта - код package загружается в `spec.source.literal` (base64 zip) для MVP
**ВАЖНО:** Размер client.go — целевой ~500-800 строк. Никакого S3, kaniko, polling. **ВАЖНО:** Размер client.go — целевой ~500-900 строк. Никакого S3, kaniko, polling.
#### 1.3 Provider (internal/provider/provider.go) #### 1.3 Provider (internal/provider/provider.go)
**Атрибуты провайдера:** **Атрибуты провайдера:**
```hcl ```hcl
provider "fission" { provider "fission" {
endpoint = "https://fission.kube5s.ru" # URL Fission Controller (env: FISSION_ENDPOINT) kubeconfig_path = "~/.kube/config" # env: KUBECONFIG
token = "xxx" # Bearer JWT (env: FISSION_TOKEN) kube_context = "" # env: KUBE_CONTEXT (optional)
namespace = "fission-function" # Namespace (env: FISSION_NAMESPACE, default: "fission-function") namespace = "default" # env: FISSION_NAMESPACE
} }
``` ```
**Configure():** **Configure():**
1. Прочитать endpoint (config → env FISSION_ENDPOINT → default "http://localhost:8888") 1. Прочитать kubeconfig_path (config → env KUBECONFIG)
2. Прочитать token (config → env FISSION_TOKEN → пусто = без auth) 2. Прочитать kube_context (config → env KUBE_CONTEXT)
3. Прочитать namespace (config → env FISSION_NAMESPACE → default "fission-function") 3. Прочитать namespace (config → env FISSION_NAMESPACE → default "default")
4. Создать Client 4. Создать Kubernetes dynamic client
5. Положить в resp.ResourceData и resp.DataSourceData 5. Положить в resp.ResourceData и resp.DataSourceData
**Resources():** **Resources():**
@@ -450,10 +467,10 @@ resource "fission_environment" "python" {
``` ```
**CRUD:** **CRUD:**
- Create: POST /v2/environments → JSON body - Create: Kubernetes `create` CRD `environments.fission.io`
- Read: GET /v2/environments/{name}?namespace={ns} - Read: Kubernetes `get` CRD `environments.fission.io`
- Update: PUT /v2/environments/{name} → JSON body - Update: Kubernetes `update` CRD `environments.fission.io`
- Delete: DELETE /v2/environments/{name}?namespace={ns} - Delete: Kubernetes `delete` CRD `environments.fission.io`
#### 1.5 Resource: fission_package #### 1.5 Resource: fission_package
@@ -477,10 +494,10 @@ resource "fission_package" "hello_pkg" {
source_dir и code_path — взаимоисключающие. source_dir и code_path — взаимоисключающие.
**CRUD:** **CRUD:**
- Create: zip source_dir или читаем code_path → POST /v2/packages (multipart) → poll build_status - Create: zip source_dir или читаем code_path → base64 → Kubernetes `create` CRD `packages.fission.io`
- Read: GET /v2/packages/{name} - Read: Kubernetes `get` CRD `packages.fission.io`
- Update: PUT /v2/packages/{name} (перезаливаем zip) - Update: Kubernetes `update` CRD `packages.fission.io`
- Delete: DELETE /v2/packages/{name} - Delete: Kubernetes `delete` CRD `packages.fission.io`
#### 1.6 Resource: fission_function #### 1.6 Resource: fission_function
@@ -521,10 +538,10 @@ resource "fission_function" "hello" {
``` ```
**CRUD:** **CRUD:**
- Create: POST /v2/functions → JSON body - Create: Kubernetes `create` CRD `functions.fission.io`
- Read: GET /v2/functions/{name} - Read: Kubernetes `get` CRD `functions.fission.io`
- Update: PUT /v2/functions/{name} - Update: Kubernetes `update` CRD `functions.fission.io`
- Delete: DELETE /v2/functions/{name} - Delete: Kubernetes `delete` CRD `functions.fission.io`
#### 1.7 Resource: fission_http_trigger #### 1.7 Resource: fission_http_trigger
@@ -546,10 +563,10 @@ resource "fission_http_trigger" "hello_route" {
``` ```
**CRUD:** **CRUD:**
- Create: POST /v2/triggers/http → JSON body - Create: Kubernetes `create` CRD `httptriggers.fission.io`
- Read: GET /v2/triggers/http/{name} - Read: Kubernetes `get` CRD `httptriggers.fission.io`
- Update: PUT /v2/triggers/http/{name} - Update: Kubernetes `update` CRD `httptriggers.fission.io`
- Delete: DELETE /v2/triggers/http/{name} - Delete: Kubernetes `delete` CRD `httptriggers.fission.io`
#### 1.8 Build & Publish (hack/build-and-publish.sh) #### 1.8 Build & Publish (hack/build-and-publish.sh)
Адаптировать из sless: Адаптировать из sless: