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) 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

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:

  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 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}'
    
  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
    

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:

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

  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 een netwerkbeleid verkeer blokkeert 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 (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.

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

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

      2. Start de netwerkservice vanuit het knooppunt 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 gestart, gebruikt u kubectl om de CoreDNS-pods opnieuw 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, 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 forwardpolicy 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.