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
Azure CLI.
Zie De Azure CLI installeren als u Azure CLI wilt installeren.
Een hulpprogramma om verbinding te maken met het cluster, zoals het Kubernetes-opdrachtregelprogramma kubectl.
Als u kubectl wilt installeren met behulp van Azure CLI, voert u de opdracht az aks install-cli uit.
-
Dit hulpprogramma wordt gebruikt in de meeste stappen voor probleemoplossing die in dit artikel worden beschreven. Zorg er dus voor dat u het hulpprogramma installeert op het cluster. Zie Inspektor Gadget installeren in een AKS-cluster om het te installeren op een AKS-cluster.
Bekendheid met gadgets.
Inspektor Gadget DNS gadget.
Deze wordt gebruikt in alle volgende stappen voor probleemoplossing.
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 bevattenNo Error
. Zie voor meer informatiegopacket
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
, : 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 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 minste5 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 dekube-system
naamruimte weer.-l k8s-app=kube-dns
: Toont alleen gegevens naar/van pods met het labelk8s-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
, RCODE
en 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 eenID
(bijvoorbeeldb256
) heeft geen overeenkomend antwoord. - Een DNS-antwoord (
QR=R
) heeft een hoge waarde onder deLATENCY
kolom (bijvoorbeeld500.821223ms
). - Een DNS-antwoord (
QR=R
) heeft eenRCODE
ander antwoord danNo Error
bijvoorbeeld 'Serverfout' en 'Query geweigerd'. Zie voor meer informatiegopacket
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 labelapp=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-naammicrosoft.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 labelapp=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 myheadless
u 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.