Partilhar via


Solucionar problemas de falhas de DNS em um cluster do AKS em tempo real

Problemas de DNS (Sistema de Nomes de Domínio) no Kubernetes podem interromper as comunicações entre pods, serviços e recursos externos, o que resulta em falhas de aplicativos e degradação do desempenho. Este artigo discute como solucionar falhas de DNS em um cluster do AKS (Serviço de Kubernetes do Azure) em tempo real.

Observação

Este artigo complementa o guia Solucionar problemas de resolução de DNS de dentro do pod.

Sintomas

A tabela a seguir descreve os sintomas comuns que você pode observar em um cluster do AKS:

Sintoma Descrição
Alta taxa de erro As consultas DNS falham ou retornam resultados inesperados, o que pode afetar o desempenho e a confiabilidade dos aplicativos que dependem delas.
Serviços que não respondem As consultas de DNS demoram mais do que o normal para serem resolvidas, o que pode causar atrasos ou tempos limite em aplicativos que dependem delas.
A descoberta de serviço é afetada Os aplicativos não podem localizar outros aplicativos no cluster devido a problemas de DNS, o que pode levar a interrupções ou falhas de serviço.
A comunicação externa é afetada Os aplicativos têm problemas para acessar recursos externos ou pontos de extremidade fora do cluster devido a problemas de DNS, o que pode resultar em erros ou desempenho degradado.

Pré-requisitos

Para solucionar problemas de falhas de DNS em um cluster do AKS, use as instruções nas seções a seguir.

Etapa 1: Identificar respostas DNS malsucedidas no cluster

Você pode usar o gadget DNS para identificar todas as respostas DNS malsucedidas no cluster. Para executar essa verificação, rastreie os pacotes DNS em todos os nós e filtre as respostas malsucedidas usando o seguinte comando:

$ kubectl gadget trace dns --all-namespaces --output columns=k8s,name,qtype,rcode --filter qr:R --filter qtype:A --filter 'rcode:!No Error'
K8S.NODE         K8S.NAMESPACE    K8S.POD     K8S.CONTAINER    NAME                  QTYPE        RCODE 
aks-agen...      default          test-pod    nginx            myaks-troubleshoot.   A            Non-Existent Domain 
aks-agen...      default          test-pod    nginx            myaks-troubleshoot.   A            Non-Existent Domain 

Aqui estão as explicações dos parâmetros do comando:

  • --all-namespaces: Mostra dados de pods em todos os namespaces.
  • -output columns=k8s,name,qtype,rcode: Mostra apenas informações do Kubernetes, nome DNS, tipo de consulta e resultado da consulta DNS.
  • --filter qr:R: corresponde apenas às respostas DNS.
  • --filter qtype:A: corresponde apenas a endereços de host IPv4.
  • --filter 'rcode:!No Error': corresponde a respostas DNS que não contêm No Error. Para obter mais informações, consulte gopacket os possíveis valores de rcode ou o RFC relevante.

Aqui estão algumas causas de respostas DNS malsucedidas:

  • O nome DNS que está sendo resolvido tem um erro de digitação.
  • Os servidores de nomes DNS upstream apresentam problemas.
  • O nome DNS torna-se inválido após a expansão. Para entender como as consultas DNS podem ser expandidas usando o , consulte Namespaces /etc/resolv.confde serviços.

Etapa 2: Identificar consultas DNS lentas no cluster

Você pode usar o gadget DNS para identificar todas as consultas DNS lentas no cluster. Para executar essa verificação, rastreie os pacotes DNS em todos os nós e filtre as respostas lentas.

No exemplo a seguir, você está usando um valor de latência de 5ms para definir pacotes lentos. Você pode alterá-lo para um valor desejado, por exemplo, 5μs, 20ms, 1s:

$ kubectl gadget trace dns --all-namespaces --output columns=k8s,name,rcode,latency --filter 'latency:>5ms'
K8S.NODE        K8S.NAMESPACE      K8S.POD       K8S.CONTAINER      NAME                            RCODE              LATENCY            
aks-agen...     kube-system        coredn...     coredns            global.prod.micro...            No Error           5.373123ms 
aks-agen...     kube-system        coredn...     coredns            global.prod.micro...            No Error           5.373123ms 

Aqui estão as explicações dos parâmetros do comando:

  • --all-namespaces: Mostra dados de pods em todos os namespaces.
  • --output columns=k8s,name,rcode,latency: mostra apenas informações do Kubernetes, nome DNS, resultado da resposta DNS e latência da resposta.
  • --filter 'latency:>5ms': corresponde apenas a respostas DNS com uma latência de pelo menos 5 ms.

Aqui estão algumas causas de consultas DNS lentas:

Etapa 3: verificar a integridade dos servidores DNS upstream

Você pode usar o gadget DNS para verificar a integridade dos servidores DNS upstream usados pelo CoreDNS. Se os aplicativos tentarem acessar domínios externos, as consultas serão encaminhadas para os servidores DNS upstream via CoreDNS. Para entender a integridade dessas consultas, rastreie os pacotes DNS que saem dos pods CoreDNS e filtre pelo servidor de nomes.

No exemplo a seguir, o servidor DNS do Azure padrão (endereço IP 168.63.129.16) é usado como o servidor de nomes upstream. Se você estiver usando um servidor DNS personalizado, poderá usar o endereço IP do servidor DNS personalizado como o servidor de nomes upstream. Você pode obter o endereço IP procurando / etc/resolv.conf no nó.

$ kubectl gadget trace dns -n kube-system -l k8s-app=kube-dns -o columns=k8s,id,qr,name,rcode,nameserver,latency -F nameserver:168.63.129.16
K8S.NODE    K8S.NAMESPACE   K8S.POD                        K8S.CONTAINER   ID        QR    NAME               RCODE           NAMESERVER              LATENCY
aks-agen... kube-system     coredns-6d5bb68c46-ntz2q       coredns         b256      Q     microsoft.com.                     168.63.129.16
aks-agen... kube-system     coredns-6d5bb68c46-ntz2q       coredns         b256      R     microsoft.com.     No Error        168.63.129.16           500.821223ms

Aqui estão as explicações dos parâmetros do comando:

  • -n kube-system: Mostra apenas os dados do kube-system namespace.
  • -l k8s-app=kube-dns: mostra apenas dados de/para pods com o rótulo k8s-app=kube-dns (pods CoreDNS).
  • -o columns=k8s,id,name,rcode,nameserver,latency: mostra apenas informações do Kubernetes, ID de consulta DNS, consulta/resposta, nome DNS, resultado de resposta DNS, servidor de nomes e latência de resposta.
  • -F nameserver:168.63.129.16: O servidor DNS upstream usado para filtrar eventos.

Você pode usar os IDvalores , RCODEe para LATENCY determinar a integridade do servidor DNS upstream. Por exemplo, se houver um servidor upstream não íntegro, você verá a seguinte saída:

  • Uma consulta DNS (QR=Q) com um ID (por exemplo, b256) não tem resposta correspondente.
  • Uma resposta DNS (QR=R) tem um valor alto na LATENCY coluna (por exemplo, 500.821223ms).
  • Uma resposta DNS (QR=R) tem um RCODE diferente de No Error, por exemplo, "Falha do servidor" e "Consulta recusada". Para obter mais informações, consulte gopacket os possíveis valores de rcode.

Etapa 4: verificar se as consultas DNS obtêm respostas em tempo hábil

Você pode usar o gadget DNS para verificar se uma determinada consulta DNS obtém uma resposta em tempo hábil. Para executar essa verificação, filtre os eventos com um nome DNS e corresponda às IDs de consulta/resposta:

$ kubectl gadget trace dns -l app=test-pod --output columns=k8s,id,qtype,qr,name,rcode,latency --filter name:microsoft.com.
K8S.NODE       K8S.NAMESPACE   K8S.POD     K8S.CONTAINER   ID          QTYPE     QR  NAME              RCODE               LATENCY
aks-agen...    default         test-pod    nginx           97b3        A         Q   microsoft.com.
aks-agen...    default         test-pod    nginx           97b3        A         R   microsoft.com.    No Error            1.954413ms
aks-agen...    default         test-pod    nginx           97b3        A         R   microsoft.com.    No Error
aks-agen...    default         test-pod    nginx           c6c5        AAAA      Q   microsoft.com.
aks-agen...    default         test-pod    nginx           c6c5        AAAA      R   microsoft.com.    No Error            1.885412ms
aks-agen...    default         test-pod    nginx           c6c5        AAAA      R   microsoft.com.    No Error

Aqui estão as explicações dos parâmetros do comando:

  • -l app=test-pod: Mostra apenas dados de/para pods com o rótulo app=test-pod.
  • --output columns=k8s,id,qtype,qr,name,rcode,latency: Mostra apenas informações do Kubernetes, ID de consulta DNS, tipo de consulta, consulta/resposta, nome DNS, resultado da resposta DNS e latência de resposta.
  • --filter name:microsoft.com.: corresponde apenas a pacotes DNS com o nome microsoft.com. DNS Para garantir que o valor do filtro seja um nome de domínio totalmente qualificado (FQDN), adicione um ponto (.) ao final do nome.

O ID valor (por exemplo, 97b3) pode ser usado para correlacionar as consultas com as respostas. Você também pode usar o LATENCY valor para validar se obtém as respostas em tempo hábil.

Etapa 5: Verificar se as respostas DNS contêm os endereços IP esperados

Você pode usar o gadget DNS para verificar se uma determinada consulta DNS obtém a resposta esperada. Por exemplo, para um serviço headless (chamado myheadless), você esperaria que a resposta contivesse os endereços IP de todos os pods.

$ kubectl gadget trace dns -l app=test-pod  -o columns=k8s,id,qtype,qr,name,rcode,numAnswers,addresses  -F name:~myheadless 
K8S.NODE         K8S.NAMESPACE      K8S.POD         K8S.CONTAINER   ID    QTYPE   QR  NAME                 RCODE           NUMANSWERS     ADDRESSES
aks-agen...      default            test-pod        nginx           f930  A       R   myheadless.defau...  No Error        2              10.244.2.18,10.244.2.19 
aks-agen...      default            test-pod        nginx           f930  A       R   myheadless.defau...  No Error        2              10.244.2.18,10.244.2.19 
aks-agen...      default            test-pod        nginx           f930  A       Q   myheadless.defau...                  0                              

Aqui estão as explicações dos parâmetros do comando:

  • -l app=test-pod: Mostra apenas dados de/para pods com o rótulo app=test-pod.
  • -o columns=k8s,id,qtype,qr,name,rcode,numAnswers,addresses: mostra apenas informações do Kubernetes, ID de consulta DNS, tipo de consulta, consulta/resposta, nome DNS, resultado da resposta DNS, número de respostas e endereços IP na resposta.
  • -F name:~myheadless: Inclui apenas pacotes DNS que passam na ~myheadless verificação regex.

Você pode usar os NUMANSWERS valores e ADDRESSES para corresponder aos valores obtidos de kubectl get ep myheadless.

$ kubectl get ep myheadless 
NAME                  ENDPOINTS                           AGE 
myheadless            10.244.2.18:8080,10.244.2.19:8080   10d 

Aviso de isenção de responsabilidade para informações de terceiros

Os produtos de terceiros mencionados neste artigo são produzidos por empresas independentes da Microsoft. A Microsoft não oferece nenhuma garantia, implícita ou não, do desempenho ou da confiabilidade desses produtos.

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.