Veröffentlicht am

CoreDNS Troubleshooting: Kubernetes DNS Probleme lösen

Teilen:
Authors

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

PolicyVerhalten
ClusterFirst (Standard)CoreDNS fuer alles
DefaultDNS des Nodes (nicht CoreDNS!)
NoneMuss manuell ueber dnsConfig gesetzt werden
ClusterFirstWithHostNetCoreDNS 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

ProblemDiagnoseLoesung
CoreDNS nicht Runningkubectl get pods -n kube-system -l k8s-app=kube-dnskubectl rollout restart deployment coredns
DNS-Aufloesung fehlgeschlagennslookup kubernetes.default im PodCoreDNS Logs und Corefile pruefen
Langsame Aufloesungtime nslookup api.example.comndots reduzieren oder FQDN mit Punkt
Loop detectedCoreDNS LogsUpstream-DNS explizit setzen
Service nicht aufloesbarnslookup svc.ns.svc.cluster.localEndpoints und Labels pruefen
Hohe Lastkubectl top pods -n kube-system -l k8s-app=kube-dnsSkalieren, 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


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