# Отчёт 2026-04-29 — Cron auth-цепочка, push URL, образ v1.3.9 ## Цель сессии Починить cron-триггер `croned`: функция не выполнялась по расписанию — 401 на каждый тик. Добиться полной цепочки: timer → function → сохранение метрик → отображение на `/cron`. --- ## Симптом В логах `timer` каждую минуту: ``` status_code: 401, body: "unauthorized: malformed token" url: http://router.fission/fission-function/fission-ffd1f598c169b0ae/croned/ ``` Страница `https://fission.kube5s.ru/cron` пустая — данных нет. --- ## Диагностика и устранение ### Проблема 1: timer → router без JWT Fission `timer` делает HTTP POST на `--routerUrl` без какой-либо аутентификации. Router требует `Authorization: Bearer `. Результат — 401. **Ключевые факты:** - `timer` читает URL **только** из CLI-аргумента `--routerUrl` (env `FISSION_ROUTER_URL` игнорируется) - Pod `timer` distroless — нет shell, env инспектируется через `jsonpath` - Сервис `fission-console` слушает на **порту 8090**, не 80 **Решение:** console-gateway — публичный endpoint `/fission-function///`, который сам получает JWT у router и проксирует запрос. Добавлено в `console/internal/api/handlers.go`: - `handleFissionFunctionGateway` — точка входа, парсит path - `invokeInternalFunction` — проксирует с Bearer-токеном - `getRouterToken` — получает JWT через `/auth/login` (с кэшем) - `buildInternalInvokeURL` — строит URL к router Зарегистрировано в `server.go` как **публичные** роуты (без `authMiddleware`): ```go mux.HandleFunc("/fission-function", s.handleFissionFunctionGateway) mux.HandleFunc("/fission-function/", s.handleFissionFunctionGateway) ``` Timer Deployment пропатчен: `--routerUrl` → `http://fission-console.fission.svc.cluster.local:8090` Образ пересобран: `naeel/fission-console:v1.3.9` (v1.3.8 был до добавления gateway-роута → 404). ### Проблема 2: push метрик без порта → timeout Python-функция `croned` в конце отправляет снимок метрик: ```python target = os.getenv("CRON_TARGET_URL", "http://fission-console.fission.svc.cluster.local/cron/api/metrics") ``` URL без `:8090` — service на 80 не слушает → `urlopen error timed out`. Метрики не сохранялись, `/cron` пустой. **Решение:** обновлён package `croned-pkg` на кластере (поле `spec.deployment.literal`): заменён default URL на `http://fission-console.fission.svc.cluster.local:8090/cron/api/metrics`. После обновления package удалены кэшированные pool-поды функции — подхватили новый код. ### Проблема 3: container name в Deployment При первом `kubectl set image` использовалось имя контейнера `fission-console` → ошибка. Реальное имя контейнера в Deployment `fission-console` — `console`. --- ## Результат (подтверждён в логах) ``` 06:31:00 POST /fission-function/fission-ffd1f598c169b0ae/croned/ [status 200] 06:31:00 POST /cron/api/metrics [функция запушила] 06:31:11 GET /cron/api/metrics [UI читает] ``` API `https://fission.kube5s.ru/cron/api/metrics` вернул `count: 2` и полные метрики. --- ## Итоговая архитектура cron ``` timer (*/1 * * * *) └─► POST http://fission-console.fission.svc.cluster.local:8090/fission-function//croned/ └─► console gateway: getRouterToken() + proxy └─► POST http://router.fission/fission-function//croned/ [Bearer jwt] └─► python pod: собирает /proc метрики └─► POST :8090/cron/api/metrics └─► cron_metrics.go: сохраняет в cronMetricHistory └─► GET /cron → cron.html: рендерит карточки + таблицу ``` --- ## Затронутые компоненты | Компонент | Изменение | |-----------|-----------| | `console/internal/api/handlers.go` | Добавлен gateway: `handleFissionFunctionGateway`, `invokeInternalFunction`, `getRouterToken`, `buildInternalInvokeURL` | | `console/internal/api/server.go` | Публичные роуты `/fission-function` и `/fission-function/` | | `console/deploy/console.yaml` | Тег `v1.3.8` → `v1.3.9` | | `CRON/CRON_TIMER_FIX_2026-04-29.md` | Детальная документация фикса | | `CRON/FISSION_CRON_NOTES.md` | Дополнен разделом про auth-цепочку и порт 8090 | | Live k8s: `fission/deploy/timer` | `--routerUrl` → `http://fission-console.fission.svc.cluster.local:8090` | | Live k8s: `fission-ffd1f598c169b0ae/package/croned-pkg` | URL push метрик добавлен `:8090` | --- ## Уроки - `timer` читает `--routerUrl` только из CLI-аргумента, env-переменная игнорируется. - Сервис `fission-console` на порту **8090** — без него любой internal HTTP-запрос timeout. - Container name в Deployment `fission-console` — `console`, не `fission-console`. - Distroless pod — нет shell, env/args читать только через `kubectl get -o jsonpath`. - Pool-поды функций кэшируют код — после обновления package нужно удалить старые поды.