ser8 gaming runner evicted for exceeding its 24Gi docker-lib EmptyDir, ~1.6h after starting #808
Labels
No labels
burndown-2026-06
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/infrastructure#808
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What happened
forgejo-runner-ser8-gaming-0was evicted at 2026-08-13 05:57:30Z:Both containers were killed (
Stopping container dind,Stopping container runner) and the pod was rescheduled onto ser8 at 05:57:31, back up by 05:57:35.The pod it replaced had been created at 04:20:39Z. That is a ~1h37m lifetime before the DinD image/layer cache filled a 24Gi EmptyDir.
Why this matters
This is the gaming-org runner.
coilyco-gaming/sirens-echobuilds on it, and that repository is under active development right now — a Sirens Deep image rolled at 04:00Z and another push landed at 04:38Z, both inside the evicted pod's lifetime.An eviction mid-build fails the job with no useful message about cause, and the replacement pod starts with a cold Docker cache, so the next build is slower and fills the volume again. At a ~1.6h fill rate under load, this is a cycle rather than a one-off.
Evidence
From
get_k3s_node_healthon ser8, 24h window:Warning Evicted— EmptyDirdocker-libexceeds24Giforgejo-runner-ser8-gaming-0Killing— Stopping containerdindKilling— Stopping containerrunnerScheduled→ ser8Started—dind,runnerNode itself is healthy and not the constraint: ser8 reports
DiskPressure: False(unchanged 61d18h), 931GB allocatable ephemeral storage, 60GB memory. The 24Gi EmptyDir limit is the binding constraint, not the disk.Other ser8 runners use a PVC for
docker-librather than an EmptyDir —docker-lib-forgejo-runner-build-0anddocker-lib-forgejo-runner-build-flight-deck-0are both 10Gilocal-pathPVCs on kai-server. So the EmptyDir shape is not universal, and the two approaches have drifted.What I have not established
count: 1and the 24h window shows one occurrence. An eviction that has happened once in 24h is a different problem from one happening hourly. Event retention may also be hiding earlier ones — I would not read "one event" as "one occurrence".Suggested direction, not a prescription
Three options, in rough order of how much they change:
forgejo-runner-recycleCronJob on ser8 (last succeeded 19h30m ago) and aninit-wipe-docker-libinit container on the flight-deck build runner. Whether the gaming runner is in scope for either is worth checking — it may simply have been missed.Option 2 looks most likely to be the actual gap, since the machinery already exists.
Acceptance
Related
Next owner
Ops.
The first step in this issue cannot be run from an ops session
The body asks whether the eviction is recurrent, since the event carries
count: 1and retention may be hiding earlier ones. That check needskubectlagainst ser8, and the guarded surface has only one context:So from ops I can reach kai-server and not ser8. The ser8
node-statsMCP fills part of the gap — node conditions, pod inventory, restart counts, container memory, a bounded recent event window — which is how the eviction was spotted at all. What it does not expose is anything historical or per-object: nodescribe, no container termination reasons, no event history beyond its window.Concretely, this blocks:
forgejo-runner-ser8-gaming-0has evicted before, and how often.node-stats-exporteron ser8 isOOMKilled. On kai-server the equivalent question was settled in onekubectl describe(see coilyco-bridge/deploy#433, where it corrected a wrong diagnosis of mine).That asymmetry is worth naming on its own: ser8 runs Agent Proxy, LiteLLM, SigNoz, and five Forgejo runners, and an ops session can observe it but not interrogate it. Both of the ser8 findings from this morning's sweep end at the same wall, and in the one case where the same wall existed on kai-server, crossing it reversed the conclusion.
Not proposing a specific fix — whether that is a second kubectl context, a widened node-stats surface, or deliberately keeping ser8 out of reach is a design call rather than a gap to patch. Recording it because two open issues now depend on it.