- Authors

- Name
- Phillip Pham
- @ddppham
TL;DR
DNS-Fehler in Kubernetes liegen meist an falsch konfigurierten ndots-Werten, überlasteten CoreDNS-Pods oder fehlerhaften Corefile-Einträgen. Mit einem Debug-Pod, CoreDNS-Logging und gezielter ndots-Anpassung lassen sich 90% der DNS-Probleme in Minuten lösen. Dieser Guide zeigt die systematische Fehlersuche.
DNS-Debugging in Kubernetes mit CoreDNS
Wenn Pods keine Services erreichen, externe APIs nicht auflösen oder Startzeiten unerklärlich lang sind — die Ursache ist überraschend oft DNS. CoreDNS ist die zentrale Komponente für Namensauflösung in jedem Kubernetes-Cluster, und Fehlkonfigurationen wirken sich auf alle Workloads aus.
CoreDNS-Status prüfen
Bevor du tiefer einsteigst, prüfe den Grundzustand:
# CoreDNS-Pods und ihre Verteilung
kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide
# Läuft der CoreDNS-Service?
kubectl get svc -n kube-system kube-dns
# Ressourcenverbrauch prüfen
kubectl top pods -n kube-system -l k8s-app=kube-dns
Ein häufiges Problem: CoreDNS läuft mit nur 2 Replicas, der Cluster hat aber 200+ Pods. Jeder DNS-Request geht über diese zwei Pods. Das führt zu Timeouts unter Last.
Der Debug-Pod: Dein wichtigstes Werkzeug
Starte einen Pod mit DNS-Tools, um Auflösungen direkt zu testen:
# Debug-Pod starten
kubectl run dns-debug --image=registry.k8s.io/e2e-test-images/agnhost:2.39 \
--restart=Never -- sleep infinity
# DNS-Auflösung testen
kubectl exec dns-debug -- nslookup kubernetes.default
kubectl exec dns-debug -- nslookup google.com
# Detaillierte DNS-Abfrage mit dig
kubectl exec dns-debug -- dig +search +short kubernetes.default.svc.cluster.local
kubectl exec dns-debug -- dig +trace google.com
Wenn nslookup kubernetes.default fehlschlägt, ist CoreDNS selbst das Problem. Wenn nur externe Domains scheitern, liegt es an der Upstream-DNS-Konfiguration.
Die häufigsten DNS-Probleme
Problem 1: NXDOMAIN bei Service-Auflösung
Der Pod kann einen Service im selben Namespace nicht finden.
# Fehlerbild
kubectl exec dns-debug -- nslookup my-service
# Server: 10.96.0.10
# ** server can't find my-service: NXDOMAIN
Ursache ist meistens der Namespace. Kubernetes DNS löst Service-Namen nur innerhalb des eigenen Namespaces ohne Suffix auf. Über Namespace-Grenzen hinweg brauchst du den FQDN:
# Funktioniert nur im selben Namespace
nslookup my-service
# Cross-Namespace: FQDN verwenden
nslookup my-service.other-namespace.svc.cluster.local
Problem 2: Langsame DNS-Auflösung durch ndots
Die ndots-Einstellung in /etc/resolv.conf bestimmt, wann Kubernetes die Search-Domains anhängt. Der Standard ist ndots:5 — das bedeutet: jeder Name mit weniger als 5 Punkten wird erst mit allen Search-Domains probiert.
# resolv.conf im Pod anschauen
kubectl exec dns-debug -- cat /etc/resolv.conf
# nameserver 10.96.0.10
# search default.svc.cluster.local svc.cluster.local cluster.local
# options ndots:5
Bei einem Request an api.example.com (2 Punkte, weniger als 5) probiert Kubernetes:
api.example.com.default.svc.cluster.local— NXDOMAINapi.example.com.svc.cluster.local— NXDOMAINapi.example.com.cluster.local— NXDOMAINapi.example.com— Treffer
Das sind 3 unnötige DNS-Queries pro Request. Fix: ndots im Pod-Spec anpassen oder FQDNs mit abschließendem Punkt verwenden.
apiVersion: v1
kind: Pod
metadata:
name: optimized-app
spec:
dnsConfig:
options:
- name: ndots
value: "2"
containers:
- name: app
image: my-app:latest
Problem 3: DNS-Timeouts unter Last
Wenn CoreDNS unter Last Timeouts produziert, hilft Skalierung und Node-Local-DNS-Cache.
# CoreDNS skalieren
kubectl scale deployment coredns -n kube-system --replicas=4
# Aktuelle Last prüfen
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=100 | grep -i "error\|timeout\|overflow"
Die Corefile verstehen und optimieren
Die Corefile ist die zentrale CoreDNS-Konfiguration. Sie steckt in einer ConfigMap:
kubectl get configmap coredns -n kube-system -o yaml
Eine typische Corefile sieht so aus:
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
Corefile-Optimierungen
DNS-Logging aktivieren für Debugging:
kubectl edit configmap coredns -n kube-system
.:53 {
log # <-- Logging aktivieren (temporär!)
errors
health {
lameduck 5s
}
# ... rest bleibt gleich
}
Nach dem Speichern die CoreDNS-Pods neustarten:
kubectl rollout restart deployment coredns -n kube-system
# Logs beobachten
kubectl logs -n kube-system -l k8s-app=kube-dns -f --tail=50
Cache-TTL erhöhen für weniger Upstream-Queries:
cache 60 {
success 9984 60
denial 9984 10
}
Spezifische Upstream-DNS für bestimmte Domains:
example.internal:53 {
forward . 10.0.0.53 10.0.0.54
cache 120
}
Das ist nützlich, wenn interne Domains über eigene DNS-Server aufgelöst werden müssen.
NodeLocal DNSCache
Für Cluster mit hohem DNS-Aufkommen ist NodeLocal DNSCache die effektivste Optimierung. Ein DaemonSet platziert einen DNS-Cache auf jedem Node:
# NodeLocal DNSCache deployen
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml
| Metrik | Ohne NodeLocal DNS | Mit NodeLocal DNS |
|---|---|---|
| DNS-Latenz (P99) | 5-15 ms | < 1 ms |
| CoreDNS-Last | Hoch bei > 100 Pods | Konstant niedrig |
| Cross-Node DNS | Ja (immer) | Nur bei Cache-Miss |
Monitoring mit Prometheus
CoreDNS exportiert Metriken auf Port 9153. Die wichtigsten für DNS-Debugging:
# Metriken direkt abfragen
kubectl exec -n kube-system deploy/coredns -- \
wget -qO- http://localhost:9153/metrics | head -30
# Wichtige Metriken:
# coredns_dns_requests_total - Gesamtzahl der Anfragen
# coredns_dns_responses_total{rcode="NXDOMAIN"} - Fehlgeschlagene Auflösungen
# coredns_forward_requests_total - Upstream-Anfragen
# coredns_cache_hits_total - Cache-Treffer
Ein hoher Anteil an NXDOMAIN-Responses deutet auf falsche ndots-Konfiguration oder fehlerhafte Service-Referenzen hin.
FAQ
Wie finde ich heraus, welcher Pod DNS-Probleme verursacht?
Aktiviere temporär das log-Plugin in der Corefile. Damit siehst du jede DNS-Anfrage mit Quell-IP. Über die Pod-IP kannst du den verursachenden Pod identifizieren. Deaktiviere das Logging danach wieder — es erzeugt erhebliche Log-Mengen.
Warum ist externe DNS-Auflösung langsam, aber interne schnell?
Fast immer liegt das an ndots. Interne Namen wie my-service werden direkt über die Search-Domains aufgelöst. Externe Namen wie api.stripe.com durchlaufen erst alle Search-Domains. Setze ndots auf 2 oder verwende FQDNs mit Trailing-Dot (api.stripe.com.).
Kann ich CoreDNS durch einen anderen DNS-Server ersetzen?
Technisch ja, aber es wird nicht empfohlen. CoreDNS ist der Standard seit Kubernetes 1.13 und das einzige offiziell unterstützte DNS-Plugin. Alternatives wie kube-dns sind veraltet.
Wie viele CoreDNS-Replicas brauche ich?
Als Faustregel: 1 Replica pro 100-150 Pods, mindestens 2 für Hochverfügbarkeit. Bei mehr als 500 Pods solltest du NodeLocal DNSCache einsetzen, statt nur Replicas hochzudrehen.
Was bedeutet der SERVFAIL-Fehler?
SERVFAIL zeigt an, dass CoreDNS die Upstream-DNS-Server nicht erreichen kann. Prüfe die forward-Konfiguration in der Corefile und ob die Upstream-Server aus dem Cluster-Netzwerk erreichbar sind.
Kubernetes ohne DevOps-Overhead?
Wir betreiben Ihre Kubernetes-Cluster 24/7 – Sie fokussieren auf Ihr Kerngeschäft. Ab 4.000€/Monat, DSGVO-konform, mit deutschem Support.
Kubernetes-Beratung gesucht?
Wir helfen deutschen Unternehmen bei der Kubernetes-Implementierung, Migration und Optimierung. DSGVO-konform und praxiserprobt.
📖 Verwandte Artikel
Weitere interessante Beiträge zu ähnlichen Themen
Kubernetes DNS Auflösung fehlgeschlagen: CoreDNS debuggen
Kubernetes DNS Auflösung fehlgeschlagen? Systematisches CoreDNS Debugging mit ndots, search domains und DNS Policy für schnelle Problemlösung.
CoreDNS Troubleshooting: Kubernetes DNS Probleme lösen
CoreDNS-Probleme systematisch debuggen: DNS-Auflösung testen, ndots konfigurieren, DNS-Policies verstehen und Performance optimieren.
Kubernetes Service nicht erreichbar: Netzwerk-Troubleshooting
Kubernetes Service antwortet nicht? Systematisches Netzwerk-Debugging von DNS über Selectors bis NetworkPolicies mit kubectl-Befehlen und Checkliste.
Ephemeral Containers: Live-Debugging in Kubernetes
Ephemeral Containers fuer Live-Debugging in Kubernetes nutzen. Mit kubectl debug laufende Pods analysieren, Distroless-Images debuggen und Netzwerkprobleme loesen.
Kubernetes Troubleshooting: Systematisch debuggen
Kubernetes-Probleme systematisch debuggen mit kubectl describe, logs und debug. Lösungen für ImagePullBackOff, CrashLoopBackOff, Pending Pods und DNS-Fehler.