The schedule
The loop, live. Everything here would be a field in a CronJob spec on a platform that had one — the table on the right maps each of them to the code that replaces it.
Run history
What a CronJob would leave behind as completed Pods, minus having to go and find them.
Run 1 always says startup: the pod refreshes immediately and reports
unready until the cache is primed, so it never serves an empty page.
| # | Started | Trigger | Took | Items | Outcome |
|---|
Cached data
Live NS disruptions, or a simulator when no API key is set — the badge in the header says which, rather than putting a LIVE label on invented data. This is the cache every reader shares; it goes stale, loudly, rather than blank when the upstream is down.
What a CronJob would have done for you
Each row is a field you no longer get, and the code that replaces it. All of it is in
worker/scheduler.go, about 300 lines.
| CronJob field | Replaced by |
|---|---|
| schedule: | interval + wall-clock alignment on a fixed epoch |
| concurrencyPolicy: Forbid | one goroutine — overlap is impossible, not guarded |
| activeDeadlineSeconds: | a per-run context deadline |
| startingDeadlineSeconds: | missed-boundary accounting |
| backoffLimit: | exponential backoff to a ceiling |
| successfulJobsHistoryLimit: | a 20-entry ring buffer |
| kubectl create job --from= | the Run now button, through the same loop |
| one run per cluster | nothing — pinned to a single replica, see below |
coordination.k8s.io/Lease and RBAC to go
with it, and Central Station grants an app neither — so this is pinned to one replica and
says singleton_assumed in its own status rather than pretending otherwise.
Platform
What Central Station injected into this pod, read from the running process rather than from what we hoped it did.
network-policy: none, so any pod in any namespace
still can. See deploy/network-policy-gap.md.