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
CLI do Azure.
Para instalar a CLI do Azure, consulte Como instalar a CLI do Azure.
Uma ferramenta para se conectar ao cluster, como a ferramenta de linha de comando do Kubernetes kubectl.
Para instalar o kubectl usando a CLI do Azure, execute o comando az aks install-cli .
Gadget Inspektor.
Essa ferramenta é usada na maioria das etapas de solução de problemas abordadas neste artigo, portanto, certifique-se de instalá-la no cluster. Para instalá-lo em um cluster do AKS, consulte Como instalar o Gadget Inspektor em um cluster do AKS.
Familiaridade com gadgets.
-
Ele é usado em todas as etapas de solução de problemas a seguir.
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êmNo Error
. Para obter mais informações, consultegopacket
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.conf
de 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 menos5 ms
.
Aqui estão algumas causas de consultas DNS lentas:
- Os servidores de nomes DNS upstream apresentam problemas.
- Problemas de rede no cluster.
- Os pods CoreDNS não estão disponíveis. Para verificar se os pods estão funcionando bem, siga as etapas de solução de problemas em Solucionar problemas de falhas de resolução de DNS de dentro do pod.
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 dokube-system
namespace.-l k8s-app=kube-dns
: mostra apenas dados de/para pods com o rótulok8s-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 ID
valores , RCODE
e 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 umID
(por exemplo,b256
) não tem resposta correspondente. - Uma resposta DNS (
QR=R
) tem um valor alto naLATENCY
coluna (por exemplo,500.821223ms
). - Uma resposta DNS (
QR=R
) tem umRCODE
diferente deNo Error
, por exemplo, "Falha do servidor" e "Consulta recusada". Para obter mais informações, consultegopacket
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ótuloapp=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 nomemicrosoft.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ótuloapp=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.