NodeLocal DNSCache einrichten

Auf dieser Seite wird erläutert, wie Sie NodeLocal DNSCache in einem GKE-Cluster (Google Kubernetes Engine) konfigurieren. NodeLocal DNSCache verbessert die DNS-Lookup-Latenz, sorgt für einheitlichere DNS-Lookup-Zeiten und verringert die Anzahl der DNS-Abfragen an kube-dns durch die Ausführung eines DNS-Caches auf jedem Clusterknoten.

Eine Übersicht über die Funktionsweise von Service Discovery und des verwalteten DNS in GKE finden Sie unter Service Discovery und DNS.

Übersicht

NodeLocal DNSCache ist ein optionales GKE-Add-on, das Sie neben kube-dns ausführen können. NodeLocal DNSCache ist als DaemonSet implementiert und führt auf jedem Knoten in Ihrem Cluster einen DNS-Cache aus. Wenn ein Pod eine DNS-Anfrage stellt, wird die Anfrage an den DNS-Cache gesendet, der auf demselben Knoten wie der Pod ausgeführt wird. Wenn der Cache die DNS-Anfrage nicht auflösen kann, leitet er die Anfrage weiter an:

  • Cloud DNS für externe Hostnamenabfragen. Diese Abfragen werden vom lokalen MetaData Server, der auf demselben Knoten wie der Pod ausgeführt wird, von dem die Abfrage stammt, an Cloud DNS weitergeleitet.
  • kube-dns für alle anderen DNS-Abfragen. Der kube-dns-upstream-Dienst wird von node-local-dns-Pods verwendet, um eine Verbindung zu kube-dns-Pods herzustellen.

Diagramm: Pfad einer DNS-Anfrage, wie im vorherigen Abschnitt beschrieben

Pods müssen nicht geändert werden, um NodeLocal DNSCache zu verwenden. NodeLocal DNSCache verbraucht Rechenressourcen auf jedem Knoten Ihres Clusters.

Vorteile von NodeLocal DNSCache

  • Kürzere durchschnittliche DNS-Lookup-Zeit
  • Verbindungen von Pods zu ihrem lokalen Cache erstellen keine Tabelleneinträge vom Typ conntrack. Dadurch werden unterbrochene und abgelehnte Verbindungen aufgrund von erschöpften conntrack-Tabellen und Race-Bedingungen verhindert.

Details

  • Für NodeLocal DNSCache ist GKE Version 1.15 oder höher erforderlich.
  • Verbindungen zwischen dem lokalen DNS-Cache und kube-dns verwenden zugunsten einer höheren Zuverlässigkeit TCP anstelle von UDP.
  • DNS-Abfragen für externe URLs (URLs, die nicht auf Clusterressourcen verweisen) werden direkt an den lokalen Cloud DNS-Metadatenserver weitergeleitet, wobei kube-dns umgangen wird.
  • Die lokalen DNS-Caches übernehmen automatisch Stub-Domains und Upstream-Nameserver, die in der kube-dns ConfigMap angegeben sind.

  • DNS-Einträge werden für die folgende Dauer im Cache gespeichert:

    • Die TTL des Datensatzes oder 30 Sekunden, wenn die TTL mehr als 30 Sekunden beträgt.
    • 5 Sekunden, wenn die DNS-Antwort NXDOMAIN lautet.
  • NodeLocal DNSCache-Pods überwachen Port 53, 9253 und 8080 auf den Knoten. Wenn Sie einen anderen Hostnetzwerk-Pod mit den oben genannten Ports ausführen oder hostPorts mit den oben genannten Ports konfigurieren, schlägt NodeLocal DNSCache fehl und führt zu DNS-Fehlern.

NodeLocal DNSCache aktivieren

Sie können NodeLocal DNSCache in einem vorhandenen Cluster oder beim Erstellen eines neuen Clusters aktivieren. Das Aktivieren von NodeLocal DNSCache in einem vorhandenen Cluster ist ein unterbrechender Vorgang. Alle Clusterknoten mit GKE 1.15 und höher werden neu erstellt. Knoten werden gemäß dem GKE-Verfahren für das Knotenupgrade neu erstellt.

gcloud

NodeLocal DNSCache in einem neuen Cluster aktivieren

Verwenden Sie das Flag --addons NodeLocalDNS, um NodeLocal DNSCache in einem neuen Cluster zu aktivieren:

gcloud container clusters create cluster-name \
  --zone compute-zone \
  --cluster-version cluster-version \
  --addons NodeLocalDNS

Dabei gilt:

  • cluster-name: Der Name des neuen Clusters.
  • compute-zone: Die Zone für Ihren Cluster.
  • cluster-version: Die Version für Ihren Cluster (1.15 oder höher).

NodeLocal DNSCache in einem vorhandenen Cluster aktivieren

Mit dem Flag --update-addons=NodeLocalDNS=ENABLED können Sie NodeLocal DNSCache in einem vorhandenen Cluster aktivieren:

gcloud container clusters update cluster-name \
  --update-addons=NodeLocalDNS=ENABLED

Console

Mit der Google Cloud Console können Sie NodeLocal DNSCache beim Erstellen eines neuen Clusters aktivieren.

  1. Rufen Sie in der Cloud Console die Seite "Kubernetes-Cluster erstellen" auf.

    Seite mit den Kubernetes-Clustern aufrufen

  2. Geben Sie für Name cluster-name ein.

  3. Wählen Sie für Zone die Option us-central1-a aus.

  4. Geben Sie für Anzahl der Knoten den Wert 1 ein.

  5. Klicken Sie links auf der Seite auf Netzwerk.

  6. Klicken Sie unter Erweiterte Netzwerkoptionen das Kästchen NodeLocal DNSCache aktivieren an.

  7. Klicken Sie auf Erstellen.

Prüfen, ob NodeLocal DNSCache aktiviert ist

Rufen Sie eine Liste der node-local-dns-Pods ab, um festzustellen, ob NodeLocal DNSCache ausgeführt wird. Auf jedem Knoten mit GKE-Version 1.15 oder höher sollte ein node-local-dns-Pod ausgeführt werden.

kubectl get pods -n kube-system -o wide | grep node-local-dns

NodeLocal DNSCache deaktivieren

NodeLocal DNSCache kann mit gcloud deaktiviert werden:

gcloud container clusters update cluster-name \
  --update-addons=NodeLocalDNS=DISABLED

Probleme bei NodeLocal DNSCache beheben

Allgemeine Informationen zur Diagnose von Kubernetes DNS-Problemen finden Sie unter Debugging bei der DNS-Zuordnung.

Pod-Konfiguration prüfen

Zum Prüfen, ob ein Pod NodeLocal DNSCache verwendet, schauen Sie in /etc/resolv.conf auf dem Pod nach, ob der Pod für die Verwendung des richtigen Nameservers konfiguriert ist:

kubectl exec -it pod-name -- cat /etc/resolv.conf | grep nameserver

Die Nameserver-IP-Adresse sollte der IP-Adresse entsprechen, die durch den folgenden Befehl ausgegeben wird:

kubectl get svc -n kube-system kube-dns -o jsonpath="{.spec.clusterIP}"

Wenn die in /etc/resolv.conf konfigurierte Nameserver-IP-Adresse nicht übereinstimmt, müssen Sie die Konfiguration so ändern, dass die richtige Nameserver-IP-Adresse verwendet wird.

Netzwerkrichtlinie mit NodeLocal DNSCache

Wenn Sie NetworkPolicy mit dem NodeLocalDNS-Add-on verwenden, sind zusätzliche Regeln erforderlich, damit node-local-dns-Pods DNS-Abfragen senden und empfangen können. Verwenden Sie eine ipBlock-Regel in Ihrer NetworkPolicy, um die Kommunikation zwischen node-local-dns-Pods und kube-dns zu ermöglichen:

spec:
  egress:
  - ports:
    - port: 53
      protocol: TCP
    - port: 53
      protocol: UDP
    to:
    - ipBlock:
        cidr: kube-dns-cluster-ip/32
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

Ersetzen Sie kube-dns-cluster-ip durch die IP-Adresse des Dienstes "kube-dns", die Sie abrufen mithilfe:

kubectl get svc -n kube-system kube-dns -o jsonpath="{.spec.clusterIP}"

In diesem Beispiel wird eine ipBlock-Regel verwendet, da node-local-dns-Pods im hostNetwork:True-Modus ausgeführt werden. Eine matchLabels-Regel stimmt nicht mit diesen Pods überein.

Nächste Schritte