Dns-omzettingsfouten oplossen vanuit de pod, maar niet vanuit het werkknooppunt
In dit artikel wordt beschreven hoe u dns-omzettingsfouten (Domain Name System) oplost die zich voordoen vanuit de pod, maar niet vanuit het werkknooppunt, wanneer u probeert een uitgaande verbinding tot stand te brengen vanuit een AKS-cluster (Microsoft Azure Kubernetes Service).
Voorwaarden
Het Kubernetes kubectl-hulpprogramma 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 apt-get-opdrachtregelprogramma voor het verwerken van pakketten.
Het opdrachtregelprogramma voor de host voor DNS-zoekacties.
Achtergrond
Voor DNS-omzetting verzenden de pods aanvragen naar de CoreDNS-pods in de kube-system
naamruimte.
Als de DNS-query voor een intern onderdeel is, zoals een servicenaam, reageert de CoreDNS-pod op zichzelf. 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 werkknooppunt wordt uitgevoerd.
Controlelijst voor probleemoplossing
Als u DNS-problemen vanuit de pod wilt oplossen, gebruikt u de instructies in de volgende secties.
Stap 1: DNS-problemen oplossen vanuit de pod
U kunt kubectl-opdrachten gebruiken om DNS-problemen op te lossen vanuit de pod, 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 waarop de CoreDNS-pods worden gehost, 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
Notitie
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.
Stap 2: Een testpod maken om opdrachten uit te voeren
Als de DNS-omzetting mislukt, voert u de volgende stappen uit:
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-omzetting correct werkt. Voer bijvoorbeeld voor Azure DNS 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 verkeer door een netwerkbeleid wordt geblokkeerd 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 bevinden (systeemknooppuntgroep). Als dat zo is, controleert u of een netwerkbeveiligingsgroep (NSG) is gekoppeld aan de systeemknooppuntgroep die verkeer blokkeert op UDP-poort 53.
Controleer of het virtuele netwerk onlangs is bijgewerkt om de nieuwe DNS-servers toe te voegen.
Als er een update van een virtueel netwerk is opgetreden, controleert u of er ook een van de volgende gebeurtenissen is opgetreden:
- De knooppunten zijn opnieuw opgestart.
- De netwerkservice in het knooppunt is opnieuw opgestart.
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 op te starten:
Start het knooppunt opnieuw op.
Nieuwe knooppunten schalen. (Nieuwe knooppunten hebben de bijgewerkte configuratie.)
Start de netwerkservice in de knooppunten opnieuw en start de CoreDNS-pods opnieuw op. Volg vervolgens deze stappen:
Maak een SSH-verbinding (Secure Shell) met de knooppunten. Zie Verbinding maken met AKS-clusterknooppunten (Azure Kubernetes Service) voor onderhoud of probleemoplossing voor meer informatie.
Start vanuit het knooppunt de netwerkservice opnieuw op:
systemctl restart systemd-networkd
Controleer of de instellingen zijn bijgewerkt:
cat /run/systemd/resolve/resolv.conf
Nadat de netwerkservice opnieuw is opgestart, gebruikt u kubectl om de CoreDNS-pods opnieuw op 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, vindt een van de volgende reeksen plaats:
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/resolve.conf in de AKS-knooppunten.
Zijn er meerdere servers? In dit geval worden deze door de resolver-bibliotheek opgevraagd in de volgorde die wordt weergegeven. (De gebruikte strategie is om eerst een naamserver 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 proberen verbinding te maken met de naamservers totdat het maximum aantal nieuwe pogingen is gedaan.)
CoreDNS maakt gebruik van de forward-invoegtoepassing voor het verzenden van aanvragen 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
geeftpolicy
het beleid op dat moet worden gebruikt voor het selecteren van upstreamservers. Het beleid wordt gedefinieerd in de volgende tabel.Beleidsnaam Beschrijving random
Een beleid waarmee willekeurige upstreamselectie 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 waarmee hosts worden geselecteerd op basis van sequentiële volgorde. Als het virtuele AKS-netwerk meerdere DNS-servers bevat, kunnen de aanvragen van het AKS-knooppunt naar de eerste DNS-server gaan. 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 doordat 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 instellingen voor virtuele netwerken
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 biedt contactgegevens van derden om u te helpen aanvullende informatie over dit onderwerp te vinden. Deze contactinformatie kan zonder voorafgaande kennisgeving worden gewijzigd. Microsoft garandeert niet de nauwkeurigheid van contactgegevens van derden.
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.