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
97 lines
5.3 KiB
Markdown
97 lines
5.3 KiB
Markdown
# 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
|