Solucionar problemas de falhas de resolução 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 MICROSOFT Serviço de Kubernetes do Azure (AKS).

Pré-requisitos

Histórico

Para resolução 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á em execução. O arquivo resolv.conf (/run/systemd/resolve/resolv.conf) é atualizado com base nas configurações 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 seguintes etapas:

  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 estão 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 estão 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 para os pods CoreDNS:

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

Observação

Para ver mais informações de depuração, habilite logs verbosos no CoreDNS. Para habilitar o log verboso no CoreDNS, confira Solução de problemas de personalizações CoreDNS no AKS.

Etapa 2: criar um pod de teste para executar comandos

Se a resolução 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 roteada 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 do pod para determinar se a resolução DNS está 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 DNS funcionam quando o servidor DNS upstream for especificado explicitamente

Se as solicitações 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 Serviço de Kubernetes do Azure.

  2. Verifique se uma política de rede está bloqueando o tráfego na porta UDP (Protocolo de Datagrama do Usuário) 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, marcar 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, marcar 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 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. (Novos nós terão a configuração atualizada.)

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

      1. Faça uma conexão SSH (Secure Shell) com os nós. Para obter mais informações, consulte Conectar-se aos nós de cluster do AKS (Serviço de Kubernetes do Azure) 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 de rede virtual.

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

    • O nó AKS envia uma solicitação para o servidor DNS upstream como parte de uma série. Nesta 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 desse resolvedor pode ser encontrado em /run/systemd/resolve/resolv.conf nos nós do AKS.

      Há vários servidores? Nesse caso, a biblioteca de resolvedores as consulta na ordem listada. (A estratégia usada é tentar um servidor de nome primeiro. Se a consulta acabar, experimente o servidor de próximo nome e continue até que a lista de servidores de nome esteja esgotada. Em seguida, a consulta continua tentando se conectar aos servidores de nome até que o número máximo de tentativas seja feito.)

    • O CoreDNS usa o plug-in de encaminhamento para enviar solicitações para upstream servidores DNS. Esse plug-in usa um algoritmo aleatório para selecionar o servidor DNS upstream. Nesta 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 CoreDNSforward, policy especifica a política a ser usada para selecionar servidores upstream. As políticas são definidas na tabela a seguir.

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

    Se a rede virtual AKS contiver vários servidores DNS, as solicitações do nó 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 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 estiver em execução e acessível. Nesta configuração, o nó pode resolve o domínio personalizado. No entanto, algumas das solicitações 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, consulte Resolução de nomes que usa 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.