mrkeyoor.com_
Tue 01 Sept 17:43 UTC
Self-Hostedevaluationupdated 26 Aug 2026

coredns review

CoreDNS is a Go DNS server and forwarder that assembles DNS behavior from plugins. It can serve zones, forward queries, expose service records from Kubernetes, and handle encrypted DNS transports through one Corefile.

+10stars / 7d
Verdict

Our CoreDNS build took 175 seconds and 93 of 94 test packages passed, but TestAutoAXFR returned 0 records where it expected 5. CoreDNS is still the sensible choice for Kubernetes DNS or a plugin-shaped forwarder when your team can test the exact Corefile and binary it deploys. Choose Unbound for a validating recursive resolver, or another authoritative server if NSEC3 is mandatory.

We ran it

Lab card: what happened when we ran corednsScreenshot of coredns (coredns.io)
Install✓ · 89s429 packages
Build✓ · 175s
Tests✗ · 124s93 passed · 1 failed of 94 (go test)
Repo988 files~102,066 lines of source · 3.7 MB · 12 CI workflows · Dockerfile · tests dir

Answers from our run

Does coredns build from source?

Dependencies installed in 89 seconds (429 packages), and the build succeeded in 175 seconds. We cloned commit 4b26cce into a clean Debian container with 3 CPUs and no project-specific setup.

Do coredns's tests pass?

Not all of them: 93 of 94 passed and 1 failed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use coredns?

Operators seeking a validating recursive resolver with no upstream dependency: CoreDNS forwards those queries to another recursive nameserver.

What are the alternatives to coredns?

Unbound, BIND 9, PowerDNS. Our CoreDNS build took 175 seconds and 93 of 94 test packages passed, but TestAutoAXFR returned 0 records where it expected 5.

Setup3/5Build passed in 175 seconds; one integration package failed
Docs5/5Corefile, plugins, transports, deployment, and upgrades are documented
Community5/514,280 stars, an August 2026 push, and active issue work
Maturity5/5CNCF graduated project with v1.14.7 released in August 2026

Discussed on

  1. hnCoreDNS: DNS service discovery for the cloud58 points
  2. hnThe CoreDNS Cache Poisoning Conjecture52 points
  3. hnYou copy-pasted the output of a scanning tool. That's disrespectful5 points
  4. hnCloud Native Computing Foundation Becomes Steward of CoreDNS5 points
  5. hnKubernetes' Default CoreDNS Configuration Is *Insecure3 points

Who it’s for

Kubernetes platform teams that want DNS service discovery, Prometheus metrics, and health endpoints in one small server.
Network operators who need an authoritative server or forwarder with a precise, versioned Corefile.
Go developers prepared to compile a custom binary when an external DNS plugin is worth maintaining.
Infrastructure teams that need UDP, TCP, DoT, DoH, DoH3, DoQ, or gRPC listeners from the same project.

Who it’s NOT for

Operators seeking a validating recursive resolver with no upstream dependency: CoreDNS forwards those queries to another recursive nameserver.
Authoritative DNS teams that require NSEC3 signing: the README documents DNSSEC zone serving and on-the-fly signing with NSEC only.
Teams that need to add arbitrary plugins at runtime: external plugins must be compiled into a new CoreDNS binary.
Administrators who expect plugin order in the Corefile to control execution: the chain follows the static order in plugin.cfg instead.

Setup reality

Our sandbox install succeeded in 89 seconds and installed 429 packages. The build succeeded in 175 seconds. Tests failed after 124 seconds: 93 passed and 1 failed out of 94. TestAutoAXFR expected 5 resource records and received 0; the log also said the separate Prometheus import check did not run because faillint was absent.

Basic forwarding needs a Corefile and an upstream resolver address, with no account or API key. Kubernetes, etcd, Route 53, TLS, and other plugins bring their own services, access settings, certificates, or credentials.

Commit 4b26cce declares Go 1.25 as its minimum even though our labeled golang:1.24-bookworm image completed the build. Port 53 can already be occupied, so the README shows port 1053 for local trials. External plugins and a changed plugin chain require a recompile.

One binary handles authoritative zones, forwarding, and service discovery

CoreDNS builds a DNS server from plugins. The included set can read zone files, act as a secondary, forward requests to recursive nameservers, cache responses, pull records from Kubernetes or etcd, publish Prometheus metrics, and log queries. Listeners cover ordinary UDP and TCP plus DoT, DoH, DoH3, DoQ, and gRPC. That range makes CoreDNS useful where DNS behavior needs to follow infrastructure rather than a fixed appliance menu.

The design stays understandable because the Corefile names each job. A minimal block can run whoami on port 1053; another can forward every name to an upstream resolver. More involved blocks can serve a signed zone, permit transfers, rewrite selected questions, and send the rest elsewhere. The repository contains 988 files and about 102,066 source lines, so the simple configuration sits on top of a substantial network service that deserves normal production review.

What happened when we ran it

Our sandbox installed 429 packages in 89 seconds from commit 4b26cce. The checkout occupied 3.7 MB before that install, and the build completed successfully in 175 seconds. We used an unprivileged Debian container with 3 CPUs and 8 GB of RAM. Those numbers describe a source checkout and build, not the precompiled release archives that CoreDNS also publishes.

The test command ended with exit code 1 after 124 seconds. Go reported 93 passed packages and 1 failed package out of 94. The failing integration test was TestAutoAXFR: it expected a DNS response containing 5 resource records and received 0. The tail gives no cause, so it would be wrong to blame networking, permissions, or timing. It establishes only that this commit did not pass the complete command in our sandbox.

The same log said TestPrometheusImports was not executed because faillint was not found. That message is separate from the named TestAutoAXFR failure and should be treated separately. CoreDNS had 12 CI workflow files, a Dockerfile, and a tests directory in our scan. The project clearly invests in automated checks, yet the exact 94-package run still needs a clean result before promoting a custom build.

A Corefile is short, while its plugin order is fixed elsewhere

CoreDNS reads Corefile from the working directory unless -conf points elsewhere. A basic forwarder needs an upstream DNS address, while DoT, DoH3, and DoQ listeners need the appropriate TLS material. The Kubernetes, etcd, and Route 53 plugins depend on those systems and their access configuration. Basic whoami or forwarding use does not require a hosted account.

There is one configuration trap worth learning early. The order of plugin names in a Corefile does not set execution order; plugin.cfg does. CoreDNS registers plugins at compile time and assembles the chain in that static order. With 429 packages installed in our source run, a custom binary is something to pin and reproduce, not rebuild casually on whichever operator laptop happens to have Go.

CoreDNS forwards recursion and signs with NSEC only

CoreDNS can cover several DNS roles, but it does not replace every DNS daemon. The README describes the forward plugin as sending queries to another recursive nameserver. If you need a resolver that performs recursive lookups and DNSSEC validation itself, Unbound fits that job more directly. This distinction matters in failure planning because the upstream resolver remains part of the request path.

Authoritative use has a similar boundary. CoreDNS can serve DNSSEC-signed zone data and sign on the fly, while the documented support is NSEC only. A team that requires NSEC3 should walk away rather than assuming another Corefile stanza will add it. The 175-second build passed in our run, but rebuilding cannot create a feature that the project's own capability list excludes.

External plugins turn configuration work into release engineering

The in-tree catalog covers common jobs, and the -plugins flag shows what a given binary contains. An external plugin must be registered and compiled into CoreDNS. That is a reasonable Go extension model for infrastructure teams, though it changes the ownership burden: your binary, plugin version, compilation inputs, tests, and upgrade path now form one release artifact.

Health and readiness also need deliberate configuration. The health plugin exposes an HTTP endpoint, by default on port 8080, and the separate ready plugin reports whether participating plugins are ready. During lameduck shutdown, health can still return 200 while readiness stops reporting OK. Load balancers and Kubernetes probes should use those signals for their stated meanings instead of treating one successful URL as proof that DNS answers are available.

August 2026 activity supports a serious production trial

GitHub recorded a push on August 26, 2026, and v1.14.7 was published on August 19. That release included changes across cache behavior, forwarding, encrypted transports, Kubernetes records, zone transfers, and overload controls. GitHub also showed 14,280 stars, 218 open issues, and 88 open pull requests when fetched. The combined repository count of 306 therefore represents issues and pull requests, not 306 confirmed defects.

CoreDNS is mature enough to shortlist without hand-waving: it is a CNCF graduated project, publishes releases, documents a staged deprecation policy, and has had 2 named third-party security audits. Our failed 94-package run prevents an unconditional recommendation of the measured commit. For Kubernetes DNS, a policy-heavy forwarder, or a compact authoritative service within its NSEC limit, test the final Corefile and compiled plugin set as a single deployable unit.

Alternatives

ProjectWhat it isPick it when
UnboundA validating recursive and caching DNS resolver.pick this instead when recursive resolution and DNSSEC validation are the main job.
BIND 9A long-running authoritative and recursive DNS server with a wide feature set.pick this instead when one established daemon must handle full recursion as well as authoritative zones.
PowerDNSA suite containing separate authoritative, recursive, and DNS traffic components.pick this instead when you want dedicated authoritative and recursor services plus dnsdist in one project family.

What people are saying

  1. [github-trending] coredns/coredns

Sources

  1. CoreDNS README
  2. CoreDNS repository
  3. CoreDNS v1.14.7 release
  4. CoreDNS plugin manual
  5. CoreDNS health plugin documentation
  6. Measured CoreDNS commit 4b26cce

More self-hosted reviews

v2 · OpenShell · wigolo · Mindwtr · club-3090 · reclip · the whole board →