Build1 distinct publisher3 min readUpdated
A WordPress pod failed to reach MySQL on a third of page loads. The resolver error only surfaced because the object cache in the same pod was noisier than the application.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
A WordPress site on a Kubernetes platform began returning "Error establishing a database connection" on roughly one page load in three, and reloading fixed it [1]. According to a writeup on dev.to by the operators involved, MySQL was healthy the whole time: the real fault was a dead pod-network path to one of three CoreDNS replicas [12][15], and the reason it took so long to find is that the application swallowed the resolver error while another process in the same pod printed it in plain text [4][5].
The setup detail that decides everything: WORDPRESS_DB_HOST was set to mysql.cdn.svc.cluster.local, a hostname rather than an IP [2]. Every connection attempt therefore depended on a DNS lookup. The first wrong turn was the obvious one. SHOW GLOBAL STATUS LIKE 'Connection_errors_max_connections' returned zero, there was no saturation or slow queries, and direct connections from outside the cluster worked [3].
Nothing in the application log said otherwise, because WordPress does not log the database connection failure when WP_DEBUG is off [4]. That is the operational lesson worth keeping. The same pod also ran Redis for object caching, and Redis logged "Redis::connect(): getaddrinfo for wp-redis-cache failed: Temporary failure in name resolution" [5]. That is EAI_AGAIN, a DNS timeout [6], and since Redis also connects by hostname it was failing for the same reason as MySQL [7]. The author's rule: when a hostname-based dependency fails intermittently and silently, find a noisier hostname-based dependency in the same pod and read its log [19].
The second wrong turn was assuming CoreDNS itself was sick. All CoreDNS pods were Running and Ready, with no restarts and no errors in their logs [8]. There were three CoreDNS endpoints [9], and the failure rate was about one in three [1] - which is exactly what one dead endpoint out of three under round-robin produces [18]. Querying the Service ClusterIP cannot show you that, because it hides which backend answered and returns a mushy aggregate rate with no information about which one is bad [10].
The diagnostic that worked was mechanical: a busybox debug pod pinned to the affected node with nodeName, then 30 nslookups against each CoreDNS pod IP individually [11]. Two endpoints returned 30 of 30 successes; one returned 30 of 30 failures [12]. Because kube-dns round-robins across all three, a third of every lookup from that node went nowhere [13]. Repeating the same loop from a pod on a different node, the failing endpoint answered normally, which moved the fault from the pod to the link between two specific nodes [14].
The platform runs Weave, and Weave's control plane reported an established fastdp between those two nodes while pod-to-pod traffic across that link dropped 100 percent: a stale kernel datapath flow, reported healthy, forwarding nothing [15]. Deleting the weave-net pod on the affected node let the DaemonSet rebuild the datapath flows; it was back in about sixteen seconds, DNS went 30 for 30 from every endpoint, and the WordPress errors stopped [16].
Two things to watch. First, whether your own stack has a hostname dependency whose failures are invisible by default, since a silent resolver error turns a network fault into an application mystery [4]. Second, node-local DNS caching is the reflex hardening move, and in this case it was tried as a canary on one node and rolled back [17], so treat it as something to test per topology rather than adopt on faith. And treat overlay status output as a claim, not evidence: this link reported itself up while passing no traffic at all [15].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
A WordPress site on the platform started throwing "Error establishing a database connection" intermittently, roughly one page load in three; reloading sometimes worked and sometimes did not.
The pod's config set WORDPRESS_DB_HOST = mysql.cdn.svc.cluster.local, so WordPress reached MySQL through a hostname rather than an IP.
MySQL was checked first: SHOW GLOBAL STATUS LIKE 'Connection_errors_max_connections' returned zero, there was no saturation and no slow queries, the server was healthy, and direct connections from outside the cluster worked.
WordPress does not log the database connection failure when WP_DEBUG is off, so the failure was invisible in the application log.
The same pod ran Redis for object caching, and Redis logged: "Redis::connect(): getaddrinfo for wp-redis-cache failed: Temporary failure in name resolution".
"Temporary failure in name resolution" from getaddrinfo is EAI_AGAIN, a DNS timeout.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
First-hand diagnostic output, single publisher
The account is internally consistent and unusually concrete for a debugging post: quoted config value, MySQL status query result, verbatim Redis EAI_AGAIN error, the exact per-endpoint probe loop, its 30/0 output, a cross-node control test, and a verified post-fix result. That is strong evidence of what the author observed. It is capped well short of high confidence because everything comes from one publisher and one operator, endpoint IPs are anonymised, no timestamps or monitoring artefacts are included, and no independent party confirms either the Weave datapath fault or the recovery.
One operator's cluster; technique not shown beyond it
Adoption evidence is real but confined to a single small platform: a weave-net pod restart as remediation, a NodeLocal DNSCache canary that was rolled back, a switch to a static ClusterIP for the database host, and a disclosure that per-endpoint DNS probing is now a standing runbook step. There is no evidence of anyone else adopting the diagnostic pattern, no fleet or user-count data, and no indication of how widespread this Weave failure mode is.
Claims slightly understate a generalisable lesson
The headline ("DNS was failing 33% of the time. CoreDNS was fine.") is precisely what the published probe output shows, and the author actively deflates the obvious hardening narrative by reporting that the NodeLocal DNSCache canary was rolled back and explaining why. Framing stays scoped to one cluster and one topology rather than claiming a general Weave defect, so if anything the transferable diagnostic pattern is presented more modestly than the evidence would allow. The small negative rather than zero reflects that restraint.
Reputational upside, no product being sold
The author writes as the operator of the platform that suffered the incident, publishing on a developer community site. That carries a mild reputational incentive to look competent and to frame the outcome as resolved, and the post admits two wrong turns partly to build credibility. Offsetting factors are substantial: no product, license, or pricing is promoted, no vendor sponsorship is disclosed or implied, the third-party components discussed (Weave, CoreDNS, NodeLocal DNSCache) are not the author's, and the piece documents its own failed mitigation. Supplied sources contain no funding or commercial relationships to weigh further.
Credible single-operator account, uncorroborated
Mechanism, measurement, and fix hang together tightly and the diagnostic steps are reproducible by any reader with a similar cluster, which supports moderate confidence in the narrative as told. Confidence is held near the middle because the cluster has exactly one publisher and one witness, the Weave datapath fault is inferred from status-versus-behaviour divergence rather than packet-level or kernel-flow evidence, there is no recurrence or post-incident monitoring data, and the generalisability to non-stretched topologies is asserted rather than shown.
build
1,254 dead mutants, a 100% score, and a payment charged twice1 distinct publisher
build
Your Nodes Are Not Idle, They Are Reserved: The Requests Trap In Karpenter Consolidation1 distinct publisher
build
Rate limit your MCP servers, because a retrying agent turns one error into a billing incident1 distinct publisher
build
The 680 MB database that was really a 17 GB disk: self-hosted support platforms fail at month six1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 20, 2026