feat(coredns): declare the hairpin fix both clusters are running undeclared #976
No reviewers
Labels
No labels
burndown-2026-06
burndown-2026-08
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/advocate
role/director
role/exec
role/frontend
role/gamedev
role/human
role/platform
role/qa
role/science
role/sysadmin
state
ambient
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/infrastructure!976
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/mt75-coredns-hairpin"
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?
Closes the durability gap Vera recorded in agentic-os#1344. She applied the fix by hand to both clusters; this declares it so a rebuild cannot lose it.
Why it was drift
Both clusters run Flux. The applies were imperative, so neither ConfigMap is declared anywhere. Nothing prunes them, so nothing was going to break today - but a cluster rebuild loses the fix silently and brings the hairpin back.
What the key does
forgejo.coilysiren.meresolves to its tailnet address (100.69.164.66), so in-cluster traffic stops leaving the estate and transiting the router to reach a service on the same estate. Masqueraded once at flannel and again at the gateway, that hairpin degrades under concurrency rather than failing cleanly - which is why it presented as three 133-second connect timeouts inactions/checkoutbeside a clean HTTP 404 from the same host two minutes later.coredns-customrather than theCorefileConfigMap, because the latter is owned by a k3s Addon and reverts hand-edits. kai-server has already lostapi.coilysiren.meandeco.coilysiren.mehosts blocks exactly that way; they survive only in a stalelast-applied-configurationannotation.Transcribed from live state, not from the issue
This mattered. kai-server's ConfigMap also carries
ser8-observability.server, a tailnet forwarder unrelated to this incident. A manifest written from the issue text alone would have declared onlyforgejo.server, and Flux would then have deleted a working forwarder. Both keys are read out of the live object.ser8 had no
coredns-customat all before #1344, so its file is the whole content.Adoption is a no-op, proven
Declared content already equals live on both clusters, so Flux takes ownership without changing a byte. The cluster-level
KustomizationCRs were validated the same way: a server-side dry-run against ser8 renderscorednsas a clean addition with nothing else in the cluster dir differing, so the CR is schema-valid per the API server rather than per my reading.prune: falsematches every other Kustomization in this repo. This change adopts objects that already exist, and arming a prune on a CoreDNS input in the same commit that declares it is not a trade worth making. Promote it the wayinfrastructure.yamldocuments: observe, then flip.What this does not claim
It does not explain the incident. CI recovered on its own at 18:15Z, roughly twenty minutes before Vera's first apply, and she caught that herself rather than reporting a confirmed fix. Both ends of the window - 17:42Z breaking, ~18:15Z recovering - remain unexplained.
The fix prevents recurrence. It did not resolve this episode.
Scope
forgejo.coilysiren.meonly, per Kai. No other name is touched on either cluster.Verification:
pre-commit run --all-filesgreen, including yamllint and the k3s guards.