Compartilhar via


Solucionar problemas de falhas de resolução de DNS de dentro do pod, mas não do nó de trabalho

Este artigo discute como solucionar problemas de falhas de resolução do DNS (Sistema de Nomes de Domínio) que ocorrem de dentro do pod, mas não do nó de trabalho, quando você tenta estabelecer uma conexão de saída de um cluster do AKS (Serviço de Kubernetes do Microsoft Azure).

Pré-requisitos

Tela de fundo

Para resolução de DNS, os pods enviam solicitações para os pods CoreDNS no kube-system namespace.

Se a consulta DNS for para um componente interno, como um nome de serviço, o pod CoreDNS responderá sozinho. No entanto, se a solicitação for para um domínio externo, o pod CoreDNS enviará a solicitação para o servidor DNS upstream.

Os servidores DNS upstream são obtidos com base no arquivo resolv.conf do nó de trabalho no qual o pod está sendo executado. O arquivo resolv.conf ( /run/systemd/resolve/resolv.conf) é atualizado com base nas configurações de DNS da rede virtual na qual o nó de trabalho está em execução.

Lista de verificação de solução de problemas

Para solucionar problemas de DNS de dentro do pod, use as instruções nas seções a seguir.

Etapa 1: Solucionar problemas de DNS de dentro do pod

Você pode usar comandos kubectl para solucionar problemas de DNS de dentro do pod, conforme mostrado nas etapas a seguir:

  1. Verifique se os pods CoreDNS estão em execução:

    kubectl get pods -l k8s-app=kube-dns -n kube-system
    
  2. Verifique se os pods CoreDNS são usados em excesso:

    $ 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. Verifique se os nós que hospedam os pods CoreDNS não são usados em excesso. Além disso, obtenha os nós que estão hospedando os pods CoreDNS:

    kubectl get pods -n kube-system -l k8s-app=kube-dns -o jsonpath='{.items[*].spec.nodeName}'
    
  4. Verifique o uso desses nós:

    kubectl top nodes
    
  5. Verifique os logs dos pods CoreDNS:

    kubectl logs -l k8s-app=kube-dns -n kube-system
    

Observação

Para ver mais informações de depuração, habilite logs detalhados no CoreDNS. Para habilitar o log detalhado no CoreDNS, consulte Solução de problemas de personalizações do CoreDNS no AKS.

Etapa 2: Criar um pod de teste para executar comandos

Se a resolução do DNS estiver falhando, siga estas etapas:

  1. Execute um pod de teste no mesmo namespace que o pod problemático.

  2. Inicie um pod de teste no cluster:

    kubectl run -it --rm aks-ssh --namespace <namespace> --image=debian:stable
    

    Quando o pod de teste estiver em execução, você terá acesso ao pod.

  3. Execute os seguintes comandos para instalar os pacotes necessários:

    apt-get update -y
    apt-get install dnsutils -y
    
  4. Verifique se o arquivo resolv.conf tem as entradas corretas:

    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. Use o host comando para determinar se as solicitações DNS estão sendo roteadas para o servidor upstream:

    $ 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. Verifique o servidor DNS upstream no pod para determinar se a resolução DNS esteja funcionando corretamente. Por exemplo, para o DNS do Azure, execute o seguinte comando nslookup :

    $ nslookup microsoft.com 168.63.129.16
    Server:         168.63.129.16
    Address:        168.63.129.16#53
    ...
    ...
    Address: 20.81.111.85
    

Etapa 3: verificar se as solicitações de DNS funcionam quando o servidor DNS upstream é especificado explicitamente

Se as solicitações de DNS dos pods estiverem funcionando quando você especificar o servidor DNS upstream explicitamente, verifique as seguintes condições:

  1. Verifique se há um ConfigMap personalizado para CoreDNS:

    kubectl describe cm coredns-custom -n kube-system
    

    Se um ConfigMap personalizado estiver presente, verifique se a configuração está correta. Para obter mais informações, consulte Personalizar o CoreDNS com o Serviço de Kubernetes do Azure.

  2. Verifique se uma política de rede está bloqueando o tráfego na porta UDP (User Datagram Protocol) 53 para os pods CoreDNS no kube-system namespace.

  3. Verifique se os pods CoreDNS estão em um pool de nós diferente (pool de nós do sistema). Se estiverem, verifique se um NSG (grupo de segurança de rede) está associado ao pool de nós do sistema que está bloqueando o tráfego na porta UDP 53.

  4. Verifique se a rede virtual foi atualizada recentemente para adicionar os novos servidores DNS.

    Se ocorreu uma atualização de rede virtual, verifique se um dos seguintes eventos também ocorreu:

    • Os nós foram reiniciados.
    • O serviço de rede no nó foi reiniciado.

    Para que a atualização nas configurações de DNS entre em vigor, o serviço de rede no nó e os pods CoreDNS devem ser reiniciados. Para reiniciar o serviço de rede ou os pods, use um dos seguintes métodos:

    • Reinicie o nó.

    • Dimensione novos nós. (Os novos nós terão a configuração atualizada.)

    • Reinicie o serviço de rede nos nós e, em seguida, reinicie os pods CoreDNS. Siga estas etapas:

      1. Faça uma conexão Secure Shell (SSH) com os nós. Para obter mais informações, consulte Conecte os nós de cluster do AKS (Azure Kubernetes Service) para manutenção ou solução de problemas.

      2. De dentro do nó, reinicie o serviço de rede:

        systemctl restart systemd-networkd
        
      3. Verifique se as configurações estão atualizadas:

        cat /run/systemd/resolve/resolv.conf
        
      4. Depois que o serviço de rede for reiniciado, use kubectl para reiniciar os pods CoreDNS:

        kubectl delete pods -l k8s-app=kube-dns -n kube-system
        
  5. Verifique se mais de um servidor DNS está especificado nas configurações de DNS da rede virtual.

    Se vários servidores DNS forem especificados na rede virtual do AKS, ocorrerá uma das seguintes sequências:

    • O nó do AKS envia uma solicitação para o servidor DNS upstream como parte de uma série. Nessa sequência, a solicitação é enviada para o primeiro servidor DNS configurado na rede virtual (se os servidores DNS estiverem acessíveis e em execução). Se o primeiro servidor DNS não estiver acessível e não estiver respondendo, a solicitação será enviada para o próximo servidor DNS.

      Os nós do AKS usam o comando resolver para enviar solicitações aos servidores DNS. O arquivo de configuração para esse resolvedor pode ser encontrado em /run/systemd/resolve/resolv.conf nos nós do AKS.

      Existem vários servidores? Nesse caso, a biblioteca do resolvedor os consulta na ordem listada. (A estratégia usada é tentar um servidor de nomes primeiro. Se a consulta atingir o tempo limite, tente o próximo servidor de nomes e continue até que a lista de servidores de nomes seja esgotada. Em seguida, a consulta continua tentando se conectar aos servidores de nomes até que o número máximo de tentativas seja feito.)

    • O CoreDNS usa o plug-in de encaminhamento para enviar solicitações para servidores DNS upstream. Esse plug-in usa um algoritmo aleatório para selecionar o servidor DNS upstream. Nessa sequência, a solicitação pode ir para qualquer um dos servidores DNS mencionados na rede virtual. Por exemplo, você pode receber a seguinte saída:

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

    No plug-in forward do CoreDNS, policy especifica a política a ser usada para selecionar servidores upstream. As políticas são definidas na tabela a seguir.

    Nome de política Descrição
    random Uma política que implementa a seleção de upstream aleatória. Essa é a política padrão.
    round_robin Uma política que seleciona hosts com base na ordenação round robin.
    sequential Uma política que seleciona hosts com base na ordenação sequencial.

    Se a rede virtual do AKS contiver vários servidores DNS, as solicitações do nó do AKS poderão ir para o primeiro servidor DNS. No entanto, as solicitações do pod podem ir para o segundo servidor DNS.

Causa: vários destinos para solicitações de DNS

Se dois servidores DNS personalizados forem especificados e o terceiro servidor DNS for especificado como DNS do Azure (168.63.129.16), o nó enviará solicitações para o primeiro servidor DNS personalizado se ele estiver em execução e acessível. Nessa configuração, o nó pode resolver o domínio personalizado. No entanto, algumas das solicitações de DNS do pod podem ser direcionadas para o DNS do Azure. Isso ocorre porque o CoreDNS pode selecionar o servidor upstream aleatoriamente. Nesse cenário, o domínio personalizado não pode ser resolvido. Portanto, a solicitação DNS falha.

Solução: remover o DNS do Azure das configurações de rede virtual

Recomendamos que você não combine o DNS do Azure com servidores DNS personalizados nas configurações de rede virtual. Se você quiser usar os servidores DNS personalizados, adicione apenas os servidores DNS personalizados nas configurações de rede virtual. Em seguida, configure o DNS do Azure nas configurações do encaminhador de seus servidores DNS personalizados.

Para obter mais informações, confira Resolução de nome usando seu próprio servidor DNS.

Aviso de isenção de responsabilidade para contatos de terceiros

A Microsoft fornece informações de contato de terceiros para ajudá-lo a encontrar informações adicionais sobre esse tópico. Essas informações de contato podem ser alteradas sem aviso prévio. A Microsoft não garante a precisão das informações de contato de terceiros.

Entre em contato conosco para obter ajuda

Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.