Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Troubleshoot DNS resolution issues

Última atualização: Jun 30, 2026

Este tópico descreve o fluxo de trabalho de diagnóstico, as abordagens de solução de problemas, as soluções comuns e os métodos para resolver falhas na resolução de DNS.

Fluxo de trabalho de diagnóstico

Observações importantes

A solução de problemas de DNS no Kubernetes é complexa devido à natureza multicamada e dinâmica das arquiteturas de rede. Além de erros nos componentes CoreDNS e NodeLocal DNSCache, os seguintes fatores também podem causar falhas na resolução de DNS.

Importante

As Melhores práticas de DNS fornecem recomendações para diferentes cenários. Seguir essas recomendações ajuda a configurar o DNS de forma mais eficaz e reduz a probabilidade de problemas relacionados ao DNS.

  • Carga da arquitetura de rede

    O caminho de resolução de DNS envolve vários componentes, incluindo CoreDNS/kube-dns, kube-proxy e plug-ins CNI. Uma falha em qualquer camada pode causar problemas. Portanto, solucione problemas de cada componente passo a passo para identificar a causa raiz. Para obter o caminho completo de solução de problemas, consulte Solucionar problemas de outros componentes no caminho de DNS.

  • Mecanismo de descoberta de serviços e obscuridade de namespace

    • Dependência de FQDN: O acesso a serviços entre namespaces exige o uso do nome de domínio completo (por exemplo, service.namespace.svc.cluster.local). Se o namespace não for especificado no nome de domínio, o DNS pesquisará apenas dentro do namespace atual. O acesso entre namespaces falha sem mensagens de erro claras.

    • Comportamento de Headless Services: Os Headless Services retornam IPs de pods diretamente. Uma configuração inadequada pode resultar em registros DNS incompletos ou ausentes.

  • Restrições de política de rede

    • Bloqueio implícito: Se a NetworkPolicy do Pod não permitir tráfego nas portas DNS (porta UDP e TCP padrão 53), o pod não poderá se comunicar com o CoreDNS.

    • Interferência de grupo de segurança da VPC: O firewall interno ou as regras de grupo de segurança podem descartar o tráfego DNS, especialmente em configurações de grupo de segurança da VPC.

    • Abordagem de solução de problemas: Verifique a conectividade de rede dos pods do CoreDNS no namespace kube-system e confirme se as políticas permitem tráfego de entrada e saída.

  • Limitações de ferramentas de depuração e logs

    • Ferramentas ausentes: As imagens de contêiner não incluem dig ou nslookup por padrão. Instale-as manualmente ou use um contêiner de depuração temporário.

    • Logs dispersos: Ative o modo Debug manualmente no CoreDNS (adicionando o plug-in log) para visualizar os logs, distribuídos por várias instâncias de réplica.

    • Dica de depuração: Execute testes rápidos de DNS a partir de um pod temporário:

      kubectl run -it --rm debug --image=nicolaka/netshoot -- dig

      ou use:

      nslookup  <target-domain>

Termos

  • Nomes de domínio internos ao cluster: O CoreDNS expõe serviços no cluster como nomes de domínio internos, que terminam com .cluster.local por padrão. O CoreDNS resolve esses nomes de domínio usando seu cache interno e não consulta servidores DNS upstream.

  • Nomes de domínio externos ao cluster: Resolução de DNS autoritativa registrada com provedores de DNS de terceiros, Alibaba Cloud DNS (Cloud DNS), PrivateZone e produtos similares. Servidores DNS upstream lidam com a resolução desses nomes de domínio, e o CoreDNS apenas encaminha as solicitações de resolução.

  • Pod de aplicação: Um pod de contêiner implantado em um cluster Kubernetes, excluindo contêineres de componentes do sistema Kubernetes.

  • Pod de aplicação conectado ao CoreDNS: Um pod de aplicação cujo servidor DNS aponta para o CoreDNS.

  • Pod de aplicação conectado ao NodeLocal DNSCache: Após instalar o plug-in NodeLocal DNSCache no cluster, os pods de aplicação injetam automaticamente ou manualmente o DNSConfig. Esses pods priorizam o acesso ao componente de cache local para resolução de nomes de domínio. Se o componente de cache local estiver inacessível, eles retornam ao serviço kube-dns fornecido pelo CoreDNS.

Fluxo de trabalho de solução de problemas do CoreDNS e NodeLocal DNSCache

故障手册流程.png

  1. Identifique a causa atual do problema. Para obter detalhes, consulte Erros comuns de cliente.

    • Se a causa do erro for a inexistência do nome de domínio, consulte Solução de problemas Por tipo de nome de domínio envolvido em erros de análise.

    • Se a causa do erro for a impossibilidade de conexão com o servidor DNS, consulte a seção “Por frequência de erros de análise” em Solução de problemas.

  2. Se as etapas anteriores não produzirem resultados, siga estas instruções.

Erros comuns de cliente

Cliente

Log de erro

Possível problema

ping

ping: xxx.yyy.zzz: Name or service not known

O nome de domínio não existe ou o servidor DNS está inacessível. Se a latência de resolução exceder 5 segundos, é provável que o servidor DNS esteja inacessível.

curl

curl: (6) Could not resolve host: xxx.yyy.zzz

Cliente HTTP PHP

php_network_getaddresses: getaddrinfo failed: Name or service not known in xxx.php on line yyy

Cliente HTTP Golang

dial tcp: lookup xxx.yyy.zzz on 100.100.2.136:53: no such host

O nome de domínio não existe.

dig

;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: xxxxx

Cliente HTTP Golang

dial tcp: lookup xxx.yyy.zzz on 100.100.2.139:53: read udp 192.168.0.100:42922->100.100.2.139:53: i/o timeout

O servidor DNS está inacessível.

dig

;; connection timed out; no servers could be reached

Solucionar problemas de outros componentes no caminho de DNS

O diagrama a seguir mostra o caminho geral de resolução de DNS. Componentes além do CoreDNS e NodeLocal DNSCache também podem causar falhas na resolução de DNS:

  • Resolvedor DNS: Linguagens de programação como Go e bibliotecas como glibc e musl podem conter defeitos em suas implementações de resolução de DNS, levando a falhas ocasionais na resolução.

  • Arquivo /etc/resolv.conf: O arquivo de configuração de DNS nos contêineres contém IPs de servidores DNS e domínios de pesquisa DNS. A configuração incorreta deste arquivo causa falhas na resolução de DNS.

  • kube-proxy: O kube-proxy usa IPVS/Iptables para encaminhar solicitações. Se o kube-proxy não for atualizado prontamente quando a configuração do CoreDNS mudar, o CoreDNS torna-se inacessível, causando falhas intermitentes na resolução de DNS.

  • Servidores DNS Upstream: O CoreDNS resolve apenas nomes de domínio internos ao cluster. Para nomes de domínio que não correspondem ao clusterDomain, o CoreDNS consulta servidores DNS de nível superior, como o DNS interno da VPC. A configuração incorreta dos servidores DNS upstream faz com que os pods falhem ao acessar nomes de domínio fora do cluster.

Abordagens de solução de problemas

Abordagem de solução de problemas

Base para solução de problemas

Problemas e soluções

Solucionar por tipo de nome de domínio

Falha em nomes de domínio internos e externos ao cluster

Falha apenas em nomes de domínio externos ao cluster

Problemas de resolução de nomes de domínio externos ao cluster

Falha apenas em nomes de domínio PrivateZone ou vpc-proxy

Problemas de resolução de nomes de domínio do PrivateZone

Falha apenas em nomes de domínio de Headless service

Solucionar por frequência do problema

Falha completa na resolução

Os problemas ocorrem apenas durante horários de pico de negócios

Os problemas ocorrem com muita frequência

Os problemas ocorrem com pouca frequência

Os problemas ocorrem apenas durante o dimensionamento de nós ou redução de escala do CoreDNS

Falhas na resolução de DNS após anomalias no pod do CoreDNS no modo IPVS

Métodos comuns de inspeção

Verificar a configuração de DNS dos pods de aplicação

  • Comando

    # View the YAML configuration of the foo container and confirm that the DNSPolicy field meets expectations.
    kubectl get pod foo -o yaml
    # If DNSPolicy meets expectations, enter the pod container to check the effective DNS configuration.
    # Enter the foo container using bash. If bash is unavailable, use sh instead.
    kubectl exec -it foo bash
    # After entering the container, view the DNS configuration. The nameserver entry shows the DNS server address.
    cat /etc/resolv.conf
  • Descrição da configuração de DNS Policy

    Os exemplos a seguir mostram configurações de DNS Policy. Escolha a configuração apropriada com base no seu cenário:

    Exemplo 1: Configuração de DNS Policy para cenários padrão

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod-name>
      namespace: <pod-namespace>
    spec:
      containers:
      - image: <container-image>
        name: <container-name>
      dnsPolicy: ClusterFirst
      securityContext: {}
      serviceAccount: default
      serviceAccountName: default
      terminationGracePeriodSeconds: 30

    Exemplo 2: Configuração de DNS Policy ao usar NodeLocal DNSCache

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod-name>
      namespace: <pod-namespace>
    spec:
      containers:
      - image: <container-image>
        name: <container-name>
      dnsPolicy: None
      dnsConfig:
        nameservers:
        - 169.254.20.10
        - 172.21.0.10
        options:
        - name: ndots
          value: "3"
        - name: timeout
          value: "1"
        - name: attempts
          value: "2"
        searches:
        - default.svc.cluster.local
        - svc.cluster.local
        - cluster.local
      securityContext: {}
      serviceAccount: default
      serviceAccountName: default
      terminationGracePeriodSeconds: 30

    Valor de DNSPolicy

    Servidor DNS usado

    Default

    Aplica-se apenas a cenários onde serviços internos ao cluster não são acessados. Ao criar um pod, ele herda a lista de servidores DNS do arquivo /etc/resolv.conf do nó ECS.

    ClusterFirst

    Este é o valor padrão de DNSPolicy. O pod usa o IP do serviço kube-dns fornecido pelo CoreDNS como servidor DNS. Pods com HostNetwork habilitado comportam-se como no modo Default ao usar ClusterFirst.

    ClusterFirstWithHostNet

    Pods com HostNetwork habilitado comportam-se como ClusterFirst ao usar ClusterFirstWithHostNet.

    None

    Use com DNSConfig para personalizar servidores DNS e parâmetros. Quando a injeção do NodeLocal DNSCache está ativada, o DNSConfig aponta o servidor DNS para o IP do cache local e o IP do serviço kube-dns fornecido pelo CoreDNS.

Verificar o status do pod do CoreDNS

Comando

  • Execute o seguinte comando para visualizar informações do pod.

    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
  • Execute o seguinte comando para visualizar o uso de recursos em tempo real dos pods.

    kubectl -n kube-system top pod -l k8s-app=kube-dns

    Saída esperada:

    NAME                      CPU(cores)   MEMORY(bytes)
    coredns-xxxxxxxxx-xxxxx   3m           18Mi
  • Se o pod não estiver no estado Running, execute kubectl -n kube-system describe pod <CoreDNS Pod name> para identificar o problema.

Verificar logs operacionais do CoreDNS

Comando

Execute o seguinte comando para verificar os logs operacionais do CoreDNS.

kubectl -n kube-system logs -f --tail=500 --timestamps coredns-xxxxxxxxx-xxxxx

Parâmetro

Descrição

f

Saída contínua.

tail=500

Exibe as últimas 500 linhas de logs.

timestamps

Exibe carimbos de data/hora junto aos logs.

coredns-xxxxxxxxx-xxxxx

Nome da réplica do pod do CoreDNS.

Verificar logs de solicitação de consulta DNS do CoreDNS

Comando

Os logs de solicitação de consulta DNS aparecem nos logs do contêiner somente após ativar o plug-in Log no CoreDNS. Para obter instruções sobre como ativar o plug-in Log, consulte Configuração não gerenciada do CoreDNS.

O comando é o mesmo usado para verificar os logs operacionais do CoreDNS. Consulte Verificar logs operacionais do CoreDNS.

Verificar a conectividade de rede do pod do CoreDNS

Use o console ou a linha de comando para verificar a conectividade de rede do pod do CoreDNS.

Console

Use os recursos de diagnóstico de rede fornecidos pelo cluster.

  1. Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.

  2. Na página Clusters, clique no nome do cluster de destino. No painel de navegação à esquerda, escolha Inspections and Diagnostics > Diagnostics.

  3. Na página Diagnostics, clique na aba Network diagnostics e, em seguida, clique em Diagnose no canto superior esquerdo.

  4. Na página Network diagnostics, clique em Diagnose. No painel Access Information, preencha os parâmetros de diagnóstico da seguinte forma:

    • Source address: Insira o IP do pod do CoreDNS.

    • Destination address: Insira o endereço do servidor DNS upstream. As opções padrão são 100.100.2.136 ou 100.100.2.138.

    • Port: 53

    • Protocol: udp

    Após preencher os parâmetros, leia atentamente as observações, selecione I acknowledge and agree e clique em Start Diagnosis.

  5. Na página Diagnosis Results, visualize os resultados do diagnóstico de rede. Na seção Access Overview, o caminho completo de acesso deste diagnóstico é exibido.

    Neste exemplo, o resultado do diagnóstico afirma: "No obvious issues found. Please further analyze based on diagnostic items or submit a ticket." O caminho de acesso é kube-system/coredns Pod → nó ECS (cn-hangzhou.172.xxx.xxx.240) → servidor DNS de destino (100.100.2.136).

Linha de comando

Procedimento

  1. Faça login no nó do cluster onde o pod do CoreDNS reside.

  2. Execute ps aux | grep coredns para consultar o ID do processo do CoreDNS.

  3. Execute nsenter -t <pid> -n -- <command> para entrar no namespace de rede do contêiner onde o CoreDNS reside. Substitua pid pelo ID do processo coredns obtido na etapa anterior.

  4. Teste a conectividade de rede.

    1. Execute telnet <apiserver_clusterip> 6443 para testar a conectividade com o Kubernetes API Server.

      onde apiserver_clusterip é o endereço IP do Serviço Kubernetes no namespace padrão.

    2. Execute dig <domain> @<upstream_dns_server_ip> para testar a conectividade do pod do CoreDNS com o servidor DNS upstream.

      Substitua domain pelo nome de domínio de teste e upstream_dns_server_ip pelo endereço do servidor DNS upstream. Os endereços padrão são 100.100.2.136 e 100.100.2.138.

Problemas comuns

Fenômeno

Causa

Solução

O CoreDNS não consegue se conectar ao Kubernetes API Server

Anomalias no API Server, alta carga da máquina ou kube-proxy não funcionando corretamente.

abra um ticket para solução de problemas.

O CoreDNS não consegue se conectar ao servidor DNS upstream

Alta carga da máquina, configuração incorreta do CoreDNS ou problemas de roteamento de linha dedicada.

abra um ticket para solução de problemas.

Verificar a conectividade de rede entre pods de aplicação e CoreDNS

Use o console ou a linha de comando para verificar a conectividade de rede entre pods de aplicação e CoreDNS.

Console

  1. Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.

  2. Na página Clusters, clique no nome do cluster de destino. No painel de navegação à esquerda, escolha Inspections and Diagnostics > Diagnostics.

  3. Na página Diagnostics, clique na aba Network diagnostics e, em seguida, clique em Diagnose no canto superior esquerdo.

  4. Na página Network diagnostics, clique em Diagnose. No painel Access Information, preencha os parâmetros de diagnóstico da seguinte forma:

    • Source address: Insira o IP do pod de aplicação.

    • Destination address: Insira o PodIP ou ClusterIP da instância do CoreDNS.

    • Port: 53

    • Protocol: udp

    Após preencher os parâmetros, leia atentamente as observações, selecione I acknowledge and agree e clique em Start Diagnosis.

  5. Na página Diagnosis Results, visualize os resultados do diagnóstico de rede. Na seção Access Overview, o caminho completo de acesso deste diagnóstico é exibido.

    O resultado do diagnóstico mostra um registro FATAL. O nó é cn-hangzhou.172.xx.0.240, e o conteúdo do diagnóstico é invalid route: invalid route "0.0.0.0/0 dev eth1 via 172.16.3.253 scope universe type unicast" for packet (src=172.16.1.45, dst=172.16.1.3). A rota esperada é dev: calibb5fee8d7c0 scope: link type: unicast. A topologia de rede na seção Access Overview mostra o caminho de acesso do pod nginx através do nó com falha cn-hangzhou.172.xx.0.240 (destacado em vermelho) até dois pods coredns, indicando claramente a localização da falha FATAL.

Linha de comando

Procedimento

  1. Escolha um dos seguintes métodos para entrar na rede do contêiner do pod cliente.

    • Método 1: Use o comando kubectl exec.

    • Método 2:

      1. Faça login no nó do cluster onde o pod de aplicação reside.

      2. Execute ps aux | grep <application-process-name> para consultar o ID do processo do contêiner de aplicação.

      3. Execute nsenter -t <pid> -n bash para entrar no namespace de rede do contêiner onde o pod de aplicação reside.

        Substitua pid pelo ID do processo obtido na etapa anterior.

    • Método 3: Se ocorrerem reinicializações frequentes, siga estas etapas.

      1. Faça login no nó do cluster onde o pod de aplicação reside.

      2. Execute docker ps -a | grep <application-container-name> para encontrar o contêiner sandbox começando com k8s_POD_ e anote seu ID de contêiner.

      3. Execute docker inspect <sandbox-container-ID> | grep netns para encontrar o caminho do namespace de rede do contêiner, como /var/run/docker/netns/xxxx.

      4. Execute nsenter -n<netns-path> bash para entrar no namespace de rede do contêiner.

        Substitua netns-path pelo caminho obtido na etapa anterior.

        Nota

        Não adicione espaço entre -n e <netns-path>.

  2. Teste a conectividade de rede.

    1. Execute dig <domain> @<kube_dns_svc_ip> para testar a conectividade das consultas de resolução de DNS do pod de aplicação para o serviço kube-dns do CoreDNS.

      Substitua <domain> pelo nome de domínio de teste e <kube_dns_svc_ip> pelo IP do serviço kube-dns no namespace kube-system.

    2. Execute ping <coredns_pod_ip> para testar a conectividade do pod de aplicação com a réplica do pod do CoreDNS.

      Substitua <coredns_pod_ip> pelo IP do pod do CoreDNS no namespace kube-system.

    3. Execute dig <domain> @<coredns_pod_ip> para testar a conectividade das consultas de resolução de DNS do pod de aplicação para a réplica do pod do CoreDNS.

      Substitua <domain> pelo nome de domínio de teste e <coredns_pod_ip> pelo IP do pod do CoreDNS no namespace kube-system.

Problemas comuns

Fenômeno

Causa

Solução

O pod de aplicação não consegue resolver através do serviço kube-dns do CoreDNS

Alta carga da máquina, kube-proxy não funcionando corretamente ou grupo de segurança não permitindo a porta UDP 53.

Verifique se o grupo de segurança permite a porta UDP 53. Se permitir, abra um ticket para solução de problemas.

O pod de aplicação não consegue se conectar à réplica do pod do CoreDNS

Problemas na rede do contêiner ou grupo de segurança não permitindo ICMP.

Verifique se o grupo de segurança permite ICMP. Se permitir, abra um ticket para solução de problemas.

O pod de aplicação não consegue resolver através da réplica do pod do CoreDNS

Alta carga da máquina ou grupo de segurança não permitindo a porta UDP 53.

Verifique se o grupo de segurança permite a porta UDP 53. Se permitir, abra um ticket para solução de problemas.

Capturar pacotes

Quando não for possível localizar o problema, capture pacotes para auxiliar no diagnóstico.

  1. Faça login no nó onde o pod de aplicação problemático ou o pod do CoreDNS reside.

  2. Na instância ECS (fora do contêiner), execute o seguinte comando para capturar todo o tráfego da porta 53 em um arquivo.

    tcpdump -i any port 53 -C 20 -W 200 -w /tmp/client_dns.pcap
  3. Localize as informações exatas do pacote correspondentes ao horário do erro nos logs da aplicação.

    Nota
    • Em condições normais, a captura de pacotes não impacta as operações comerciais e aumenta apenas ligeiramente a carga da CPU e as gravações em disco.

    • O comando acima rotaciona os pacotes capturados, gravando até 200 arquivos de 20 MB cada (arquivos .pcap).

Problemas de resolução de nomes de domínio externos ao cluster

Descrição do problema

Os pods de aplicação conseguem resolver nomes de domínio internos ao cluster normalmente, mas não conseguem resolver certos nomes de domínio externos ao cluster.

Causa raiz

O servidor upstream retorna respostas anormais de resolução de DNS.

Solução

Verifique os logs de solicitação de consulta DNS do CoreDNS.

Logs de solicitação comuns

O CoreDNS registra uma linha após receber uma solicitação e responder ao cliente. Exemplo:

# The status code RCODE NOERROR indicates successful resolution.
[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 retorno RCODE comuns

Para obter detalhes sobre as definições de RCODE, consulte a especificação.

Código de Retorno (RCODE)

Significado

Causa

NXDOMAIN

O nome de domínio não existe

Dentro dos contêineres, sufixos de pesquisa são anexados aos nomes de domínio solicitados. Se o nome de domínio resultante não existir, este RCODE aparecerá. Se o nome de domínio solicitado nos logs existir, há uma anomalia.

SERVFAIL

Anomalia no servidor upstream

Ocorre frequentemente quando o servidor DNS upstream está inacessível.

REFUSED

Resposta negada

Ocorre frequentemente quando o servidor DNS upstream configurado no CoreDNS ou o arquivo /etc/resolv.conf do nó do cluster não consegue lidar com o nome de domínio. Verifique o arquivo de configuração do CoreDNS.

Quando os logs de solicitação de consulta DNS do CoreDNS mostram NXDOMAIN, SERVFAIL ou REFUSED para nomes de domínio externos ao cluster, o servidor DNS upstream está retornando respostas anormais.

Por padrão, os servidores DNS upstream para o CoreDNS no cluster são os servidores DNS fornecidos pela VPC (100.100.2.136 e 100.100.2.138). Você pode abrir um ticket para o Elastic Compute Service (ECS). Inclua as seguintes informações ao abrir o ticket.

Campo

Descrição

Exemplo

Nome de domínio afetado

Nome de domínio externo ao cluster com RCODE anormal nos logs do CoreDNS

www.aliyun.com

Analise o código de retorno (RCODE).

Erro específico de resolução (NXDOMAIN, SERVFAIL, REFUSED)

NXDOMAIN

Horário afetado

Carimbo de data/hora do log (precisão de segundos)

2022-12-22 20:00:03

Instâncias ECS afetadas

IDs das instâncias ECS onde as réplicas do pod do CoreDNS residem

i-xxxxx i-yyyyy

Novos nomes de domínio Headless não podem ser resolvidos

Descrição do problema

Pods de aplicação conectados ao CoreDNS não conseguem resolver novos nomes de domínio Headless.

Causa raiz

Versões do CoreDNS anteriores à 1.7.0 saem anormalmente durante oscilações do API Server, fazendo com que os nomes de domínio Headless parem de ser atualizados.

Solução

Atualize o CoreDNS para a versão 1.7.0 ou posterior. Para obter detalhes, consulte [[Atualização de componente] Aviso de atualização do CoreDNS](t1964489.dita#task_1964489).

Falhas na resolução de nomes de domínio Headless

Descrição do problema

Pods de aplicação conectados ao CoreDNS não conseguem resolver nomes de domínio Headless. Ao usar dig para resolução, a resposta mostra a flag tc, indicando que a mensagem de resposta é muito grande.

Causa raiz

Quando um nome de domínio Headless corresponde a muitas entradas de IP, as solicitações DNS enviadas via UDP podem exceder o limite de tamanho da mensagem DNS UDP, causando falhas na resolução.

Solução

Para evitar falhas na resolução, ajuste sua aplicação cliente para usar TCP nas consultas DNS. O CoreDNS suporta consultas TCP e UDP. Modifique sua aplicação com base nos seguintes cenários:

  • Resolvers baseados em glibc

    Se sua aplicação cliente usa um resolver baseado em glibc, adicione a configuração use-vc no dnsConfig para usar TCP nas consultas DNS. Essas configurações mapeiam para a configuração correspondente de options no /etc/resolv.conf. Para obter detalhes sobre a configuração de options, consulte as páginas man do Linux.

    dnsConfig:
      options:
      - name: use-vc
  • Lógica de aplicação Golang

    Se você desenvolve com Golang, consulte o código a seguir para usar TCP nas consultas DNS.

    package main
    import (
    	"fmt"
    	"net"
    	"context"
    )
    func main() {
    	resolver := &net.Resolver{
    		PreferGo: true,
    		Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
    			return net.Dial("tcp", address)
    		},
    	}
    	addrs, err := resolver.LookupHost(context.TODO(), "example.com")
    	if err != nil {
    		fmt.Println("Error:", err)
    		return
    	}
    	fmt.Println("Addresses:", addrs)
    }

Nomes de domínio Headless não podem ser resolvidos após atualização do CoreDNS

Descrição do problema

Alguns componentes open-source mais antigos (como versões antigas do etcd, Nacos e Kafka) não funcionam corretamente em ambientes com Kubernetes 1.20 ou posterior e CoreDNS 1.8.4 ou posterior.

Causa raiz

O CoreDNS 1.8.4 e posteriores priorizam a API EndpointSlice para sincronizar informações de IP de serviços do Kubernetes. Alguns componentes open-source usam a anotação service.alpha.kubernetes.io/tolerate-unready-endpoints da API Endpoint para publicar serviços que não estão prontos durante a inicialização. Esta anotação foi descontinuada na API EndpointSlice e substituída por publishNotReadyAddresses. Após atualizar o CoreDNS, serviços não prontos não são publicados, fazendo com que esses componentes falhem na descoberta de serviços.

Solução

Verifique se o YAML ou Helm Chart do componente open-source contém a anotação service.alpha.kubernetes.io/tolerate-unready-endpoints. Se contiver, o componente pode não funcionar corretamente. Atualize o componente open-source ou consulte sua comunidade.

Nomes de domínio de pods StatefulSets não podem ser resolvidos

Descrição do problema

Headless services não conseguem resolver nomes de domínio de pods.

Causa raiz

No YAML do pod StatefulSets, o ServiceName deve corresponder ao nome do serviço exposto. Caso contrário, os nomes de domínio dos pods (por exemplo, pod.headless-svc.ns.svc.cluster.local) não poderão ser acessados, e apenas os nomes de domínio dos serviços (por exemplo, headless-svc.ns.svc.cluster.local) estarão acessíveis.

Solução

Modifique o ServiceName no YAML do pod StatefulSets.

Configuração incorreta de grupo de segurança ou ACL de vSwitch

Descrição do problema

Pods de aplicação conectados ao CoreDNS em alguns ou todos os nós falham consistentemente na resolução de nomes de domínio.

Causa raiz

A modificação do grupo de segurança (ou ACL de vSwitch) usado por ECS ou contêineres bloqueia a comunicação na porta UDP 53.

Solução

Restaure as configurações do grupo de segurança e da ACL de vSwitch para permitir a comunicação UDP na porta 53.

Problemas de conectividade de rede do contêiner

Descrição do problema

Pods de aplicação conectados ao CoreDNS em alguns ou todos os nós falham consistentemente na resolução de nomes de domínio.

Causa raiz

Problemas na rede do contêiner ou outras causas levam à indisponibilidade persistente da porta UDP 53.

Solução

Use diagnósticos de rede para diagnosticar a conectividade de rede entre pods de aplicação e endereços do CoreDNS.

Alta carga do pod do CoreDNS

Descrição do problema

  • Pods de aplicação conectados ao CoreDNS em alguns ou todos os nós apresentam aumento na latência de resolução e falhas probabilísticas ou consistentes.

  • A verificação do status do pod do CoreDNS mostra que o uso de CPU e memória das réplicas está se aproximando de seus limites de recursos.

Causa raiz

Réplicas insuficientes do CoreDNS ou alto volume de solicitações de negócios causam alta carga no CoreDNS.

Solução

  • Considere usar o NodeLocal DNSCache para melhorar o desempenho da resolução de DNS e reduzir a carga do CoreDNS. Para obter detalhes, consulte Usar NodeLocal DNSCache.

  • Dimensione horizontalmente as réplicas do CoreDNS adequadamente para que o uso máximo de CPU por pod permaneça abaixo da capacidade ociosa de CPU do nó.

Desequilíbrio de carga do pod do CoreDNS

Descrição do problema

  • Alguns pods de aplicação conectados ao CoreDNS apresentam aumento na latência de resolução e falhas probabilísticas ou consistentes.

  • A verificação do status do pod do CoreDNS mostra uso desigual de CPU entre as réplicas.

  • Existem menos de duas réplicas do CoreDNS, ou várias réplicas residem no mesmo nó.

Causa raiz

Agendamento desigual de réplicas do CoreDNS ou configurações de afinidade de Serviço causam desequilíbrio de carga nos pods do CoreDNS.

Solução

  • Dimensione horizontalmente e distribua as réplicas do CoreDNS em diferentes nós.

  • Quando ocorrer desequilíbrio de carga, desative a propriedade de afinidade do serviço kube-dns. Para obter detalhes, consulte Atualização automática não gerenciada do CoreDNS.

Status anormal do pod do CoreDNS

Descrição do problema

  • Alguns pods de aplicação conectados ao CoreDNS apresentam aumento na latência de resolução e falhas probabilísticas ou consistentes.

  • O status da réplica do CoreDNS não é Running, ou a contagem de RESTARTS continua aumentando.

  • Os logs operacionais do CoreDNS mostram anomalias.

Causa raiz

Modelos YAML ou arquivos de configuração do CoreDNS fazem com que o CoreDNS seja executado anormalmente.

Solução

Verifique o status do pod do CoreDNS e os logs operacionais.

Logs anormais comuns e soluções

Mensagem de log

Causa

Solução

/etc/coredns/Corefile:4 - Error during parsing: Unknown directive 'ready'

O arquivo de configuração é incompatível com o CoreDNS. O erro Unknown directive indica que a versão atual do CoreDNS não suporta o plug-in ready.

Remova o plug-in ready do item de configuração do CoreDNS no namespace kube-system. Aplique a mesma abordagem para resolver erros semelhantes.

pkg/mod/k8s.io/client-go@v0.18.3/tools/cache/reflector.go:125: Failed to watch *v1.Pod: Get "https://192.168.0.1:443/api/v1/": dial tcp 192.168.0.1:443: connect: connection refused

O servidor API estava indisponível durante o período mostrado no log.

Se o carimbo de data/hora do log não corresponder ao horário do evento anômalo, descarte esta causa. Caso contrário, verifique a conectividade de rede do pod do CoreDNS. Para obter mais informações, consulte Verificar a conectividade de rede do pod do CoreDNS.

[ERROR] plugin/errors: 2 www.aliyun.com. A: read udp 172.20.6.53:58814->100.100.2.136:53: i/o timeout

O CoreDNS não conseguiu se conectar ao servidor DNS upstream durante o período mostrado no log.

Falhas de resolução causadas por carga no lado do cliente

Descrição do problema

Falhas de resolução ocorrem esporadicamente durante horários de pico de negócios ou subitamente. O monitoramento do ECS mostra taxas anormais de retransmissão da NIC e carga da CPU.

Causa raiz

A instância ECS que hospeda o pod de aplicação conectado ao CoreDNS atinge 100% de carga, causando perda de pacotes UDP.

Solução

Recomendamos usar o NodeLocal DNSCache para melhorar o desempenho da resolução de DNS e reduzir a carga do CoreDNS. Para obter detalhes, consulte Usar NodeLocal DNSCache.

Tabela Conntrack cheia

Descrição do problema

  • Pods de aplicação conectados ao CoreDNS em alguns ou todos os nós apresentam falhas massivas na resolução de domínios durante horários de pico de negócios, que desaparecem após o pico.

  • Ao executar dmesg -H e rolar até o período do problema, são mostradas entradas de log contendo conntrack full.

Causa raiz

A tabela Conntrack do Linux tem entradas limitadas, impedindo novas solicitações UDP ou TCP.

Solução

Aumente o limite da tabela Conntrack. Para obter detalhes, consulte Como aumentar o limite de rastreamento de conexões (Conntrack) do Linux?.

Problemas no plug-in AutoPath

Descrição do problema

  • A resolução de nomes de domínio externos ao cluster falha probabilisticamente ou resolve para endereços IP incorretos. A resolução de nomes de domínio internos ao cluster funciona normalmente.

  • Durante a criação de contêineres em alta frequência, nomes de domínio de serviços internos ao cluster resolvem para endereços IP incorretos.

Causa raiz

Um defeito de processamento do CoreDNS causa mau funcionamento do AutoPath.

Solução

Siga estas etapas para desativar o plug-in AutoPath.

  1. Execute kubectl -n kube-system edit configmap coredns para abrir o arquivo de configuração do CoreDNS.

  2. Exclua a linha autopath @kubernetes e salve as alterações.

  3. Verifique o status do pod do CoreDNS e os logs operacionais. O aparecimento de reload nos logs indica modificação bem-sucedida.

Problemas de resolução simultânea de registros A e AAAA

Descrição do problema

  • Pods de aplicação conectados ao CoreDNS falham probabilisticamente na resolução de nomes de domínio.

  • A captura de pacotes ou os logs de solicitação de consulta DNS do CoreDNS mostram solicitações A e AAAA ocorrendo simultaneamente com portas de origem idênticas.

Causa raiz

  • Solicitações DNS A e AAAA simultâneas acionam um defeito no módulo Conntrack do kernel Linux, causando perda de pacotes UDP.

  • Versões mais antigas da libc (<2,33) em arquiteturas ARM têm problemas de concorrência ao iniciar solicitações A e AAAA simultâneas, causando tempos limite de solicitação e retransmissões. Consulte GLIBC#26600.

Solução

  • Considere usar o NodeLocal DNSCache para melhorar o desempenho da resolução de DNS e reduzir a carga do CoreDNS. Para obter detalhes, consulte Usar NodeLocal DNSCache.

  • Para imagens base que usam libc (como CentOS e Ubuntu), atualize a libc para a versão 2,33 ou posterior para evitar problemas de resolução simultânea de A e AAAA.

  • Para imagens base como CentOS e Ubuntu, otimize usando parâmetros como options timeout:2 attempts:3 rotate single-request-reopen.

  • Se sua imagem de contêiner for baseada em Alpine, considere mudar para uma imagem base diferente. Para obter mais informações, consulte Alpine.

  • Aplicações PHP frequentemente enfrentam problemas de resolução de conexão curta. Se usar PHP Curl, utilize o parâmetro CURL_IPRESOLVE_V4 para enviar solicitações de resolução apenas IPv4. Para obter mais informações, consulte a Referência de funções.

Falhas na resolução de DNS após anomalias no pod do CoreDNS no modo IPVS

Descrição do problema

No modo IPVS, os pods do CoreDNS podem apresentar falhas probabilísticas na resolução de DNS sob condições específicas, geralmente durando cerca de cinco minutos.

Causa raiz

Sob condições específicas, as solicitações de resolução de DNS são enviadas para pods do CoreDNS em estado anormal, causando falhas na resolução.

Por exemplo, quando um nó que hospeda um pod do CoreDNS é removido, os recursos do nó são liberados imediatamente e o pod para de funcionar. No entanto, o cluster leva cerca de um minuto para detectar a atualização de status do nó e marcá-lo como NotReady. Antes da atualização do status do nó, o pod ainda é considerado saudável e aceita solicitações de resolução de DNS, causando falhas probabilísticas na resolução de DNS no cluster.

Depois que o nó é marcado como NotReady, seus pods do CoreDNS são imediatamente removidos do backend do Serviço CoreDNS e param de aceitar novas conexões. No entanto, se o modo de balanceamento de carga kube-proxy do cluster for IPVS, a política de persistência de sessão UDP do IPVS faz com que algumas solicitações DNS continuem sendo enviadas para o pod até que o período de tempo limite UDP termine, levando a falhas prolongadas na resolução de DNS no cluster.

Nota

Este problema pode ocorrer em nós CentOS e Alibaba Cloud Linux 2 com versões de kernel anteriores a 4.19.91-25.1.al7.x86_64.

Solução

NodeLocal DNSCache não está funcionando

Descrição do problema

Nenhum tráfego entra no NodeLocal DNSCache e todas as solicitações ainda vão para o CoreDNS.

Causa raiz

  • A injeção de DNSConfig não está configurada, então os pods de aplicação ainda usam o IP do serviço kube-dns do CoreDNS como endereço do servidor DNS.

  • Os pods de aplicação usam Alpine como imagem base. O Alpine solicita concorrentemente todos os nameservers, incluindo o cache local e o CoreDNS.

Solução

  • Configure a injeção automática de DNSConfig. Para obter detalhes, consulte Usar NodeLocal DNSCache.

  • Se sua imagem de contêiner for baseada em Alpine, considere mudar para uma imagem base diferente. Para obter mais informações, consulte Alpine.

Problemas de resolução de nomes de domínio do PrivateZone

Descrição do problema

Para aplicações conectadas ao NodeLocal DNSCache, os pods não conseguem resolver nomes de domínio registrados no PrivateZone, não conseguem resolver nomes de domínio de API de produtos Alibaba Cloud contendo vpc-proxy, ou os resolvem incorretamente.

Causa raiz

O PrivateZone não suporta protocolo TCP e requer acesso UDP.

Solução

Configure prefer_udp no CoreDNS. Para obter detalhes, consulte Configuração não gerenciada do CoreDNS.

Problemas de resolução de DNS causados por picos repentinos de tráfego

Descrição do problema

Após um aumento repentino de tráfego, algumas solicitações DNS falham na resolução.

Causa raiz

Picos repentinos de tráfego causam um aumento nas solicitações DNS, levando a tráfego excessivo de entrada e saída para o CoreDNS. Isso pode limitar o uso da CPU do CoreDNS e causar anomalias na resolução. Verifique este cenário da seguinte forma:

  1. Verifique no nó onde os pods do CoreDNS residem.

    Execute o seguinte comando no nó.

    nsenter -t <coredns-pid> -n -- netstat -su

    Verifique se há mensagens de send ou recv buffer error. Se presentes, existe perda de pacotes UDP. Exemplo:

    Udp:
        1090421 packets received
        850 packets to unknown port received
        15662 packet receive errors
        5607627 packets sent
        15662 receive buffer errors
        0 send buffer errors
  2. Verifique as métricas de limitação de CPU do pod do CoreDNS.

    Se a CPU do CoreDNS estiver limitada, podem ocorrer falhas intermitentes na resolução de DNS ou aumento na latência de resposta DNS. Combine isso com o primeiro ponto para confirmar a perda de pacotes.

    Nota

    Devido aos ciclos de amostragem e cálculo do uso da CPU (15 segundos), a limitação da CPU pode ocorrer mesmo quando o uso da CPU parece baixo. Para obter mais informações, consulte Ativar otimização de desempenho CPU Burst.

    Na página de monitoramento do Prometheus, escolha Application Monitoring > Cluster Pod Monitoring. Filtre pelo Namespace kube-system, selecione o pod correspondente do CoreDNS e verifique o gráfico de linhas CPU Throttled Percent na seção CPU Resource. Se esta métrica estiver próxima de 0%, não ocorre limitação de CPU.

  3. Independentemente de usar o ARMS Prometheus ou uma solução Prometheus autogerenciada, sempre colete métricas do CoreDNS e use o painel do CoreDNS para verificar anomalias e identificar o período do problema. Faça login no console do Container Service for Kubernetes, depois acesse Operations > Prometheus Monitoring e selecione a aba Network Monitoring para encontrar o CoreDNS.

    image.png

Solução