Freigeben über


Behandeln von DNS-Fehlern in einem AKS-Cluster in Echtzeit

Dns-Probleme (Domain Name System) innerhalb von Kubernetes können die Kommunikation zwischen Pods, Diensten und externen Ressourcen unterbrechen, was zu Anwendungsfehlern und Leistungsbeeinträchtigungen führt. In diesem Artikel wird erläutert, wie Sie DNS-Fehler in einem Azure Kubernetes Service (AKS)-Cluster in Echtzeit beheben.

Symptome

In der folgenden Tabelle werden häufige Symptome beschrieben, die Sie in einem AKS-Cluster beobachten können:

Symptom Beschreibung
Hohe Fehlerrate DNS-Abfragen schlagen fehl oder geben unerwartete Ergebnisse zurück, die sich auf die Leistung und Zuverlässigkeit von Anwendungen auswirken können, die von ihnen abhängig sind.
Nicht reagierende Dienste DNS-Abfragen dauern länger als üblich, um sie aufzulösen, was zu Verzögerungen oder Timeouts in Anwendungen führen kann, die von ihnen abhängig sind.
Die Dienstermittlung ist betroffen Anwendungen können aufgrund von DNS-Problemen keine anderen Anwendungen im Cluster finden, was zu Dienstunterbrechungen oder Fehlern führen kann.
Die externe Kommunikation ist betroffen Anwendungen haben Probleme beim Zugriff auf externe Ressourcen oder Endpunkte außerhalb des Clusters aufgrund von DNS-Problemen, was zu Fehlern oder beeinträchtigter Leistung führen kann.

Voraussetzungen

Verwenden Sie die Anweisungen in den folgenden Abschnitten, um DNS-Fehler in einem AKS-Cluster zu beheben.

Schritt 1: Identifizieren Sie erfolglosen DNS-Antworten im gesamten Cluster

Sie können das DNS-Gadget verwenden, um alle erfolglosen DNS-Antworten im Cluster zu identifizieren. Um diese Überprüfung durchzuführen, verfolgen Sie DNS-Pakete auf allen Knoten, und filtern Sie erfolglose Antworten mithilfe des folgenden Befehls:

$ kubectl gadget trace dns --all-namespaces --output columns=k8s,name,qtype,rcode --filter qr:R --filter qtype:A --filter 'rcode:!No Error'
K8S.NODE         K8S.NAMESPACE    K8S.POD     K8S.CONTAINER    NAME                  QTYPE        RCODE 
aks-agen...      default          test-pod    nginx            myaks-troubleshoot.   A            Non-Existent Domain 
aks-agen...      default          test-pod    nginx            myaks-troubleshoot.   A            Non-Existent Domain 

Hier sind die Erläuterungen der Befehlsparameter:

  • --all-namespaces: Zeigt Daten aus Pods in allen Namespaces an.
  • -output columns=k8s,name,qtype,rcode: Zeigt nur Kubernetes-Informationen, DNS-Name, Abfragetyp und DNS-Abfrageergebnis an.
  • --filter qr:R: Gleicht nur DNS-Antworten ab.
  • --filter qtype:A: Entspricht nur IPv4-Hostadressen.
  • --filter 'rcode:!No Error': Gleicht DNS-Antworten ab, die nicht enthalten No Errorsind. Weitere Informationen finden Sie unter gopacket möglichen Werten von Rcode oder der relevanten RFC.

Hier sind einige Ursachen für erfolglose DNS-Antworten:

  • Der aufgelöste DNS-Name weist einen Tippfehler auf.
  • Probleme mit den upstream-DNS-Namenservern.
  • Der DNS-Name wird nach der Erweiterung ungültig. Informationen dazu, wie DNS-Abfragen mithilfe der Pods /etc/resolv.conferweitert werden können, finden Sie unter Namespaces of Services.

Schritt 2: Identifizieren Sie langsame DNS-Abfragen im gesamten Cluster

Sie können das DNS-Gadget verwenden, um alle langsamen DNS-Abfragen im gesamten Cluster zu identifizieren. Um diese Überprüfung durchzuführen, verfolgen Sie DNS-Pakete auf allen Knoten, und filtern Sie langsame Antworten.

Im folgenden Beispiel verwenden Sie einen Latenzwert zum 5ms Definieren langsamer Pakete. Sie können ihn in einen gewünschten Wert ändern, z. B. , 5μs, 20ms: 1s

$ kubectl gadget trace dns --all-namespaces --output columns=k8s,name,rcode,latency --filter 'latency:>5ms'
K8S.NODE        K8S.NAMESPACE      K8S.POD       K8S.CONTAINER      NAME                            RCODE              LATENCY            
aks-agen...     kube-system        coredn...     coredns            global.prod.micro...            No Error           5.373123ms 
aks-agen...     kube-system        coredn...     coredns            global.prod.micro...            No Error           5.373123ms 

Hier sind die Erläuterungen der Befehlsparameter:

  • --all-namespaces: Zeigt Daten aus Pods in allen Namespaces an.
  • --output columns=k8s,name,rcode,latency: Zeigt nur Kubernetes-Informationen, DNS-Name, DNS-Antwortergebnis und Antwortlatenz an.
  • --filter 'latency:>5ms': Vergleicht nur DNS-Antworten mit einer Latenz von mindestens 5 ms.

Hier sind einige Ursachen für langsame DNS-Abfragen:

  • Probleme mit den upstream-DNS-Namenservern.
  • Netzwerkprobleme im Cluster.
  • Die CoreDNS-Pods sind nicht verfügbar. Um zu überprüfen, ob die Pods ordnungsgemäß ausgeführt werden, führen Sie die Schritte zur Problembehandlung bei DNS-Auflösungsfehlern innerhalb des Pods aus.

Schritt 3: Überprüfen Sie Integrität der Upstream-DNS-Server

Sie können das DNS-Gadget verwenden, um den Zustand der upstream-DNS-Server zu überprüfen, die von CoreDNS verwendet werden. Wenn Anwendungen versuchen, externe Domänen zu erreichen, werden die Abfragen über CoreDNS an die upstream-DNS-Server weitergeleitet. Um die Integrität dieser Abfragen zu verstehen, verfolgen Sie die DNS-Pakete, die die CoreDNS-Pods verlassen, und filtern Sie nach dem Namenserver.

Im folgenden Beispiel wird der standardmäßige Azure DNS-Server (IP-Adresse 168.63.129.16) als upstream-Nameserver verwendet. Wenn Sie einen benutzerdefinierten DNS-Server verwenden, können Sie die IP-Adresse des benutzerdefinierten DNS-Servers als upstream-Namenserver verwenden. Sie können die IP-Adresse abrufen, indem Sie /etc/resolv.conf auf dem Knoten suchen.

$ kubectl gadget trace dns -n kube-system -l k8s-app=kube-dns -o columns=k8s,id,qr,name,rcode,nameserver,latency -F nameserver:168.63.129.16
K8S.NODE    K8S.NAMESPACE   K8S.POD                        K8S.CONTAINER   ID        QR    NAME               RCODE           NAMESERVER              LATENCY
aks-agen... kube-system     coredns-6d5bb68c46-ntz2q       coredns         b256      Q     microsoft.com.                     168.63.129.16
aks-agen... kube-system     coredns-6d5bb68c46-ntz2q       coredns         b256      R     microsoft.com.     No Error        168.63.129.16           500.821223ms

Hier sind die Erläuterungen der Befehlsparameter:

  • -n kube-system: Zeigt nur Daten aus dem kube-system Namespace an.
  • -l k8s-app=kube-dns: Zeigt nur Daten zu/von Pods mit der Bezeichnung k8s-app=kube-dns (CoreDNS-Pods) an.
  • -o columns=k8s,id,name,rcode,nameserver,latency: Zeigt nur Kubernetes-Informationen, DNS-Abfrage-ID, Abfrage/Antwort, DNS-Name, DNS-Antwortergebnis, Nameserver und Antwortlatenz an.
  • -F nameserver:168.63.129.16: Der upstream-DNS-Server, der zum Filtern von Ereignissen verwendet wird.

Sie können die Integrität des upstream-DNS-Servers mit den IDWerten RCODEund LATENCY Werten ermitteln. Wenn beispielsweise ein fehlerhafter Upstreamserver vorhanden ist, wird die folgende Ausgabe angezeigt:

  • Eine DNS-Abfrage (QR=Q) mit einer ID (z. B b256. ) hat keine übereinstimmende Antwort.
  • Eine DNS-Antwort (QR=R) hat einen hohen Wert unter der LATENCY Spalte (z. B 500.821223ms. ).
  • Eine DNS-Antwort (QR=R) weist einen RCODE anderen Als No Error, z. B. "Serverfehler" und "Abfrage verweigert" auf. Weitere Informationen finden Sie unter gopacket möglichen Rcode-Werten.

Schritt 4: Überprüfen Sie, ob DNS-Abfragen Antworten zeitnah erhalten

Sie können das DNS-Gadget verwenden, um zu überprüfen, ob eine bestimmte DNS-Abfrage zeitnah eine Antwort erhält. Um diese Überprüfung durchzuführen, filtern Sie die Ereignisse mit einem DNS-Namen, und stimmen Sie mit den Abfrage-/Antwort-IDs überein:

$ kubectl gadget trace dns -l app=test-pod --output columns=k8s,id,qtype,qr,name,rcode,latency --filter name:microsoft.com.
K8S.NODE       K8S.NAMESPACE   K8S.POD     K8S.CONTAINER   ID          QTYPE     QR  NAME              RCODE               LATENCY
aks-agen...    default         test-pod    nginx           97b3        A         Q   microsoft.com.
aks-agen...    default         test-pod    nginx           97b3        A         R   microsoft.com.    No Error            1.954413ms
aks-agen...    default         test-pod    nginx           97b3        A         R   microsoft.com.    No Error
aks-agen...    default         test-pod    nginx           c6c5        AAAA      Q   microsoft.com.
aks-agen...    default         test-pod    nginx           c6c5        AAAA      R   microsoft.com.    No Error            1.885412ms
aks-agen...    default         test-pod    nginx           c6c5        AAAA      R   microsoft.com.    No Error

Hier sind die Erläuterungen der Befehlsparameter:

  • -l app=test-pod: Zeigt nur Daten zu/von Pods mit der Beschriftung app=test-podan.
  • --output columns=k8s,id,qtype,qr,name,rcode,latency: Zeigt nur Kubernetes-Informationen, DNS-Abfrage-ID, Abfragetyp, Abfrage/Antwort, DNS-Name, DNS-Antwortergebnis und Antwortlatenz an.
  • --filter name:microsoft.com.: Gleicht nur DNS-Pakete mit dem DNS-Namen microsoft.com. ab, um sicherzustellen, dass der Filterwert ein vollqualifizierter Domänenname (FQDN) ist, fügen Sie am Ende des Namens einen Punkt (.) hinzu.

Der ID Wert (z. B. ) kann verwendet werden, 97b3um die Abfragen mit Antworten zu korrelieren. Sie können auch den LATENCY Wert verwenden, um zu überprüfen, ob Sie die Antworten zeitnah erhalten.

Schritt 5: Überprüfen Sie, ob DNS-Antworten die erwarteten IP-Adressen enthalten

Sie können das DNS-Gadget verwenden, um zu überprüfen, ob eine bestimmte DNS-Abfrage die erwartete Antwort erhält. For example, for a headless service (named myheadless), you would expect the response to contain the IP addresses of all the pods.

$ kubectl gadget trace dns -l app=test-pod  -o columns=k8s,id,qtype,qr,name,rcode,numAnswers,addresses  -F name:~myheadless 
K8S.NODE         K8S.NAMESPACE      K8S.POD         K8S.CONTAINER   ID    QTYPE   QR  NAME                 RCODE           NUMANSWERS     ADDRESSES
aks-agen...      default            test-pod        nginx           f930  A       R   myheadless.defau...  No Error        2              10.244.2.18,10.244.2.19 
aks-agen...      default            test-pod        nginx           f930  A       R   myheadless.defau...  No Error        2              10.244.2.18,10.244.2.19 
aks-agen...      default            test-pod        nginx           f930  A       Q   myheadless.defau...                  0                              

Hier sind die Erläuterungen der Befehlsparameter:

  • -l app=test-pod: Zeigt nur Daten zu/von Pods mit der Beschriftung app=test-podan.
  • -o columns=k8s,id,qtype,qr,name,rcode,numAnswers,addresses: Zeigt nur Kubernetes-Informationen, DNS-Abfrage-ID, Abfragetyp, Abfrage/Antwort, DNS-Name, DNS-Antwortergebnis, Anzahl der Antworten und IP-Adressen in der Antwort an.
  • -F name:~myheadless: Enthält nur DNS-Pakete, die die ~myheadless regex-Überprüfung bestehen.

Sie können die Werte und ADDRESSES Werte NUMANSWERS verwenden, um mit den Werten übereinzugleichen, aus kubectl get ep myheadlessder Sie stammen.

$ kubectl get ep myheadless 
NAME                  ENDPOINTS                           AGE 
myheadless            10.244.2.18:8080,10.244.2.19:8080   10d 

Informationen zum Haftungsausschluss von Drittanbietern

Die in diesem Artikel genannten Drittanbieterprodukte stammen von Herstellern, die von Microsoft unabhängig sind. Microsoft gewährt keine implizite oder sonstige Garantie in Bezug auf die Leistung oder Zuverlässigkeit dieser Produkte.

Kontaktieren Sie uns für Hilfe

Wenn Sie Fragen haben oder Hilfe mit Ihren Azure-Gutschriften benötigen, dann erstellen Sie beim Azure-Support eine Support-Anforderung oder fragen Sie den Azure Community-Support. Sie können auch Produktfeedback an die Azure Feedback Community senden.