CoreDNS is a DNS server written in Go whose entire behaviour is an ordered chain of plugins. Its configuration file, the Corefile, declares server blocks — a zone and a port — and inside each block a list of plugins in a fixed execution order. A query enters at the top of that chain and each plugin may answer it, rewrite it, record something about it, or pass it further down. There is no monolithic configuration language and no feature set to enable: adding a capability means adding a plugin line, and building a CoreDNS that does something the standard build cannot means compiling a plugin in.
That design is why CoreDNS replaced kube-dns as the cluster DNS in Kubernetes. The kubernetes plugin watches the API server for Services, Endpoints and EndpointSlices and answers according to the Kubernetes DNS specification: A and AAAA records at service.namespace.svc.cluster.local, SRV records for named ports, PTR records for reverse lookups, headless services resolving to the individual pod addresses, and ExternalName services returning a CNAME. What a pod then experiences is shaped as much by its own /etc/resolv.conf — the nameserver, the search list and ndots:5 — as by the server, which is why the single most common cluster DNS complaint is not a CoreDNS fault at all but the four extra queries that ndots produces before an external name resolves.
Outside Kubernetes the same binary is a competent general-purpose server. The file and auto plugins serve authoritative zones from standard zone files, hosts serves entries from a hosts-file format, forward proxies to upstream resolvers with health checking and policy, cache implements TTL-aware caching with serve-stale and prefetch, and rewrite and template manipulate queries and synthesise answers. errors, log, health, ready, prometheus and trace provide the operational surface, and loop, loadbalance, autopath, bufsize and acl handle the awkward realities of production resolution.
Why this skill matters now
Every Kubernetes cluster in existence runs CoreDNS, and DNS resolution sits underneath every request any workload makes. That combination makes it the highest-leverage component almost nobody on the platform team can read. When a service intermittently fails to reach another service, when latency has an unexplained five-second mode, when an external API resolves from one namespace and not another — the answer is in the Corefile, in resolv.conf, or in conntrack, and teams routinely burn days on it because nobody owns that knowledge.
The operational stakes rise as clusters grow. CoreDNS replica count, cache configuration, the forward plugin's upstream policy, NodeLocal DNSCache and the UDP behaviours of the underlying network all become capacity questions rather than defaults. Meanwhile the security surface has expanded: DNS over TLS and DNS over HTTPS to upstreams, split-horizon resolution between internal and external views, and query-level access control are now normal requirements rather than exotic ones.
And CoreDNS is not only cluster DNS. It is a genuinely capable authoritative and recursive server that teams increasingly use for internal zones, service discovery over etcd or Consul, and dynamic record generation from the platform's own state. Learning it once covers both jobs.