- Authors

- Name
- Phillip Pham
- @ddppham
Kubernetes DNS Auflösung fehlgeschlagen: CoreDNS debuggen
TL;DR
DNS-Probleme in Kubernetes liegen in 3 von 4 Fällen an fehlerhaften CoreDNS Pods, falscher DNS Policy oder zu hohen ndots-Werten. Prüfen Sie zuerst den CoreDNS Pod-Status, dann die /etc/resolv.conf im betroffenen Pod und testen Sie die Auflösung mit nslookup gegen den ClusterIP des kube-dns Service.
3 von 4 Fällen, in denen DNS in Kubernetes nicht funktioniert, lassen sich auf eine Handvoll Ursachen eingrenzen. Bevor Sie stundenlang Netzwerk-Policies durchgehen: Starten Sie hier.
# CoreDNS Pods prüfen - laufen sie überhaupt?
kubectl get pods -n kube-system -l k8s-app=kube-dns
# DNS-Auflösung direkt testen
kubectl run dns-test --rm -it --image=busybox:1.36 --restart=Never -- nslookup kubernetes.default
Wenn der erste Befehl Pods im Status CrashLoopBackOff oder Pending zeigt, ist die Ursache klar. Wenn die Pods laufen, aber der nslookup fehlschlägt, wird es interessanter.
CoreDNS Pods prüfen und reparieren
CoreDNS startet nicht (CrashLoopBackOff)
Die häufigste Ursache: eine fehlerhafte Corefile-Konfiguration oder ein Loop-Problem, bei dem CoreDNS seine eigene Adresse als Upstream-Server verwendet.
# Logs prüfen
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=50
# ConfigMap der Corefile anschauen
kubectl get configmap coredns -n kube-system -o yaml
Ein typischer Fehler in den Logs:
[FATAL] plugin/loop: Loop (127.0.0.1:43523 -> :53) detected for zone ".", see https://coredns.io/plugins/loop#troubleshooting
Das bedeutet: CoreDNS leitet Anfragen an sich selbst weiter. Der Fix hängt von Ihrer Umgebung ab:
| Umgebung | Ursache | Lösung |
|---|---|---|
| Bare Metal / systemd-resolved | /etc/resolv.conf zeigt auf 127.0.0.53 | forward . 8.8.8.8 8.8.4.4 in Corefile |
| Cloud (EKS/GKE/AKS) | Fehlende Node DNS Config | Node DNS prüfen, ggf. forward auf VPC DNS |
| kubeadm | Host /etc/resolv.conf mit localhost | resolvconf auf Nodes korrigieren |
Corefile anpassen
kubectl edit configmap coredns -n kube-system
Eine funktionierende Standard-Corefile:
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
Nach der Änderung CoreDNS-Pods neustarten:
kubectl rollout restart deployment coredns -n kube-system
ndots und search domains verstehen
Dieses Problem ist tückisch, weil alles zu funktionieren scheint, nur langsam. Schauen Sie sich die resolv.conf im betroffenen Pod an:
kubectl exec my-app -- cat /etc/resolv.conf
Typische Ausgabe:
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
Der Wert ndots:5 bedeutet: Jeder Name mit weniger als 5 Punkten wird zuerst mit allen search domains probiert. Wenn Ihre Anwendung api.example.com auflöst (2 Punkte), generiert Kubernetes diese DNS-Queries:
api.example.com.default.svc.cluster.local-- schlägt fehlapi.example.com.svc.cluster.local-- schlägt fehlapi.example.com.cluster.local-- schlägt fehlapi.example.com-- funktioniert
Das sind 4 Queries statt einer. Bei hohem Traffic multipliziert sich das.
ndots reduzieren
Für Pods, die hauptsächlich externe Domains auflösen:
spec:
dnsConfig:
options:
- name: ndots
value: "2"
Alternative: Fügen Sie einen abschließenden Punkt an den Hostnamen an (api.example.com.), um die search domain Expansion komplett zu umgehen.
DNS Policy richtig setzen
Kubernetes bietet vier DNS Policies. Die falsche Wahl ist eine häufige Fehlerquelle:
| DNS Policy | resolv.conf zeigt auf | Anwendungsfall |
|---|---|---|
| ClusterFirst (Default) | CoreDNS | Normale Pods im Cluster |
| Default | Node DNS | Pod braucht nur Host-DNS |
| ClusterFirstWithHostNet | CoreDNS | Pods mit hostNetwork: true |
| None | Manuell via dnsConfig | Volle Kontrolle |
Ein klassischer Fehler: Pods mit hostNetwork: true verwenden standardmäßig die DNS Policy Default -- sie nutzen dann den DNS-Server des Nodes statt CoreDNS und können keine Services im Cluster auflösen.
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet # Das ist der Fix
CoreDNS Performance-Probleme diagnostizieren
Wenn DNS grundsätzlich funktioniert, aber langsam oder unzuverlässig ist:
# CoreDNS Metriken prüfen (wenn Prometheus läuft)
kubectl port-forward -n kube-system svc/kube-dns 9153:9153
curl http://localhost:9153/metrics | grep coredns_dns_request_duration
# Anzahl der DNS-Anfragen pro Sekunde
curl -s http://localhost:9153/metrics | grep coredns_dns_requests_total
Bei hoher Last auf CoreDNS helfen diese Maßnahmen:
# CoreDNS Replicas erhöhen
kubectl scale deployment coredns -n kube-system --replicas=3
# Oder NodeLocal DNSCache einsetzen (empfohlen ab 50+ Nodes)
# Das installiert einen DNS-Cache auf jedem Node
NodeLocal DNSCache
Ab einer gewissen Clustergröße lohnt sich NodeLocal DNSCache. Es spart Netzwerk-Hops und entlastet CoreDNS:
# Prüfen ob NodeLocal DNSCache läuft
kubectl get ds -n kube-system | grep node-local-dns
Debugging-Checkliste
Wenn Sie nicht weiterkommen, arbeiten Sie diese Liste durch:
# 1. CoreDNS Pods laufen?
kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide
# 2. kube-dns Service hat Endpoints?
kubectl get endpoints kube-dns -n kube-system
# 3. DNS direkt gegen CoreDNS IP testen
kubectl run dns-debug --rm -it --image=nicolaka/netshoot --restart=Never \
-- dig @10.96.0.10 kubernetes.default.svc.cluster.local
# 4. Network Policy blockiert DNS?
kubectl get networkpolicy -A | grep -i dns
# 5. DNS vom Node aus testen (SSH auf den Node)
nslookup kubernetes.default.svc.cluster.local 10.96.0.10
FAQ
Warum funktioniert nslookup im Pod nicht, aber ping schon?
Ping nutzt die libc-Auflösung und liest /etc/hosts. nslookup fragt direkt den DNS-Server. Wenn /etc/hosts einen Eintrag hat, funktioniert Ping, aber nslookup scheitert trotzdem. Prüfen Sie die resolv.conf im Pod.
Kann ich externe DNS-Server statt CoreDNS verwenden?
Technisch ja, aber dann verlieren Sie die Service Discovery im Cluster. Besser: CoreDNS so konfigurieren, dass es externe Queries an Ihren bevorzugten DNS-Server weiterleitet.
Wie finde ich heraus, ob eine Network Policy den DNS-Traffic blockiert?
DNS läuft über UDP Port 53. Prüfen Sie mit kubectl get networkpolicy -A -o yaml ob ausgehender Traffic auf Port 53 zum Namespace kube-system erlaubt ist. Viele Teams vergessen beim Einführen von Network Policies den DNS-Egress.
CoreDNS zeigt "SERVFAIL" -- was bedeutet das?
SERVFAIL bedeutet, dass CoreDNS die Anfrage zwar erhalten hat, aber den Upstream-Server nicht erreichen kann. Prüfen Sie die forward-Direktive in der Corefile und ob der Upstream DNS-Server vom Node aus erreichbar ist.
Wenn DNS-Probleme in Ihrem Cluster regelmäßig auftreten oder Sie Unterstützung beim Aufbau einer stabilen DNS-Infrastruktur brauchen, helfen wir gerne -- Kontakt aufnehmen.
Weiterführende Artikel:
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
CoreDNS Debugging: Kubernetes-DNS Probleme lösen
DNS-Probleme in Kubernetes systematisch debuggen: CoreDNS-Logs, ndots-Konfiguration, NXDOMAIN-Fehler und Corefile-Optimierung für schnellere Auflö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.
Kubernetes Ingress keine Adresse zugewiesen: Lösung
Kubernetes Ingress zeigt keine Address? Ursachen und Lösungen für fehlende IngressClass, nicht installierte Controller und Pending LoadBalancer.
Kubernetes Ingress 502, 503, 504 Fehler beheben
Ingress-Fehler systematisch lösen: 502 Bad Gateway, 503 Service Unavailable und 504 Timeout mit Ursachen, Debugging-Schritten und Fixes.