Files
fission-console/CRON/FISSION_CRON_NOTES.md
T
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

97 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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-console``8090/TCP`
- Любой internal URL к console должен включать `:8090`
- Без порта HTTP-клиент идёт на 80 → i/o timeout