Delen via


Dns-fouten in een AKS-cluster in realtime oplossen

DNS-problemen (Domain Name System) in Kubernetes kunnen de communicatie tussen pods, services en externe resources verstoren, wat leidt tot fouten in toepassingen en prestatievermindering. In dit artikel wordt beschreven hoe u DNS-fouten in een AKS-cluster (Azure Kubernetes Service) in realtime kunt oplossen.

Notitie

Dit artikel vormt een aanvulling op de probleemoplossing van DNS-omzettingsfouten vanuit de podhandleiding .

Symptomen

In de volgende tabel worden veelvoorkomende symptomen beschreven die u in een AKS-cluster kunt observeren:

Symptoom Beschrijving
Hoog foutpercentage DNS-query's mislukken of retourneren onverwachte resultaten, die van invloed kunnen zijn op de prestaties en betrouwbaarheid van toepassingen die hiervan afhankelijk zijn.
Niet-reagerende services DNS-query's duren langer dan normaal om op te lossen, wat vertragingen of time-outs kan veroorzaken in toepassingen die hierop afhankelijk zijn.
Servicedetectie wordt beïnvloed Toepassingen kunnen geen andere toepassingen in het cluster vinden vanwege DNS-problemen, wat kan leiden tot serviceonderbrekingen of storingen.
Externe communicatie wordt beïnvloed Toepassingen hebben problemen bij het openen van externe resources of eindpunten buiten het cluster vanwege DNS-problemen, wat kan leiden tot fouten of verminderde prestaties.

Voorwaarden

Als u DNS-fouten in een AKS-cluster wilt oplossen, gebruikt u de instructies in de volgende secties.

Stap 1: mislukte DNS-antwoorden in het cluster identificeren

U kunt het DNS-gadget gebruiken om alle mislukte DNS-antwoorden in het cluster te identificeren. Als u deze controle wilt uitvoeren, traceert u DNS-pakketten op alle knooppunten en filtert u mislukte antwoorden met behulp van de volgende opdracht:

$ 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 volgen de uitleg van de opdrachtparameters:

  • --all-namespaces: Toont gegevens van pods in alle naamruimten.
  • -output columns=k8s,name,qtype,rcode: Toont alleen Kubernetes-gegevens, DNS-naam, querytype en DNS-queryresultaat.
  • --filter qr:R: komt alleen overeen met DNS-antwoorden.
  • --filter qtype:A: Komt alleen overeen met IPv4-hostadressen.
  • --filter 'rcode:!No Error': komt overeen met DNS-antwoorden die niet bevatten No Error. Zie voor meer informatie gopacket voor mogelijke waarden van rcode of de relevante RFC.

Hier volgen enkele oorzaken van mislukte DNS-antwoorden:

  • De DNS-naam die wordt omgezet, heeft een typefout.
  • De upstream DNS-naamservers ondervinden problemen.
  • De DNS-naam wordt ongeldig na uitbreiding. Als u wilt weten hoe DNS-query's kunnen worden uitgebreid met behulp van een pod /etc/resolv.conf, raadpleegt u Naamruimten van Services.

Stap 2: trage DNS-query's in het cluster identificeren

U kunt het DNS-gadget gebruiken om alle trage DNS-query's in het cluster te identificeren. Als u deze controle wilt uitvoeren, traceert u DNS-pakketten op alle knooppunten en filtert u trage reacties.

In het volgende voorbeeld gebruikt u een latentiewaarde voor het definiëren van 5ms trage pakketten. U kunt deze wijzigen in een gewenste waarde, bijvoorbeeld , 5μs, : 20ms1s

$ 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 volgen de uitleg van de opdrachtparameters:

  • --all-namespaces: Toont gegevens van pods in alle naamruimten.
  • --output columns=k8s,name,rcode,latency: Toont alleen Kubernetes-informatie, DNS-naam, DNS-antwoordresultaat en reactielatentie.
  • --filter 'latency:>5ms': komt alleen overeen met DNS-antwoorden met een latentie van ten minste 5 ms.

Hier volgen enkele oorzaken van trage DNS-query's:

  • De upstream DNS-naamservers ondervinden problemen.
  • Netwerkproblemen in het cluster.
  • De CoreDNS-pods zijn niet beschikbaar. Als u wilt controleren of de pods goed werken, volgt u de stappen voor probleemoplossing in Het oplossen van DNS-omzettingsfouten vanuit de pod.

Stap 3: de status van de upstream-DNS-servers controleren

U kunt het DNS-gadget gebruiken om de status van de upstream-DNS-servers te controleren die door CoreDNS worden gebruikt. Als toepassingen externe domeinen proberen te bereiken, worden de query's doorgestuurd naar de upstream DNS-servers via CoreDNS. Als u de status van deze query's wilt begrijpen, traceert u de DNS-pakketten die de CoreDNS-pods verlaten en filtert u op de naamserver.

In het volgende voorbeeld wordt de standaard Azure DNS-server (IP-adres 168.63.129.16) gebruikt als de upstream-naamserver. Als u een aangepaste DNS-server gebruikt, kunt u het IP-adres van de aangepaste DNS-server gebruiken als de upstream-naamserver. U kunt het IP-adres ophalen door /etc/resolv.conf op te zoeken op het knooppunt.

$ 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 volgen de uitleg van de opdrachtparameters:

  • -n kube-system: Geeft alleen gegevens uit de kube-system naamruimte weer.
  • -l k8s-app=kube-dns: Toont alleen gegevens naar/van pods met het label k8s-app=kube-dns (CoreDNS-pods).
  • -o columns=k8s,id,name,rcode,nameserver,latency: Toont alleen Kubernetes-informatie, DNS-query-id, query/antwoord, DNS-naam, DNS-antwoordresultaat, naamserver en latentie van reacties.
  • -F nameserver:168.63.129.16: De upstream-DNS-server die wordt gebruikt om gebeurtenissen te filteren.

U kunt de ID, RCODEen LATENCY waarden gebruiken om de status van de upstream-DNS-server te bepalen. Als er bijvoorbeeld een beschadigde upstream-server is, ziet u de volgende uitvoer:

  • Een DNS-query (QR=Q) met een ID (bijvoorbeeld b256) heeft geen overeenkomend antwoord.
  • Een DNS-antwoord (QR=R) heeft een hoge waarde onder de LATENCY kolom (bijvoorbeeld 500.821223ms).
  • Een DNS-antwoord (QR=R) heeft een RCODE ander antwoord dan No Errorbijvoorbeeld 'Serverfout' en 'Query geweigerd'. Zie voor meer informatie gopacket de mogelijke waarden van rcode.

Stap 4: controleer of DNS-query's tijdig antwoorden krijgen

U kunt het DNS-gadget gebruiken om te controleren of een bepaalde DNS-query tijdig een antwoord krijgt. Als u deze controle wilt uitvoeren, filtert u de gebeurtenissen met een DNS-naam en komt u overeen met de query-/antwoord-id's:

$ 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 volgen de uitleg van de opdrachtparameters:

  • -l app=test-pod: Toont alleen gegevens van/naar pods met het label app=test-pod.
  • --output columns=k8s,id,qtype,qr,name,rcode,latency: Toont alleen Kubernetes-informatie, DNS-query-id, querytype, query/antwoord, DNS-naam, DNS-antwoordresultaat en latentie van het antwoord.
  • --filter name:microsoft.com.: komt alleen overeen met DNS-pakketten met de DNS-naam microsoft.com. Om ervoor te zorgen dat de filterwaarde een FQDN (Fully Qualified Domain Name) is, voegt u een punt (.) toe aan het einde van de naam.

De ID waarde (bijvoorbeeld 97b3) kan worden gebruikt om de query's te correleren met antwoorden. U kunt ook de LATENCY waarde gebruiken om te controleren of u de antwoorden tijdig krijgt.

Stap 5: controleer of DNS-antwoorden de verwachte IP-adressen bevatten

U kunt het DNS-gadget gebruiken om te controleren of een bepaalde DNS-query het verwachte antwoord krijgt. Voor een headless service (genaamd myheadless) verwacht u bijvoorbeeld dat het antwoord de IP-adressen van alle pods bevat.

$ 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 volgen de uitleg van de opdrachtparameters:

  • -l app=test-pod: Toont alleen gegevens van/naar pods met het label app=test-pod.
  • -o columns=k8s,id,qtype,qr,name,rcode,numAnswers,addresses: Toont alleen Kubernetes-informatie, DNS-query-id, querytype, query/antwoord, DNS-naam, DNS-antwoordresultaat, aantal antwoorden en IP-adressen in het antwoord.
  • -F name:~myheadless: Bevat alleen DNS-pakketten die de ~myheadless regex-controle doorgeven.

U kunt de NUMANSWERS waarden en ADDRESSES waarden gebruiken om overeen te komen met de waarden waaruit kubectl get ep myheadlessu krijgt.

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

Disclaimerinformatie van derden

De producten van derden die in dit artikel worden vermeld, worden vervaardigd door bedrijven die onafhankelijk zijn van Microsoft. Microsoft verleent dan ook geen enkele garantie, impliciet noch anderszins, omtrent de prestaties of de betrouwbaarheid van deze producten.

Contacteer ons voor hulp

Als u vragen hebt of hulp nodig hebt, maak een ondersteuningsaanvraag of vraag de Azure-communityondersteuning. U kunt ook productfeedback verzenden naar de Azure-feedbackcommunity.