# Fission cron: наши выводы и факты Короткий локальный конспект, чтобы не искать повторно по сторонней документации. ## Что делает оригинальный Fission - Cron в Fission запускается штатным механизмом `TimeTrigger` / `timetrigger`. - `timer` — отдельный controller-под, который живет постоянно, пока deployment поднят. - `timer` смотрит только те namespace-ы, которые ему явно заданы при старте. - Когда наступает время, `timer` инициирует обычный Fission invoke через `router`. - Console не участвует в выполнении cron после создания/обновления `TimeTrigger`. ## Что важно для multi-namespace - Да, в Fission изначально заложена работа с несколькими namespace-ами. - Но это не "авто-перебор всего кластера". - Нужен явный watch-list, обычно через `FISSION_RESOURCE_NAMESPACES`. - Если namespace не входит в этот список, `timer` его `TimeTrigger` не увидит. ## Что делает наша console - Console создает или обновляет `TimeTrigger` в namespace пользователя. - В `TimeTrigger` задаются: - `spec.cron` - `spec.functionref` - `spec.method` - `spec.subpath` - После этого дальнейший запуск полностью делает Fission. - Console только управляет CRD и показывает состояние/метрики. ## Что мы выяснили в этом проекте - Основная проблема была не в cron-механизме Fission как таковом, а в visibility namespaces для `timer`. - `timer` сначала смотрел только `default`, поэтому user namespace был невидим. - Дополнительно, history на `/cron` хранится в памяти процесса console, поэтому rollout сбрасывает накопленные снимки. ## Практический вывод - Для cron важно не только создать `TimeTrigger`, но и убедиться, что `timer` watch-ит namespace пользователя. - Если `/cron` пустой после rollout, это может быть: - `timer` не видит namespace - `TimeTrigger` не создан - invoke не дошел до функции - snapshot не сохранился в `cron_metrics` - Console не запускает shell-команды в Kubernetes и не исполняет cron сама. - Console только создает CRD, а дальше работает штатный Fission controller path. --- ## Дополнение 2026-04-29 — auth-цепочка и push URL ### Проблема 1: timer → router → 401 Fission `timer` по умолчанию шлёт invoke прямо на `http://router.fission`, но router требует `Authorization: Bearer `. Timer токен не предоставляет → 401 на каждый тик. **Решение:** перенаправить `--routerUrl` timer-а через console-gateway: ``` http://fission-console.fission.svc.cluster.local:8090 ``` Console-gateway принимает запрос без auth, сам получает JWT у router и проксирует. **Важно:** Timer читает URL **только** из CLI-аргумента `--routerUrl`. Переменная окружения `FISSION_ROUTER_URL` игнорируется. Патч нужно делать через `kubectl patch deployment timer`. ### Проблема 2: push метрик без порта → timeout Python-функция пушит снимок метрик на: ``` http://fission-console.fission.svc.cluster.local/cron/api/metrics ``` Сервис `fission-console` слушает на порту **8090**, не 80. Без явного `:8090` — timeout. **Решение:** обновить `croned-pkg` (поле `spec.deployment.literal`) — заменить URL на: ``` http://fission-console.fission.svc.cluster.local:8090/cron/api/metrics ``` После обновления package — удалить кэшированные pool-поды функции, чтобы они перезагрузили код. ### Полная рабочая цепочка (с 06:31 2026-04-29) ``` timer (*/1 * * * *) └─► POST :8090/fission-function//croned/ console gateway └─► router.fission [Bearer jwt] └─► python pod → собирает метрики └─► POST :8090/cron/api/metrics ← ранее без :8090, timeout └─► cron_metrics.go сохраняет в память └─► GET /cron → cron.html рендерит таблицу ``` ### Порт 8090 — критично помнить - `kubectl -n fission get svc fission-console` → `8090/TCP` - Любой internal URL к console должен включать `:8090` - Без порта HTTP-клиент идёт на 80 → i/o timeout