Files
fission-console/CRON/FISSION_CRON_NOTES.md
Naeel 38f2641b31 docs(cron): document full auth chain fix and push URL bug 2026-04-29
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
2026-04-29 09:35:42 +03:00

5.3 KiB
Raw Permalink Blame History

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 <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-console8090/TCP
  • Любой internal URL к console должен включать :8090
  • Без порта HTTP-клиент идёт на 80 → i/o timeout