CRON/CRON_TIMER_FIX_2026-04-29.md: - moved from doc/cron/ to CRON/ (correct location) CRON/FISSION_CRON_NOTES.md: - added section on timer->router 401 and resolution via console-gateway - documented push URL bug (missing :8090 -> timeout) - documented full working chain with timestamps - added reminder: console service port is 8090, not 80 doc/report-2026-04-29-cron-fix.md: - new session report: symptoms, diagnosis, all 3 problems fixed, architecture diagram, affected components table, lessons learned
5.3 KiB
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.cronspec.functionrefspec.methodspec.subpath
- После этого дальнейший запуск полностью делает Fission.
- Console только управляет CRD и показывает состояние/метрики.
Что мы выяснили в этом проекте
- Основная проблема была не в cron-механизме Fission как таковом, а в visibility namespaces для
timer. timerсначала смотрел толькоdefault, поэтому user namespace был невидим.- Дополнительно, history на
/cronхранится в памяти процесса console, поэтому rollout сбрасывает накопленные снимки.
Практический вывод
- Для cron важно не только создать
TimeTrigger, но и убедиться, чтоtimerwatch-ит namespace пользователя. - Если
/cronпустой после rollout, это может быть:timerне видит namespaceTimeTriggerне создан- 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 <jwt>. 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/<ns>/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