Diagnostique e corrija falhas de DNS em clusters ACK causadas por problemas no CoreDNS, na rede, em políticas ou no kernel.
Como funciona a resolução de DNS
Quando um pod de aplicação envia uma consulta DNS, ele segue este caminho:
O pod envia uma consulta DNS para o endereço definido em
/etc/resolv.conf, geralmente o IP do Service kube-dns.O kube-dns encaminha a consulta para um pod do CoreDNS no namespace
kube-system.Para nomes de domínio internos terminados em
.cluster.local, o CoreDNS resolve a partir do cache, sem consultar servidores upstream.Para nomes de domínio externos, o CoreDNS encaminha a consulta aos servidores DNS upstream especificados na configuração. Os servidores upstream padrão são
100.100.2.136e100.100.2.138, ambos implantados na Virtual Private Cloud (VPC).
Com o NodeLocal DNSCache, as consultas vão primeiro para o cache local (169.254.20.10) e só recorrem ao kube-dns se não houver resolução.
Conceitos principais
|
Termo |
Descrição |
|
Nome de domínio interno |
Domínio terminado em |
|
Nome de domínio externo |
Domínio não terminado em |
|
Pod de aplicação |
Qualquer pod que não seja componente de sistema. |
|
Service kube-dns |
Service do Kubernetes que roteia o tráfego DNS para os pods do CoreDNS. Seu IP é o nameserver padrão para pods de aplicação. |
|
NodeLocal DNSCache |
DaemonSet que executa um cache DNS local em cada nó. Quando ativado, os pods consultam o cache local ( |
|
Servidor DNS upstream |
Servidor DNS consultado pelo CoreDNS para domínios externos. O padrão é |
Etapa 1: Identifique a mensagem de erro
Compare a mensagem de erro para determinar a categoria provável da falha.
|
Cliente |
Mensagem de erro |
Causa provável |
|
ping |
|
O domínio não existe ou o servidor DNS está inacessível. Latência >5s indica servidor inacessível. |
|
curl |
|
Mesma causa acima. |
|
Cliente HTTP PHP |
|
Mesma causa acima. |
|
Cliente HTTP Golang |
|
O domínio não existe. |
|
dig |
|
O domínio não existe. |
|
Cliente HTTP Golang |
|
Servidor DNS inacessível. |
|
dig |
|
Servidor DNS inacessível. |
Domain does not exist → Verifique se o nome de domínio está correto. Se apenas domínios externos falharem, consulte Nome de domínio externo não pode ser resolvido.
DNS server unreachable → Prossiga para a Etapa 2.
Etapa 2: Verifique a política de DNS e o endereço do servidor
Confirme se o pod usa o CoreDNS como servidor DNS.
Obtenha a política de DNS e a configuração:
# View the pod's DNS policy
kubectl get pod <pod-name> -o yaml
# Log in to the pod and inspect the DNS configuration
kubectl exec -it <pod-name> -- cat /etc/resolv.conf
Verifique o campo dnsPolicy e as entradas nameserver no arquivo /etc/resolv.conf.
|
**Valor de |
Comportamento |
|
|
Padrão. O pod usa o IP do Service kube-dns como servidor DNS. |
|
|
Igual a |
|
|
O pod herda as configurações de DNS do nó Elastic Compute Service (ECS). Use apenas quando o pod não precisar resolver nomes internos do cluster. |
|
|
DNS configurado inteiramente via |
Se o pod não usar o CoreDNS (o nameserver não é o IP do Service kube-dns), o pod pode estar sobrecarregado ou a tabela conntrack pode estar cheia. Consulte Cliente sobrecarregado e Tabela conntrack cheia.
Se o pod usar NodeLocal DNSCache (o nameserver é 169.254.20.10), consulte NodeLocal DNSCache não funciona e Nomes do Alibaba Cloud DNS PrivateZone não podem ser resolvidos.
Se o pod usar o CoreDNS, continue para a Etapa 3.
Etapa 3: Verifique a integridade dos pods do CoreDNS
Inspecione os pods do CoreDNS:
# View CoreDNS pod status and placement
kubectl -n kube-system get pod -o wide -l k8s-app=kube-dns
Saída esperada:
NAME READY STATUS RESTARTS AGE IP NODE
coredns-xxxxxxxxx-xxxxx 1/1 Running 0 25h 172.20.6.53 cn-hangzhou.192.168.0.198
# View real-time CPU and memory usage
kubectl -n kube-system top pod -l k8s-app=kube-dns
Saída esperada:
NAME CPU(cores) MEMORY(bytes)
coredns-xxxxxxxxx-xxxxx 3m 18Mi
Pods not in Running state → Execute
kubectl -n kube-system describe pod <CoreDNS-pod-name>para identificar a causa. Consulte Pods do CoreDNS não executam normalmente.CPU or memory near the limit → Consulte Pods do CoreDNS sobrecarregados.
CPU usage uneven across pods → Consulte Consultas DNS não distribuídas uniformemente.
Etapa 4: Verifique os logs operacionais do CoreDNS
kubectl -n kube-system logs -f --tail=500 --timestamps <coredns-pod-name>
|
Flag |
Descrição |
|
|
Transmite a saída do log em tempo real. |
|
|
Exibe as últimas 500 linhas. |
|
|
Inclui carimbos de data/hora em cada linha de log. |
Procure padrões de erro correspondentes a problemas conhecidos. Para logs no nível de consulta DNS, ative primeiro o plugin de log do CoreDNS. Consulte Configurar resolução de DNS.
Com o plugin de log ativado, cada consulta resolvida gera uma entrada como:
[INFO] 172.20.2.25:44525 - 36259 "A IN redis-master.default.svc.cluster.local. udp 56 false 512" NOERROR qr,aa,rd 110 0.000116946s
Códigos de resposta comuns:
|
Código de resposta |
Significado |
Ação recomendada |
|
|
Resolvido com sucesso. |
Nenhuma ação necessária. |
|
|
O domínio não existe no servidor upstream. |
Verifique se o nome de domínio inclui um sufixo de busca que não resolve. |
|
|
O servidor DNS upstream retornou um erro. |
Verifique a conectividade do CoreDNS com os servidores upstream. |
|
|
O servidor upstream rejeitou a consulta. |
Verifique a configuração do Corefile do CoreDNS e o arquivo |
Os códigos de resposta DNS estão definidos na RFC 1035.
Etapa 5: Reproduza o erro e isole a causa
Se o erro ocorrer consistentemente:
Verifique o log de consultas DNS para códigos de resposta de erro. Consulte Nome de domínio externo não pode ser resolvido.
Teste a conectividade de rede entre os pods de aplicação e o CoreDNS. Consulte Testar conectividade de rede entre pods de aplicação e CoreDNS.
Diagnostique a rede de contêineres. Consulte Diagnosticar a rede de contêineres.
Se o erro ocorrer intermitentemente:
Capture pacotes para coletar evidências. Consulte Capturar pacotes.
Se o problema persistir,abra um ticket.
Métodos de diagnóstico
Testar conectividade de rede entre pods de aplicação e CoreDNS
Acesse o namespace de rede do pod de aplicação usando um destes métodos:
Método 1 (recomendado): Execute
kubectl exec -it <pod-name> -- bashpara entrar no pod.Método 2: Faça login no nó, encontre o ID do processo com
ps aux | grep <application-process-name>e entre no namespace de rede comnsenter -t <pid> -n bash.-
Método 3 (para pods que reiniciam frequentemente):
Faça login no nó.
Execute
docker ps -a | grep <application-container-name>para encontrar os IDs dos contêineres sandbox (nomes começam comk8s_POD_).Execute
docker inspect <sandboxed-container-ID> | grep netnspara encontrar o caminho do namespace de rede em/var/run/docker/netns/xxxx.Execute nsenter -n bash para entrar no namespace. > Note: Não adicione espaço entre
-ne<netns-path>.
A partir do namespace de rede do pod, teste a conectividade:
# Test connectivity to the kube-dns Service
dig <domain> @<kube-dns-svc-ip>
# Test Internet Control Message Protocol (ICMP) connectivity to the CoreDNS pod
ping <coredns-pod-ip>
# Test DNS query directly to the CoreDNS pod
dig <domain> @<coredns-pod-ip>
Substitua <kube-dns-svc-ip> pelo IP do Service kube-dns no namespace kube-system e <coredns-pod-ip> pelo IP de um pod do CoreDNS.
| Sintoma | Causa provável | Próxima etapa |
|---|---|---|
| Não é possível alcançar o Service kube-dns | Nó sobrecarregado, kube-proxy inativo ou grupo de segurança bloqueando a porta 53 do User Datagram Protocol (UDP) | Verifique se as regras do grupo de segurança permitem a porta UDP 53. Se permitirem, abra um ticket. |
| Não é possível alcançar o pod do CoreDNS (ICMP) | Erro na rede de contêineres ou grupo de segurança bloqueando ICMP | Diagnostique a rede de contêineres. |
| Não é possível alcançar o pod do CoreDNS (DNS) | Nó sobrecarregado ou grupo de segurança bloqueando a porta UDP 53 | Verifique se as regras do grupo de segurança permitem a porta UDP 53. Se permitirem, abra um ticket. |
Testar conectividade de rede do CoreDNS
Faça login no nó onde o pod do CoreDNS está em execução.
Execute
ps aux | grep corednspara obter o ID do processo do CoreDNS.Execute
nsenter -t <pid> -n bashpara entrar no namespace de rede do CoreDNS.-
Teste a conectividade:
# Test connectivity to the Kubernetes API server telnet <apiserver_clusterip> 6443 # apiserver_clusterip is the ClusterIP of the kubernetes Service in the default namespace. # Test connectivity to upstream DNS servers dig <domain> @100.100.2.136 dig <domain> @100.100.2.138
| Sintoma | Causa provável | Próxima etapa |
|---|---|---|
| Não é possível alcançar o servidor de API do Kubernetes | Erro no servidor de API, nó sobrecarregado ou kube-proxy inativo | Abra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticket. |
| Não é possível alcançar servidores DNS upstream | Nó sobrecarregado, CoreDNS mal configurado ou erro de roteamento no Express Connect | Abra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticket. |
Diagnosticar a rede de contêineres
Acesse o console ACKconsole ACK.
Na página Clusters, clique no nome do cluster ou em Details na coluna Actions.
No painel de navegação à esquerda, escolha Operations > Cluster Check.
Na página Container Intelligence Service, escolha Cluster Check > Diagnosis.
Na página Diagnosis, clique na aba Network Diagnosis.
Defina Source address como o IP do pod de aplicação, Destination address como o IP do Service kube-dns e Destination port como
53. Selecione Enable packet tracing e I know and agree e clique em Create diagnosis.Na lista de diagnósticos, clique em Diagnosis details do registro desejado.
Os resultados mostram Diagnosis result, Packet paths e All possible paths, além das causas de erro identificadas. Consulte Usar o recurso de diagnóstico de cluster para solucionar problemas do cluster.
Capturar pacotes
Use a captura de pacotes quando os erros forem intermitentes e difíceis de reproduzir.
Faça login nos nós onde os pods de aplicação e o pod do CoreDNS estão em execução.
-
Capture o tráfego DNS em cada instância ECS:
tcpdump -i any port 53 -C 20 -W 200 -w /tmp/client_dns.pcapEsse comando captura todo o tráfego na porta 53, alternando entre até 200 arquivos de 20 MB cada.
Reproduza o erro e analise os pacotes da janela de tempo da falha. Verifique os logs da aplicação para obter os carimbos de data/hora exatos.
A captura de pacotes tem impacto insignificante no serviço — apenas um leve aumento na utilização da CPU e na E/S de disco.
Problemas conhecidos
Verifique estes problemas específicos do ambiente antes de investigar mais profundamente.
|
Problema |
Ambientes afetados |
Identificação rápida |
|
Todos (especialmente imagens baseadas em Alpine e aplicações PHP) |
Falhas intermitentes; a captura de pacotes mostra consultas A/AAAA simultâneas na mesma porta |
|
|
kube-proxy no modo IP Virtual Server (IPVS); CentOS ou Alibaba Cloud Linux 2 com kernel anterior a |
Falhas duram aproximadamente 5 minutos durante o dimensionamento de nós ou do CoreDNS |
|
|
Nós com alto tráfego |
|
|
|
Clusters usando tanto NodeLocal DNSCache quanto DNS PrivateZone |
Nomes de domínio do PrivateZone ou |
|
|
Clusters criando contêineres em alta frequência |
Nomes externos falham intermitentemente ou resolvem para IPs incorretos; nomes internos geralmente resolvem normalmente, exceto em clusters que criam contêineres em alta frequência, onde nomes de serviços internos também podem resolver para IPs incorretos |
|
|
Clusters onde tanto nomes de domínio internos quanto externos falham |
Erros de resolução apenas em nomes de domínio adicionados ao Alibaba Cloud DNS PrivateZone e nomes de domínio que contêm vpc-proxy |
Perguntas frequentes
Nome de domínio externo não pode ser resolvido
Verifique o código de resposta no log de consultas do CoreDNS. Ative o plugin de log se ainda não estiver ativado (consulte Configurar resolução de DNS) e pesquise pelo domínio com falha. NXDOMAIN significa que o domínio não existe no upstream — frequentemente porque um sufixo de busca foi anexado, criando um FQDN inválido. SERVFAIL ou REFUSED indica problema no servidor upstream; verifique a configuração do CoreDNS e a conectividade com 100.100.2.136 e 100.100.2.138.
Nomes de domínio de Services headless não podem ser resolvidos
Em versões do CoreDNS anteriores a 1.7.0, instabilidades na rede do servidor de API podem fazer o CoreDNS encerrar, interrompendo as atualizações de registros de Services headless. Atualize para a versão 1.7.0 ou posterior. Consulte [\[Atualizações de Componentes\] Atualizar CoreDNS](t1964489.dita#task_1964489).
Nomes de domínio de pods StatefulSet não podem ser resolvidos
O modelo de pod do StatefulSet deve definir serviceName como o nome do Service headless. Sem isso, nomes DNS por pod (por exemplo, pod.headless-svc.ns.svc.cluster.local) não podem ser resolvidos, mesmo que o nome no nível do Service (por exemplo, headless-svc.ns.svc.cluster.local) funcione. Defina serviceName na especificação do StatefulSet.
Consultas DNS bloqueadas por regras de grupo de segurança ou ACLs de rede
Regras de grupo de segurança ou listas de controle de acesso (ACLs) de rede estão bloqueando a porta UDP 53, causando falhas de DNS nos nós afetados. Permita o tráfego de entrada e saída na porta UDP 53.
Erros de conectividade na rede de contêineres causam falhas de DNS
Erros na rede de contêineres bloqueiam a porta UDP 53. Use o recurso Network Diagnosis para identificar o caminho quebrado e a causa raiz.
Pods do CoreDNS sobrecarregados
Quando o volume de consultas excede a capacidade das réplicas do CoreDNS, a latência aumenta e ocorrem falhas. Verifique se o uso de CPU e memória está próximo do limite (kubectl -n kube-system top pod -l k8s-app=kube-dns).
Duas soluções:
Implante o NodeLocal DNSCache para absorver consultas localmente e reduzir a carga no CoreDNS. Consulte Configurar NodeLocal DNSCache.
Escale horizontalmente as réplicas do CoreDNS para que a utilização máxima de CPU por pod permaneça bem abaixo da CPU disponível no nó.
Consultas DNS não distribuídas uniformemente entre os pods do CoreDNS
Agendamento desequilibrado de pods ou uma configuração sessionAffinity no kube-dns pode causar distribuição desigual de consultas. Sintoma: utilização de CPU visivelmente diferente entre os pods do CoreDNS.
Duas soluções:
Escale horizontalmente os pods do CoreDNS e distribua-os por diferentes nós.
Remova a configuração
sessionAffinitydo Service kube-dns. Consulte Configurar o Service kube-dns.
Pods do CoreDNS não executam normalmente
YAML ou ConfigMap mal configurados podem impedir o início do CoreDNS ou causar falhas. Sintomas: pods não estão em estado Running, contagem de reinicializações aumentando ou erros nos logs.
Verifique o log do CoreDNS para estes erros comuns:
|
Erro |
Causa |
Correção |
|
|
O ConfigMap do CoreDNS contém um plugin não suportado pela versão atual. |
Exclua o plugin não suportado (ex.: |
|
|
As conexões com o servidor de API foram interrompidas quando o log foi gerado. |
Se não houver falhas de DNS, esta não é a causa raiz. Caso contrário, teste a conectividade do CoreDNS. Consulte Testar conectividade de rede do CoreDNS. |
|
|
O CoreDNS não conseguiu alcançar os servidores DNS upstream. |
Teste a conectividade do pod do CoreDNS para |
Falhas na resolução de DNS devido a cliente sobrecarregado
Quando a instância ECS está totalmente carregada, pacotes UDP podem ser descartados antes de chegar ao CoreDNS. Procure por taxa anormal de retransmissão da controladora de interface de rede (NIC) e alta utilização de CPU nos dados de monitoramento.
Duas opções:
Abra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticketAbra um ticket para investigação detalhada.
Implante o NodeLocal DNSCache para reduzir o tráfego DNS entre nós. Consulte Configurar NodeLocal DNSCache.
Tabela conntrack cheia
Quando a tabela conntrack está cheia, novas conexões UDP e TCP são descartadas. Isso geralmente causa falhas de DNS em horários de pico que se recuperam fora do pico. Para confirmar, execute dmesg -H no nó afetado e procure por conntrack full durante a janela da falha.
Aumente o número máximo de entradas na tabela conntrack. Consulte Como aumento o número máximo de conexões rastreadas na tabela conntrack do kernel Linux?
Plugin autopath não funciona normalmente
Um defeito conhecido no plugin autopath causa falhas ocasionais na resolução ou IPs incorretos para domínios externos. Domínios internos resolvem corretamente. O problema piora em clusters com altas taxas de criação de contêineres.
Desative o plugin autopath:
Edite o ConfigMap do CoreDNS com
kubectl -n kube-system edit configmap coredns.Exclua a linha
autopath @kubernetes. Salve e saia.Verifique se a configuração foi carregada checando os logs do CoreDNS para
reload.
Falhas na resolução de DNS devido a consultas simultâneas de registros A e AAAA
Algumas distribuições Linux enviam consultas A e AAAA simultaneamente pela mesma porta, acionando conflitos no conntrack que descartam pacotes UDP.
Sintomas: falhas intermitentes na resolução; a captura de pacotes mostra consultas A e AAAA simultâneas da mesma porta de origem.
As correções dependem da base da sua imagem:
CentOS ou Ubuntu: Adicione
options timeout:2 attempts:3 rotate single-request-reopenà configuração do resolvedor DNS.Alpine Linux: Substitua a imagem baseada em Alpine por uma baseada em outro SO. Consulte Ressalvas do Alpine.
PHP com cURL: Adicione
CURL_IPRESOLVE_V4para forçar resolução apenas IPv4. Consulte Funções cURL.Todos os ambientes: Implante o NodeLocal DNSCache, que mitiga a condição de corrida. Consulte Configurar NodeLocal DNSCache.
Falhas na resolução de DNS devido a erros no IPVS
No modo IPVS com CentOS ou Alibaba Cloud Linux 2 (kernel anterior a 4.19.91-25.1.al7.x86_64), a remoção de pods de backend UDP causa conflitos de porta de origem que descartam pacotes. Falhas de DNS duram cerca de 5 minutos durante eventos de dimensionamento de nós ou do CoreDNS.
Duas soluções:
Implante o NodeLocal DNSCache para ignorar o caminho IPVS nas consultas DNS. Consulte Configurar NodeLocal DNSCache.
Reduza o tempo limite de sessão UDP no modo IPVS. Consulte Alterar o período de tempo limite UDP no modo IPVS.
NodeLocal DNSCache não funciona
As consultas DNS ignoram o NodeLocal DNSCache quando uma das condições se aplica:
O
dnsConfignão foi injetado nos pods de aplicação, então eles ainda apontam para o IP do Service kube-dns.Os pods usam uma imagem base Alpine Linux, que consulta todos os nameservers simultaneamente, incluindo o CoreDNS diretamente.
Para o primeiro caso, ative a injeção automática de dnsConfig. Consulte Configurar NodeLocal DNSCache. Para imagens Alpine, use uma imagem construída sobre outro SO. Consulte Ressalvas do Alpine.
Nomes do Alibaba Cloud DNS PrivateZone não podem ser resolvidos
O Alibaba Cloud DNS PrivateZone requer UDP, não TCP. Com o NodeLocal DNSCache, domínios do PrivateZone, endpoints de API vpc-proxy ou outros nomes de domínio podem falhar na resolução ou resolver para IPs incorretos.
Adicione prefer_udp à configuração do CoreDNS para forçar UDP nas consultas upstream. Consulte Configurar CoreDNS.