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
6.1 KiB
Отчёт 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 <jwt>. Результат — 401.
Ключевые факты:
timerчитает URL только из CLI-аргумента--routerUrl(envFISSION_ROUTER_URLигнорируется)- Pod
timerdistroless — нет shell, env инспектируется черезjsonpath - Сервис
fission-consoleслушает на порту 8090, не 80
Решение: console-gateway — публичный endpoint /fission-function/<ns>/<fn>/,
который сам получает JWT у router и проксирует запрос.
Добавлено в console/internal/api/handlers.go:
handleFissionFunctionGateway— точка входа, парсит pathinvokeInternalFunction— проксирует с Bearer-токеномgetRouterToken— получает JWT через/auth/login(с кэшем)buildInternalInvokeURL— строит URL к router
Зарегистрировано в server.go как публичные роуты (без authMiddleware):
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 в конце отправляет снимок метрик:
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/<ns>/croned/
└─► console gateway: getRouterToken() + proxy
└─► POST http://router.fission/fission-function/<ns>/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 нужно удалить старые поды.