feat: proxy /fn/{namespace}/{name} — обход wildcard DNS
Проблема: wildcard DNS *.fn.kube5s.ru недоступен.
Решение: прокси через sless-api.kube5s.ru/fn/{ns}/{name}.
- handler/invoke.go: прокси к Service функции внутри кластера
- router.go: /fn/ без auth токена, /v1/ с auth (gorilla Use())
- config.go: поле ExternalURL (EXTERNAL_URL env)
- trigger_controller.go: если ExternalURL задан — URL = ExternalURL/fn/{ns}/{fn}
иначе fallback: Ingress + поддомен (прежнее поведение)
- operator.yaml: EXTERNAL_URL=https://sless-api.kube5s.ru, image v0.1.5
Оператор v0.1.5 задеплоен.
E2E: curl https://sless-api.kube5s.ru/fn/default/hello-node → {"message":"Hello, Naeel! (nodejs20)"}
This commit is contained in:
+13
-6
@@ -17,9 +17,14 @@ import (
|
||||
|
||||
// NewRouter собирает gorilla/mux роутер со всеми маршрутами.
|
||||
// apiToken — статический Bearer-токен для v1 аутентификации.
|
||||
// /fn/{namespace}/{name} — публичный прокси для вызова функций, без auth.
|
||||
func NewRouter(h *handler.Handler, apiToken string, log *slog.Logger) http.Handler {
|
||||
r := mux.NewRouter()
|
||||
|
||||
// Публичный прокси для вызова HTTP-триггеров — без auth токена
|
||||
// Все HTTP методы разрешены (GET/POST/PUT/... — решает сама функция)
|
||||
r.PathPrefix("/fn/{namespace}/{name}").HandlerFunc(h.InvokeFunction)
|
||||
|
||||
// Суброутер для /v1 — все маршруты API
|
||||
v1 := r.PathPrefix("/v1").Subrouter()
|
||||
|
||||
@@ -47,10 +52,12 @@ func NewRouter(h *handler.Handler, apiToken string, log *slog.Logger) http.Handl
|
||||
v1.HandleFunc("/namespaces/{namespace}/jobs/{name}", h.GetJob).Methods(http.MethodGet)
|
||||
v1.HandleFunc("/namespaces/{namespace}/jobs/{name}", h.DeleteJob).Methods(http.MethodDelete)
|
||||
|
||||
// Цепочка middleware: logging → auth → router
|
||||
// Порядок важен: сначала логируем (чтобы видеть все запросы включая отклонённые),
|
||||
// затем проверяем авторизацию.
|
||||
return middleware.Logging(log,
|
||||
middleware.Auth(apiToken, log, r),
|
||||
)
|
||||
// Цепочка middleware: logging → (auth только для /v1/) → router
|
||||
// /fn/ — без auth, /v1/ — с auth.
|
||||
// Используем gorilla/mux Use() чтобы auth применялся только к v1 суброутеру.
|
||||
v1.Use(func(next http.Handler) http.Handler {
|
||||
return middleware.Auth(apiToken, log, next)
|
||||
})
|
||||
|
||||
return middleware.Logging(log, r)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user