Delen via


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

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:

  1. Controleer of de CoreDNS-pods worden uitgevoerd:

    kubectl get pods -l k8s-app=kube-dns -n kube-system
    
  2. 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
    
  3. 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}'
    
  4. Controleer het gebruik van deze knooppunten:

    kubectl top nodes
    
  5. 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:

  1. Voer een testpod uit in dezelfde naamruimte als de problematische pod.

  2. 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.

  3. Voer de volgende opdrachten uit om de vereiste pakketten te installeren:

    apt-get update -y
    apt-get install dnsutils -y
    
  4. 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
    
  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
    
  6. 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:

  1. 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.

  2. Controleer of verkeer door een netwerkbeleid wordt geblokkeerd op UDP-poort 53 (User Datagram Protocol) naar de CoreDNS-pods in de kube-system naamruimte.

  3. 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.

  4. 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:

      1. 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.

      2. Start vanuit het knooppunt de netwerkservice opnieuw op:

        systemctl restart systemd-networkd
        
      3. Controleer of de instellingen zijn bijgewerkt:

        cat /run/systemd/resolve/resolv.conf
        
      4. 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
        
  5. 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 geeft policy 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.