doc: switch provider MVP plan from REST v2 to Kubernetes CRD API
This commit is contained in:
+64
-47
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user