Dns-omzettingsfouten oplossen vanuit de pod, maar niet vanuit het werkknooppunt
In dit artikel wordt beschreven hoe u dns-omzettingsfouten (Domain Name System) kunt oplossen die optreden vanuit de pod, maar niet vanuit het werkknooppunt, wanneer u een uitgaande verbinding probeert tot stand te brengen vanuit een AKS-cluster (Microsoft Azure Kubernetes Service).
Vereisten
Het kubectl-hulpprogramma Kubernetes of een vergelijkbaar hulpprogramma om verbinding te maken met het cluster. Als u kubectl wilt installeren met behulp van Azure CLI, voert u de opdracht az aks install-cli uit.
Het opdrachtregelprogramma apt-get voor het verwerken van pakketten.
Het opdrachtregelprogramma voor de host voor DNS-zoekopdrachten.
Het opdrachtregelprogramma systemctl .
Achtergrond
Voor DNS-omzetting verzenden de pods aanvragen naar de CoreDNS-pods in de kube-system
naamruimte.
Als de DNS-query is bedoeld voor een intern onderdeel, zoals een servicenaam, reageert de CoreDNS-pod vanzelf. Als de aanvraag echter voor een extern domein is, verzendt de CoreDNS-pod de aanvraag naar de upstream-DNS-server.
De upstream DNS-servers worden verkregen op basis van het bestand resolv.conf van het werkknooppunt waarin de pod wordt uitgevoerd. Het bestand resolv.conf (/run/systemd/resolve/resolv.conf) wordt bijgewerkt op basis van de DNS-instellingen van het virtuele netwerk waarop het werkrolknooppunt wordt uitgevoerd.
Controlelijst voor probleemoplossing
Volg de instructies in de volgende secties om DNS-problemen vanuit de pod op te lossen.
Stap 1: DNS-problemen oplossen vanuit de pod
U kunt kubectl-opdrachten gebruiken om DNS-problemen vanuit de pod op te lossen, zoals wordt weergegeven in de volgende stappen:
Controleer of de CoreDNS-pods worden uitgevoerd:
kubectl get pods -l k8s-app=kube-dns -n kube-system
Controleer of de CoreDNS-pods te veel worden gebruikt:
$ kubectl top pods -n kube-system -l k8s-app=kube-dns NAME CPU(cores) MEMORY(bytes) coredns-dc97c5f55-424f7 3m 23Mi coredns-dc97c5f55-wbh4q 3m 25Mi
Controleer of de knooppunten die als host fungeren voor de CoreDNS-pods niet te veel worden gebruikt. Haal ook de knooppunten op die als host fungeren voor de CoreDNS-pods:
kubectl get pods -n kube-system -l k8s-app=kube-dns -o jsonpath='{.items[*].spec.nodeName}'
Controleer het gebruik van deze knooppunten:
kubectl top nodes
Controleer de logboeken voor de CoreDNS-pods:
kubectl logs -l k8s-app=kube-dns -n kube-system
Opmerking
Als u meer informatie over foutopsporing wilt zien, schakelt u uitgebreide logboeken in CoreDNS in. Zie Problemen met CoreDNS-aanpassingen in AKS oplossen om uitgebreide logboekregistratie in te schakelen in CoreDNS.
Stap 2: een testpod maken om opdrachten uit te voeren
Als de DNS-omzetting mislukt, volgt u deze stappen:
Voer een testpod uit in dezelfde naamruimte als de problematische pod.
Start een testpod in het cluster:
kubectl run -it --rm aks-ssh --namespace <namespace> --image=debian:stable
Wanneer de testpod wordt uitgevoerd, krijgt u toegang tot de pod.
Voer de volgende opdrachten uit om de vereiste pakketten te installeren:
apt-get update -y apt-get install dnsutils -y
Controleer of het bestand resolv.conf de juiste vermeldingen bevat:
cat /etc/resolv.conf search default.svc.cluster.local svc.cluster.local cluster.local 00idcnmrrm4edot5s2or1onxsc.bx.internal.cloudapp.net nameserver 10.0.0.10 options ndots:5
Gebruik de
host
opdracht om te bepalen of de DNS-aanvragen worden gerouteerd naar de upstream-server:$ host -a microsoft.com Trying "microsoft.com.default.svc.cluster.local" Trying "microsoft.com.svc.cluster.local" Trying "microsoft.com.cluster.local" Trying "microsoft.com.00idcnmrrm4edot5s2or1onxsc.bx.internal.cloudapp.net" Trying "microsoft.com" Trying "microsoft.com" ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62884 ;; flags: qr rd ra; QUERY: 1, ANSWER: 27, AUTHORITY: 0, ADDITIONAL: 5 ;; QUESTION SECTION: ;microsoft.com. IN ANY ;; ANSWER SECTION: microsoft.com. 30 IN NS ns1-39.azure-dns.com. ... ... ns4-39.azure-dns.info. 30 IN A 13.107.206.39 Received 2121 bytes from 10.0.0.10#53 in 232 ms
Controleer de upstream DNS-server van de pod om te bepalen of de DNS-resolutie correct werkt. Voer voor Azure DNS bijvoorbeeld de volgende nslookup-opdracht uit:
$ nslookup microsoft.com 168.63.129.16 Server: 168.63.129.16 Address: 168.63.129.16#53 ... ... Address: 20.81.111.85
Stap 3: controleren of DNS-aanvragen werken wanneer de upstream-DNS-server expliciet is opgegeven
Als de DNS-aanvragen van pods werken wanneer u de upstream-DNS-server expliciet opgeeft, controleert u de volgende voorwaarden:
Controleer op een aangepaste ConfigMap voor CoreDNS:
kubectl describe cm coredns-custom -n kube-system
Als er een aangepaste ConfigMap aanwezig is, controleert u of de configuratie juist is. Zie CoreDNS aanpassen met Azure Kubernetes Service voor meer informatie.
Controleer of een netwerkbeleid verkeer blokkeert op UDP-poort 53 (User Datagram Protocol) naar de CoreDNS-pods in de
kube-system
naamruimte.Controleer of de CoreDNS-pods zich in een andere knooppuntgroep (systeemknooppuntgroep) bevinden. Als dat zo is, controleert u of er een netwerkbeveiligingsgroep (NSG) is gekoppeld aan de systeemknooppuntgroep die verkeer op UDP-poort 53 blokkeert.
Controleer of het virtuele netwerk onlangs is bijgewerkt om de nieuwe DNS-servers toe te voegen.
Als er een update van het virtuele netwerk is opgetreden, controleert u of een van de volgende gebeurtenissen ook is opgetreden:
- De knooppunten zijn opnieuw opgestart.
- De netwerkservice in het knooppunt is opnieuw gestart.
De update in DNS-instellingen wordt pas van kracht als de netwerkservice op het knooppunt en de CoreDNS-pods opnieuw worden opgestart. Gebruik een van de volgende methoden om de netwerkservice of de pods opnieuw te starten:
Start het knooppunt opnieuw op.
Nieuwe knooppunten schalen. (Nieuwe knooppunten hebben de bijgewerkte configuratie.)
Start de netwerkservice opnieuw op de knooppunten en start vervolgens de CoreDNS-pods opnieuw op. Volg deze stappen:
Maak een SSH-verbinding (Secure Shell) met de knooppunten. Zie Verbinding maken met Azure Kubernetes Service clusterknooppunten (AKS) voor onderhoud of probleemoplossing voor meer informatie.
Start de netwerkservice vanuit het knooppunt opnieuw op:
systemctl restart systemd-networkd
Controleer of de instellingen zijn bijgewerkt:
cat /run/systemd/resolve/resolv.conf
Nadat de netwerkservice opnieuw is gestart, gebruikt u kubectl om de CoreDNS-pods opnieuw te starten:
kubectl delete pods -l k8s-app=kube-dns -n kube-system
Controleer of er meer dan één DNS-server is opgegeven in de DNS-instellingen van het virtuele netwerk.
Als er meerdere DNS-servers zijn opgegeven in het virtuele AKS-netwerk, treedt een van de volgende reeksen op:
Het AKS-knooppunt verzendt een aanvraag naar de upstream-DNS-server als onderdeel van een reeks. In deze volgorde wordt de aanvraag verzonden naar de eerste DNS-server die is geconfigureerd in het virtuele netwerk (als de DNS-servers bereikbaar en actief zijn). Als de eerste DNS-server niet bereikbaar is en niet reageert, wordt de aanvraag verzonden naar de volgende DNS-server.
AKS-knooppunten gebruiken de opdracht resolver om aanvragen naar de DNS-servers te verzenden. Het configuratiebestand voor deze resolver vindt u op /run/systemd/resolve/resolv.conf in de AKS-knooppunten.
Zijn er meerdere servers? In dit geval voert de bibliotheek van de resolver een query uit in de volgorde die wordt vermeld. (De gebruikte strategie is om eerst een naamserver uit te proberen. Als er een time-out optreedt voor de query, probeert u de volgende naamserver en gaat u door totdat de lijst met naamservers is uitgeput. Vervolgens blijft de query verbinding maken met de naamservers totdat het maximum aantal nieuwe pogingen is uitgevoerd.)
CoreDNS maakt gebruik van de doorsturende invoegtoepassing om aanvragen te verzenden naar upstream DNS-servers. Deze invoegtoepassing maakt gebruik van een willekeurig algoritme om de upstream-DNS-server te selecteren. In deze volgorde kan de aanvraag naar een van de DNS-servers gaan die worden vermeld in het virtuele netwerk. U kunt bijvoorbeeld de volgende uitvoer ontvangen:
$ kubectl describe cm coredns -n kube-system Name: coredns Namespace: kube-system Labels: addonmanager.kubernetes.io/mode=Reconcile k8s-app=kube-dns kubernetes.io/cluster-service=true Annotations: <none> Data ==== Corefile: ---- .:53 { errors ready health kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf # Here! cache 30 loop reload loadbalance import custom/*.override } import custom/*.server BinaryData ==== Events: <none>
In de CoreDNS-invoegtoepassing
forward
policy
geeft u het beleid op dat moet worden gebruikt voor het selecteren van upstream-servers. De beleidsregels worden gedefinieerd in de volgende tabel.Beleidsnaam Beschrijving random
Een beleid waarmee willekeurige upstream-selectie wordt geïmplementeerd. Dit beleid is het standaardbeleid. round_robin
Een beleid waarmee hosts worden geselecteerd op basis van round robin-volgorde. sequential
Een beleid dat hosts selecteert op basis van volgordevolgorde. Als het virtuele AKS-netwerk meerdere DNS-servers bevat, gaan de aanvragen van het AKS-knooppunt mogelijk naar de eerste DNS-server. De aanvragen van de pod kunnen echter naar de tweede DNS-server gaan.
Oorzaak: meerdere bestemmingen voor DNS-aanvragen
Als er twee aangepaste DNS-servers zijn opgegeven en de derde DNS-server is opgegeven als Azure DNS (168.63.129.16), verzendt het knooppunt aanvragen naar de eerste aangepaste DNS-server als deze actief en bereikbaar is. In deze installatie kan het knooppunt het aangepaste domein omzetten. Sommige DNS-aanvragen van de pod kunnen echter worden omgeleid naar Azure DNS. Dit komt omdat CoreDNS de upstream-server willekeurig kan selecteren. In dit scenario kan het aangepaste domein niet worden omgezet. Daarom mislukt de DNS-aanvraag.
Oplossing: Azure DNS verwijderen uit de instellingen van het virtuele netwerk
U wordt aangeraden azure DNS niet te combineren met aangepaste DNS-servers in de instellingen van het virtuele netwerk. Als u de aangepaste DNS-servers wilt gebruiken, voegt u alleen de aangepaste DNS-servers toe in de instellingen van het virtuele netwerk. Configureer vervolgens Azure DNS in de doorstuurserverinstellingen van uw aangepaste DNS-servers.
Zie Naamomzetting die gebruikmaakt van uw eigen DNS-server voor meer informatie.
Disclaimerinformatie van derden
Microsoft verstrekt contactgegevens van derden om u te helpen aanvullende informatie over dit onderwerp te vinden. Deze contactinformatie kan zonder voorafgaande kennisgeving worden gewijzigd. Microsoft garandeert de juistheid van contactgegevens van derden niet.
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 Feedback-community van Azure.