CoreDNS SERVFAIL window took out CI, Flux, and external-secrets (08:29 to 08:54 UTC, 2026-08-25) #926
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#926
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?
Cluster DNS on kai-server returned SERVFAIL for external names for roughly 25 minutes. Everything that needed to resolve a name outside the cluster failed in that window. It has since recovered on its own, so this is a hardening and root-cause issue rather than an active outage.
What failed
Three
coilysiren/websiteActions runs on the same push, each dying at the identical line:test(id 42788), workflowmirror-to-github.ymlpublish(id 42791), workflowpublish-image.ymlScan for secrets(id 42792), workflowtrufflehog.ymlAll three call
docker login forgejo.coilysiren.methroughscripts/ci/run-in-container.shorscripts/publish-image.sh, so one DNS failure took all three. Note the split inside a single job:actions/checkoutsucceeded because it usesforgejo.forgejo.svc.cluster.local, and the image pull failed because the registry constant is the public hostname. The git path has no external-DNS dependency and the container path does.Same SERVFAIL, same resolver, other consumers:
external-secretsinautheliaandsirens-deep:Post "https://ssm.us-east-1.amazonaws.com/": dial tcp: lookup ssm.us-east-1.amazonaws.com on 10.43.0.10:53: server misbehavingat 08:53:49 through 08:54:05.flux-systemGitRepositoryflux-systemandbridge-deploy:unable to list remote for 'https://forgejo.coilysiren.me/...'with a context deadline, 08:52:44 and 08:53:16.Timeline
coredns/ready,traefik/ping,registry/v2/, bothexternal-secretswebhooks, andmetrics-serverreturning 500.traefikalso loggedUnAvailableLoadBalancer: There are no available nodes for LoadBalancer.tailscale status --peers=falsereadiness probes timed out inlunch-money-mcpandsirens-echo.bluesky-mcp) resolved and reached the public Bluesky API successfully.No pod is crash-looping now. CoreDNS has 8 restarts over 82 days, none recent. Node memory sits at 40 percent with no memory PSI, and Ready/MemoryPressure/PIDPressure are all healthy.
Standing config smell
The kubelet has been truncating the node's nameserver list continuously, 31,357 occurrences on the CoreDNS pod alone:
So CoreDNS's own upstream set is the LAN router, an IPv6 router address, and Tailscale MagicDNS. Tailscale was itself timing out at 08:30, which leaves the router as the only healthy upstream during the window. That is inference from the event correlation rather than something confirmed from CoreDNS logs, and CoreDNS logs from the window would settle it.
Worth considering
resolv.confto three usable nameservers so kubelet stops silently choosing which three survive.forwardupstream set rather than inheriting the truncated host list.hostsorrewriteentry pinningforgejo.coilysiren.meto the in-cluster ingress, so registry pulls and Flux stop depending on upstream resolution for a name the cluster already serves. The public name has to stay for TLS, so this maps the name rather than replacing it.publish-image.ymlpushes to the registry, and that is not a read.Root cause of the 08:29 wave itself is not established. I only had read-only node and Kubernetes API access, and pinning it needs host logs from that window.
Prior art I should have found before filing. This is not a new discovery, it is the failure the existing thread predicted and could not prove.
dig @192.168.0.194returning connection-refused on the host.The fix is written.
ansible/roles/k3s-configsetsresolv-confto/etc/rancher/k3s/resolv.confwith the single nameserver192.168.0.194, and installs20-k3s-pod-dns.confso systemd-resolved listens there.docs/ansible-k3s.mdexplains the reasoning: pods reach the host's split-DNS engine rather than copying a truncated upstream list. None of it is on kai-server.The applied nameserver line in this outage is the untrimmed one, which confirms the role is still unapplied.
What today adds, stated no more strongly than the evidence supports: the truncated set is the LAN gateway, an IPv6 gateway address, and Tailscale MagicDNS, and Tailscale probes were timing out at 08:30, minutes before CoreDNS began returning SERVFAIL. That is consistent with #811's unproven failure mode and does not establish it. CoreDNS logs from the window would.
So this issue is better read as the first observed cost of #923 rather than a separate DNS problem. If someone wants to fold it into #811, that is reasonable, though the incident timeline is worth keeping somewhere.