40 Cluster DNS

40.1 Einführung

Cluster DNS ist ein zentraler Bestandteil der Service-Discovery in Kubernetes. Es ermöglicht Pods, andere Services im Cluster über DNS-Namen anstelle von IP-Adressen zu finden. Diese DNS-Namensauflösung erleichtert die Verwaltung und Skalierbarkeit von Anwendungen, da sich IP-Adressen häufig ändern können, DNS-Namen jedoch konstant bleiben.

40.2 Funktionsweise von Cluster DNS

In Kubernetes wird ein DNS-Server innerhalb des Clusters betrieben, der für die Namensauflösung von Services und Pods zuständig ist. Der DNS-Server arbeitet zusammen mit dem kube-dns- oder CoreDNS-Add-On, das standardmäßig in Kubernetes-Clusters installiert ist.

40.3 DNS-Namensschema

Kubernetes verwendet ein spezifisches Namensschema, um Services und Pods im Cluster eindeutig zu identifizieren:

Service DNS-Namensschema:

<service_name>.<namespace>.svc.cluster.local

Pod DNS-Namensschema:

<hostname>.<namespace>.pod.cluster.local

40.4 Konfiguration von CoreDNS

CoreDNS ist das bevorzugte DNS-Add-On in Kubernetes und bietet eine flexible und erweiterbare Lösung zur DNS-Verwaltung. Es wird typischerweise als Deployment in einem Cluster betrieben und konfiguriert über eine ConfigMap.

Beispiel einer CoreDNS ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }

40.5 Verwendung von Cluster DNS

Cluster DNS wird automatisch konfiguriert und in Pods eingebettet. Pods nutzen den DNS-Server, um Service-Namen in IP-Adressen aufzulösen. Dies geschieht durch das Einfügen eines DNS-Servers in die /etc/resolv.conf Datei jedes Pods.

Beispiel einer /etc/resolv.conf Datei in einem Pod:

nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

40.6 Service Discovery mit Cluster DNS

Mit Cluster DNS können Sie einfach auf Services im Cluster zugreifen, indem Sie ihre DNS-Namen verwenden. Dies ermöglicht eine dynamische und flexible Kommunikation zwischen Pods und Services.

Beispiel einer Service-Namensauflösung:

Angenommen, es gibt einen Service my-service im Namespace default, können Sie auf ihn zugreifen, indem Sie den DNS-Namen my-service.default.svc.cluster.local verwenden.

Beispiel eines Pods, der einen Service aufruft:

apiVersion: v1
kind: Pod
metadata:
  name: dns-test
  namespace: default
spec:
  containers:
  - name: dns-test
    image: busybox
    command:
      - sleep
      - "3600"

Verwenden Sie kubectl exec, um in den Pod zu gelangen und den DNS-Namen aufzulösen:

kubectl exec -it dns-test -- nslookup my-service

Die Ausgabe sollte die IP-Adresse des my-service zurückgeben, was zeigt, dass die DNS-Auflösung funktioniert.

40.7 Troubleshooting

Wenn DNS-Probleme auftreten, können Sie die folgenden Schritte unternehmen, um das Problem zu diagnostizieren:

  1. Überprüfen Sie den CoreDNS-Pod-Status:

    kubectl get pods -n kube-system -l k8s-app=kube-dns
  2. Logs der CoreDNS-Pods überprüfen:

    kubectl logs -n kube-system -l k8s-app=kube-dns
  3. DNS-Tests in einem Pod durchführen:

    kubectl exec -it <pod_name> -- nslookup <service_name>
  4. CoreDNS ConfigMap überprüfen und anpassen:

    Stellen Sie sicher, dass die CoreDNS ConfigMap korrekt konfiguriert ist und keine Syntaxfehler enthält.

Cluster DNS ist ein unverzichtbares Werkzeug in Kubernetes, das die dynamische und flexible Namensauflösung innerhalb eines Clusters ermöglicht. Ein solides Verständnis von Cluster DNS und seiner Konfiguration ist entscheidend für die effektive Verwaltung und den Betrieb von Kubernetes-Clusters. Es vereinfacht die Service-Discovery und verbessert die Skalierbarkeit und Flexibilität von Anwendungen erheblich.