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.
Notiz
Dieser Artikel ergänzt die Problembehandlung von DNS-Auflösungsfehlern aus dem Pod-Handbuch .
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
Azure-Befehlszeilenschnittstelle.
Informationen zum Installieren von Azure CLI finden Sie unter Installieren der Azure CLI.
Ein Tool zum Herstellen einer Verbindung mit dem Cluster, z. B. das Kubernetes-Befehlszeilentool Kubectl.
Führen Sie zum Installieren von Kubectl mithilfe der Azure CLI den Befehl "az aks install-cli " aus.
-
Dieses Tool wird in den meisten Schritten zur Problembehandlung verwendet, die in diesem Artikel behandelt werden. Stellen Sie daher sicher, dass Sie es auf dem Cluster installieren. Informationen zum Installieren auf einem AKS-Cluster finden Sie unter Installieren des Inspektor Gadgets in einem AKS-Cluster.
Vertrautheit mit Gadgets.
-
Sie wird in allen folgenden Schritten zur Problembehandlung verwendet.
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 enthaltenNo Error
sind. Weitere Informationen finden Sie untergopacket
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.conf
erweitert 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 mindestens5 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 demkube-system
Namespace an.-l k8s-app=kube-dns
: Zeigt nur Daten zu/von Pods mit der Bezeichnungk8s-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 ID
Werten RCODE
und LATENCY
Werten ermitteln. Wenn beispielsweise ein fehlerhafter Upstreamserver vorhanden ist, wird die folgende Ausgabe angezeigt:
- Eine DNS-Abfrage (
QR=Q
) mit einerID
(z. Bb256
. ) hat keine übereinstimmende Antwort. - Eine DNS-Antwort (
QR=R
) hat einen hohen Wert unter derLATENCY
Spalte (z. B500.821223ms
. ). - Eine DNS-Antwort (
QR=R
) weist einenRCODE
anderen AlsNo Error
, z. B. "Serverfehler" und "Abfrage verweigert" auf. Weitere Informationen finden Sie untergopacket
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 Beschriftungapp=test-pod
an.--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-Namenmicrosoft.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, 97b3
um 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 Beschriftungapp=test-pod
an.-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 myheadless
der 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.