- Authors

- Name
- Phillip Pham
- @ddppham
Kubernetes DNS Probleme loesen: CoreDNS Troubleshooting Guide
TL;DR
- DNS-Probleme aeussern sich als Timeouts, fehlgeschlagene Service-Discovery oder langsame Verbindungen -- die Ursache ist fast immer CoreDNS.
- Erster Test:
kubectl exec debug-pod -- nslookup kubernetes.default-- wenn das fehlschlaegt, ist CoreDNS das Problem. - Haeufigste Ursachen: CoreDNS Pods nicht laufend, ndots:5 erzeugt zu viele Queries, DNS Policy falsch, Corefile-Fehler.
- ndots:5 (Standard) erzeugt bis zu 10 DNS-Queries pro Lookup. Fuer externe Domains einen Punkt am Ende verwenden (z.B.
google.com.). - CoreDNS Cache und Autopath-Plugin verbessern die DNS-Performance drastisch.
Wie DNS in Kubernetes funktioniert
Jeder Pod bekommt automatisch CoreDNS als DNS-Server. Die Datei /etc/resolv.conf im Pod sieht so aus:
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
Der Ablauf einer DNS-Anfrage: Pod fragt CoreDNS ueber die ClusterIP des kube-dns Service. Bei Cluster-internen Namen antwortet CoreDNS direkt. Bei externen Namen leitet CoreDNS an den Upstream-DNS weiter.
Der Diagnose-Workflow
Schritt 1: CoreDNS Status pruefen
# CoreDNS Pods
kubectl get pods -n kube-system -l k8s-app=kube-dns
# CoreDNS Service
kubectl get svc -n kube-system kube-dns
# CoreDNS Logs
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=50
Beide CoreDNS-Pods muessen Running sein:
NAME READY STATUS RESTARTS AGE
coredns-5dd5756b68-abc12 1/1 Running 0 30d
coredns-5dd5756b68-def34 1/1 Running 0 30d
Schritt 2: DNS-Aufloesung testen
# Debug-Pod starten
kubectl run dnsutils --restart=Never --rm -it \
--image=registry.k8s.io/e2e-test-images/jessie-dnsutils:1.7 \
-- /bin/bash
# Interne Aufloesung
nslookup kubernetes.default
nslookup kube-dns.kube-system.svc.cluster.local
# Externe Aufloesung
nslookup google.com
# Alternativ mit busybox
kubectl run dns-test --restart=Never --rm -it --image=busybox:1.36 \
-- nslookup kubernetes.default
Schritt 3: Corefile pruefen
kubectl get configmap coredns -n kube-system -o yaml
kubectl get endpoints kube-dns -n kube-system
Die 7 haeufigsten DNS-Probleme
1. CoreDNS Pods nicht Running
Ohne laufende CoreDNS-Pods gibt es keine DNS-Aufloesung.
kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide
kubectl describe pods -n kube-system -l k8s-app=kube-dns
kubectl logs -n kube-system -l k8s-app=kube-dns --previous
Loesung:
# CoreDNS neu starten
kubectl rollout restart deployment coredns -n kube-system
Bei OOMKilled die Memory-Limits erhoehen:
spec:
template:
spec:
containers:
- name: coredns
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
memory: 256Mi
2. Langsame DNS-Aufloesung (ndots Problem)
Das haeufigste DNS-Performance-Problem. Mit ndots:5 wird ein Hostname mit weniger als 5 Punkten zuerst mit allen Search-Domains versucht.
Ein Lookup von api.example.com (2 Punkte) erzeugt:
api.example.com.default.svc.cluster.local -> NXDOMAIN
api.example.com.svc.cluster.local -> NXDOMAIN
api.example.com.cluster.local -> NXDOMAIN
api.example.com -> Erfolg!
Das sind 4 Queries statt einer. Bei hohem Traffic enorme Last auf CoreDNS.
Loesung 1: FQDN mit abschliessendem Punkt
# In der Anwendungskonfiguration:
db_host: "postgres.production.svc.cluster.local." # Punkt am Ende!
api_url: "https://api.example.com." # Punkt am Ende!
Loesung 2: ndots im Pod reduzieren
spec:
dnsConfig:
options:
- name: ndots
value: "2"
containers:
- name: app
image: my-app:latest
Loesung 3: Autopath Plugin aktivieren
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
errors
health { lameduck 5s }
ready
autopath @kubernetes
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
3. DNS Policy falsch konfiguriert
| Policy | Verhalten |
|---|---|
| ClusterFirst (Standard) | CoreDNS fuer alles |
| Default | DNS des Nodes (nicht CoreDNS!) |
| None | Muss manuell ueber dnsConfig gesetzt werden |
| ClusterFirstWithHostNet | CoreDNS fuer Pods mit hostNetwork: true |
Haeufiger Fehler: Pod mit hostNetwork: true nutzt Standard-Policy und umgeht CoreDNS:
# FALSCH
spec:
hostNetwork: true
# dnsPolicy: ClusterFirst -> nutzt Node-DNS, nicht CoreDNS!
# RICHTIG
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
Manuelle DNS-Konfiguration:
spec:
dnsPolicy: None
dnsConfig:
nameservers:
- 10.96.0.10
- 8.8.8.8
searches:
- production.svc.cluster.local
- svc.cluster.local
options:
- name: ndots
value: "2"
4. CoreDNS Loop detected
Tritt auf, wenn CoreDNS seine eigene IP als Upstream-DNS verwendet. Passiert wenn /etc/resolv.conf auf dem Node auf 127.0.0.53 zeigt (systemd-resolved).
kubectl logs -n kube-system -l k8s-app=kube-dns | grep -i loop
Loesung: Explizite Upstream-DNS setzen
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
}
prometheus :9153
forward . 8.8.8.8 8.8.4.4 {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
5. Custom DNS-Eintraege
Interne Hostnamen auf bestimmte IPs zeigen lassen:
# Corefile mit hosts-Plugin
data:
Corefile: |
.:53 {
errors
health { lameduck 5s }
ready
hosts {
10.0.0.100 legacy-db.internal.company
10.0.0.101 erp-system.internal.company
fallthrough
}
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
6. Service nicht ueber DNS erreichbar
# Service und Endpoints pruefen
kubectl get svc my-service -n production
kubectl get endpoints my-service -n production
# DNS-Namen testen
kubectl exec debug-pod -- nslookup my-service # Im gleichen Namespace
kubectl exec debug-pod -- nslookup my-service.production # Mit Namespace
kubectl exec debug-pod -- nslookup my-service.production.svc.cluster.local # FQDN
Haeufige Ursache: Label-Selectors passen nicht.
kubectl get svc my-service -n production -o jsonpath='{.spec.selector}'
kubectl get pods -n production --show-labels
7. DNS-Performance optimieren
Bei Clustern mit mehr als 1000 Pods kann CoreDNS zum Engpass werden.
# CoreDNS skalieren
kubectl scale deployment coredns -n kube-system --replicas=4
Cache-Einstellungen optimieren:
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 60
}
prometheus :9153
forward . /etc/resolv.conf {
max_concurrent 2000
}
cache {
success 9984 60
denial 9984 10
prefetch 3 30s 20%
}
loop
reload
loadbalance round_robin
}
Zusammenfassung: Diagnose-Tabelle
| Problem | Diagnose | Loesung |
|---|---|---|
| CoreDNS nicht Running | kubectl get pods -n kube-system -l k8s-app=kube-dns | kubectl rollout restart deployment coredns |
| DNS-Aufloesung fehlgeschlagen | nslookup kubernetes.default im Pod | CoreDNS Logs und Corefile pruefen |
| Langsame Aufloesung | time nslookup api.example.com | ndots reduzieren oder FQDN mit Punkt |
| Loop detected | CoreDNS Logs | Upstream-DNS explizit setzen |
| Service nicht aufloesbar | nslookup svc.ns.svc.cluster.local | Endpoints und Labels pruefen |
| Hohe Last | kubectl top pods -n kube-system -l k8s-app=kube-dns | Skalieren, Cache optimieren |
Der wichtigste Tipp bei kubernetes dns problem Situationen: Starten Sie mit einem Debug-Pod und testen Sie mit nslookup. So unterscheiden Sie, ob das Problem bei CoreDNS, beim Netzwerk oder bei der Pod-Konfiguration liegt.
Verwandte Artikel
- Kubernetes Service nicht erreichbar Troubleshooting
- Kubernetes CrashLoopBackOff Troubleshooting
- Kubernetes Network Policies
- Kubernetes Monitoring und Observability
- CKA Zertifizierung Guide
Wenn Sie DNS-Performance-Probleme in Ihrem Cluster haben oder Hilfe bei der coredns konfiguration benoetigen, helfen wir gerne -- Kontakt aufnehmen.
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.
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.
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.