CoreDNS ist der Standard-DNS-Server von Kubernetes. Er löst die Dienstnamen im Cluster auf (zum Beispiel mein-dienst.default.svc.cluster.local) und leitet alle anderen Anfragen an externe Nameserver weiter. Seit Kubernetes 1.13 (2018) hat CoreDNS den früheren Cluster-DNS kube-dns abgelöst.

Plugin-Architektur

CoreDNS ist in Go geschrieben und vollständig plugin-basiert: Jedes Plugin übernimmt eine DNS-Funktion, die Plugins werden in einer Kette nacheinander ausgeführt. Die Konfiguration steht in der Corefile, die beim Start geladen wird. Zwei Plugins sind für Kubernetes besonders wichtig: Das kubernetes-Plugin implementiert die DNS-Service-Discovery-Spezifikation von Kubernetes und bezieht seine Daten über die Kubernetes-API, das forward-Plugin reicht externe Anfragen an Upstream-Resolver weiter. Hinzu kommen Caching (mit TTL-Verwaltung) und Lastverteilung per Round-Robin.

Eine typische Corefile für einen Cluster sieht so aus:

.:53 {
    kubernetes cluster.local in-addr.arpa ip6.arpa
    forward . /etc/resolv.conf
    log
}

Betrieb in Kubernetes

CoreDNS läuft als Deployment im Namespace kube-system, meist mit zwei Replicas für Redundanz. Der zugehörige Service – traditionell weiterhin kube-dns genannt – bekommt eine feste Cluster-IP (üblicherweise 10.96.0.10), die in den /etc/resolv.conf der Pods eingetragen wird. Aufgelöst werden Namen nach dem Schema <dienst>.<namespace>.svc.cluster.local sowie Pod-Namen über <pod-ip>.<namespace>.pod.cluster.local.

CoreDNS ist ein CNCF-Projekt und seit 2019 graduated, also ein ausgereiftes Projekt der Cloud-Native-Foundation. In Clustern mit eBPF-basiertem Datenpfad wie Cilium lassen sich die DNS-Abfragen an CoreDNS direkt im Kernel beobachten und filtern – das eBPF dahinter macht die Service-Kommunikation zugleich schneller und transparenter.

Verwandte Grundlagen: Kubernetes, DNS, kube-apiserver, Namespace, Pod.