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:
“Naeel”
2026-03-07 18:36:03 +04:00
parent a6bc67de05
commit 2ee9cae6d2
6 changed files with 313 additions and 220 deletions
+11 -3
View File
@@ -41,10 +41,15 @@ type Config struct {
// BuilderImage — образ для сборки функций (kaniko или buildah)
BuilderImage string
// IngressHost — базовый домен для HTTP триггеров, например: fn.kube5s.ru
// URL функции будет: https://{funcName}-{namespace}.{IngressHost}
// IngressHost — базовый домен для HTTP триггеров (используется только
// если ExternalURL не задан, для обратной совместимости).
IngressHost string
// ExternalURL — публичный URL API сервера, например: https://sless-api.kube5s.ru
// Если задан, URL функции формируется как: {ExternalURL}/fn/{namespace}/{name}
// Это позволяет обойтись без wildcard DNS *.fn.
ExternalURL string
// APIToken — статический Bearer-токен для v1 REST API аутентификации.
// В prod заменить на вызов auth-сервиса.
APIToken string
@@ -117,12 +122,15 @@ func Load() (*Config, error) {
cfg.BuilderImage = v
}
// IngressHost — базовый домен для HTTP триггеров
// IngressHost — базовый домен для HTTP триггеров (fallback)
cfg.IngressHost = os.Getenv("INGRESS_HOST")
if cfg.IngressHost == "" {
cfg.IngressHost = "fn.kube5s.ru"
}
// ExternalURL — публичный URL сервиса для формирования URL функций
cfg.ExternalURL = os.Getenv("EXTERNAL_URL")
// APIToken — обязательный токен для REST API
cfg.APIToken = os.Getenv("SLESS_API_TOKEN")
if cfg.APIToken == "" {