O DNS é um service crítico em clusters Kubernetes. Em determinadas condições, como configurações inadequadas de cliente ou em clusters de grande escala, o DNS pode apresentar timeouts e falhas de resolução. Este tópico apresenta as melhores práticas de DNS para clusters Kubernetes para ajudar você a evitar esses problemas.
Observações
Este tópico não se aplica à edição gerenciada do CoreDNS nem a clusters ACK com o Auto Mode ativado. A edição gerenciada do CoreDNS dimensiona automaticamente com base na carga, sem necessidade de ajustes manuais.
Neste tópico
As melhores práticas de DNS abrangem otimizações tanto no lado do cliente quanto no servidor:
-
No lado do cliente, otimize as solicitações de resolução de nomes de domínio para reduzir a latência e minimizar falhas de resolução utilizando imagens de contêiner adequadas, sistemas operacionais de nó apropriados e o NodeLocal DNSCache.
-
No servidor CoreDNS, identifique exceções de DNS e localize rapidamente suas causas raiz monitorando o status operacional do CoreDNS. Também é possível ajustar a implantação do CoreDNS para melhorar a alta disponibilidade e o throughput de consultas por segundo (QPS).
Para mais informações sobre o CoreDNS, consulte a documentação oficial do CoreDNS.
Otimize as solicitações de resolução de nomes de domínio
A resolução de DNS é uma das operações de rede mais frequentes em um cluster Kubernetes. Muitas dessas solicitações podem ser otimizadas ou evitadas para reduzir a latência e a carga na infraestrutura de DNS. Otimize as solicitações de resolução de nomes de domínio das seguintes formas:
(Recomendado) Utilize pools de conexões: quando uma aplicação conteinerizada solicita frequentemente outro service, use um pool de conexões para armazenar em cache as conexões ativas com os services upstream na memória. Isso elimina a sobrecarga de resolução de DNS e handshakes TCP para cada solicitação.
Adote um modo assíncrono ou de long-polling para obter os endereços IP de um nome de domínio.
-
Utilize cache de DNS:
(Recomendado) Se não for possível modifique sua aplicação para usar um pool de conexões, considere armazenar em cache os resultados da resolução de DNS no lado da aplicação. Para mais informações, consulte Use NodeLocal DNSCache.
Caso não seja viável utilizar o NodeLocal DNSCache, utilize o cache nativo Name Service Cache Daemon (NSCD) nos seus contêineres. Para mais informações, consulte Usar NSCD em clusters Kubernetes.
Otimize o arquivo resolv.conf: devido aos mecanismos dos parâmetros ndots e search no arquivo resolv.conf, a forma como você escreve os nomes de domínio em um contêiner determina a eficiência da resolução. Para mais detalhes sobre os mecanismos dos parâmetros ndots e search, consulte DNS Policy Configuration and Domain Name Resolution.
-
Otimize as configurações de nomes de domínio: quando uma aplicação em um contêiner acessa um nome de domínio, configure-o da seguinte forma para minimizar tentativas de resolução e reduzir a latência.
Para acessar um Service no mesmo namespace a partir de um pod, utilize
<service-name>, ondeservice-nameé o nome do Service.Para acessar um Service em um namespace diferente a partir de um pod, utilize
<service-name>.<namespace-name>, ondenamespace-nameé o namespace onde o Service reside.-
Quando um pod acessa um nome de domínio externo, utilize um Fully Qualified Domain Name (FQDN), que termina com um ponto final (.), para evitar múltiplas buscas de DNS inválidas causadas pela anexação de domínios da lista
search. Por exemplo, para acessar www.aliyun.com, utilize seu FQDN www.aliyun.com..-
Em clusters que executam Kubernetes 1.22 ou posterior, configure o domínio de busca como um único ponto (.) para obter um efeito similar (consulte Issue 125883):
dnsPolicy: None dnsConfig: nameservers: ["192.168.0.10"] ## Replace with the actual ClusterIP of your CoreDNS Service. searches: - . - default.svc.cluster.local ## Note: Replace default with the actual namespace. - svc.cluster.local - cluster.localApós aplicar a configuração anterior, o arquivo /etc/resolv.conf no pod fica configurado da seguinte maneira:
search . default.svc.cluster.local svc.cluster.local cluster.local nameserver 192.168.0.10O primeiro domínio de busca é ".", o que faz o resolvedor tratar o domínio de destino como um FQDN. O resolvedor tenta primeiro resolver o nome de domínio exatamente como foi fornecido, ignorando expansões desnecessárias de domínios de busca.
ImportanteDefina
dnsPolicycomoNonepara que a configuração anterior tenha efeito.
-
Entenda as configurações de DNS em contêineres
Diferentes resolvedores de DNS podem apresentar comportamentos distintos devido a variações de implementação. É possível encontrar casos em que
dig <domain>tem sucesso, masping <domain>falha.-
Evite usar Alpine como imagem base. Prefira outras imagens base, como Debian ou CentOS. A biblioteca
musl libcintegrada às imagens de contêiner Alpine possui diversas diferenças de implementação em relação à glibc padrão, o que pode levar a problemas que incluem, mas não se limitam a:Fallback para TCP: o Alpine 3.18 e versões anteriores não suportam fallback para TCP quando um flag de truncamento (TC) é retornado.
Domínios de busca: o Alpine 3.3 e versões anteriores não suportam o parâmetro search, o que compromete a descoberta de services.
Conflitos de otimização: o Alpine consulta simultaneamente todos os servidores DNS configurados em /etc/resolv.conf, o que pode contornar e invalidar as otimizações do NodeLocal DNSCache.
Race conditions no conntrack: solicitações concorrentes de registros A e AAAA que utilizam o mesmo socket podem acionar conflitos de porta de source no conntrack em kernels Linux mais antigos, resultando em perda de pacotes.
Para mais informações sobre esses problemas, consulte musl libc.
Se você utiliza uma aplicação Go, esteja ciente das diferenças entre os resolvedores de DNS nas implementações CGO e Pure GO.
Evite timeouts de DNS causados por defeitos no IPVS
Quando um cluster utiliza IPVS como modo de balanceamento de carga do kube-proxy, podem ocorrer timeouts probabilísticos na resolução de DNS durante o scale down ou reinício do CoreDNS. Esse problema é causado por um defeito no kernel Linux da comunidade. Para mais informações, consulte IPVS.
Utilize um dos métodos a seguir para mitigar o impacto do defeito no IPVS:
Utilize o NodeLocal DNSCache. Para mais informações, consulte Use NodeLocal DNSCache.
Modifique o período de timeout para persistência de sessão UDP do IPVS no kube-proxy. Para mais informações, consulte How do I modify the timeout period for IPVS UDP session persistence in kube-proxy?.
Utilize o NodeLocal DNSCache
O CoreDNS pode apresentar os seguintes problemas:
Em casos raros, consultas concorrentes de registros A e AAAA podem causar perda de pacotes, levando a falhas na resolução de DNS.
Uma tabela
conntrackcheia em um nó pode causar perda de pacotes, resultando em falhas na resolução de DNS.
Para melhorar a estabilidade e o desempenho do DNS no seu cluster, instale o componente NodeLocal DNSCache. Ele aprimora o desempenho do DNS do cluster executando um cache de DNS em cada nó. Para mais informações sobre o NodeLocal DNSCache e como implantá-lo em um cluster ACK, consulte Use the NodeLocal DNSCache component.
Após instalar o NodeLocal DNSCache, injete a configuração de cache de DNS nos seus pods. Execute o comando a seguir para adicionar um rótulo a um namespace específico. Novos pods criados nesse namespace terão a configuração de cache de DNS injetada automaticamente. Para mais informações sobre outros métodos de injeção, consulte a documentação referenciada no parágrafo anterior.
kubectl label namespace default node-local-dns-injection=enabled
Utilize uma versão adequada do CoreDNS
O CoreDNS oferece boa compatibilidade retroativa com versões do Kubernetes. Mantenha o CoreDNS atualizado para a versão estável mais recente. A página Add-ons no console ACK permite instale, atualize e configure o CoreDNS. Verifique o status do componente CoreDNS na página Add-ons. Se houver uma atualização disponível, agende-a para horários de baixa demanda.
Para mais informações sobre como atualize o CoreDNS, consulte Automatic upgrade for unmanaged CoreDNS.
Para consultar as notas de versão do CoreDNS, visualize CoreDNS.
Versões do CoreDNS anteriores à v1.7.0 apresentam diversos riscos potenciais, incluindo:
Quando a conectividade entre o CoreDNS e o servidor de API estiver anormal, por exemplo, devido a reinícios do servidor de API, migrações ou instabilidade de rede, o CoreDNS pode reiniciar por falhar ao gravar logs de erro. Para mais informações, consulte Set klog's logtostderr flag.
O CoreDNS consome memória extra durante a inicialização. O limite padrão de memória pode desencadear problemas de out-of-memory (OOM) em clusters de grande escala. Em casos graves, isso pode fazer com que os pods do CoreDNS entrem em um loop de reinício e não consigam se recuperar. Para mais informações, consulte CoreDNS uses a lot memory during initialization phase.
O CoreDNS possui vários problemas que podem afetar a resolução de nomes de domínio de Services headless e de nomes de domínio externos ao cluster. Para mais informações, consulte plugin/kubernetes: handle tombstones in default processor e Data is not synced when CoreDNS reconnects to kubernetes api server after protracted disconnection.
Se um nó do cluster apresentar anomalias, a política de tolerância padrão em algumas versões anteriores do CoreDNS pode fazer com que os pods do CoreDNS sejam agendados nesse nó anômalo. Esses pods não podem ser evacuados automaticamente, causando falhas na resolução de DNS.
A versão mínima recomendada do CoreDNS varia conforme a versão do Kubernetes do cluster.
|
Versão do cluster |
Versão mínima do CoreDNS |
|
Anterior a 1.14.8 |
v1.6.2 (Fim da vida útil) |
|
1.14.8 ou posterior, mas anterior a 1.20.4 |
v1.7.0.0-f59c03d-aliyun |
|
1.20.4 ou posterior, mas anterior a 1.21.0 |
v1.8.4.1-3a376cc-aliyun |
|
1.21.0 e posterior |
v1.11.3.2-f57ea7ed6-aliyun |
Monitore o status operacional do CoreDNS
Métricas
O CoreDNS expõe métricas de integridade, incluindo resultados de resolução, por meio de uma interface Prometheus padrão. Isso ajuda a detectar anomalias no servidor CoreDNS e até mesmo em servidores DNS upstream.
O Managed Service for Prometheus fornece painéis de monitoramento de métricas e regras de alerta integrados para o CoreDNS. Ative o Prometheus e seus recursos de painel no console ACK. Para mais informações, consulte Monitor the CoreDNS component.
Se você utiliza uma instância Prometheus autogerenciada para monitorar seu cluster Kubernetes, observe as métricas relevantes no Prometheus e configure alertas para indicadores-chave. Para mais informações, consulte a documentação oficial do CoreDNS para Prometheus.
Logs
Em caso de anomalia de DNS, os logs do CoreDNS ajudam a diagnosticar rapidamente a causa raiz. Recomendamos ativar o log de resolução de nomes de domínio do CoreDNS e coletar seus logs com o Log Service. Para mais informações, consulte Analyze and monitor CoreDNS logs.
Entrega de eventos do Kubernetes
No CoreDNS v1.9.3.6-32932850-aliyun e posteriores, ative o plugin k8s_event para entregar logs críticos do CoreDNS como eventos do Kubernetes no Event Center. Para mais informações sobre o plugin k8s_event, consulte k8s_event.
Esse recurso vem ativado por padrão em novas implantações do CoreDNS. Se você atualize de uma versão anterior para o CoreDNS v1.9.3.6-32932850-aliyun ou posterior, modifique manualmente o arquivo de configuração para ativá-lo.
-
Execute o comando a seguir para abrir o arquivo de configuração do CoreDNS.
kubectl -n kube-system edit configmap/coredns -
Adicione os plugins kubeapi e k8s_event.
apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } // Start of addition (ignore other differences). kubeapi k8s_event { level info error warning // Deliver critical logs with info, error, and warning statuses. } // End of addition. kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified fallthrough in-addr.arpa ip6.arpa } // ... (remaining content omitted) } Verifique o status operacional e os logs dos pods do CoreDNS. Se os logs contiverem a palavra
reload, a modificação foi bem-sucedida.
Garanta a alta disponibilidade do CoreDNS
O CoreDNS é o DNS autoritativo do cluster. Uma falha no CoreDNS pode causar falhas no acesso a Services dentro do cluster, podendo levar a uma indisponibilidade generalizada dos services. Adote as medidas a seguir para garantir a alta disponibilidade do CoreDNS:
Avalie a pressão sobre o componente CoreDNS
Realize um teste de estresse de DNS no cluster para avaliar a pressão sobre o componente. Diversas ferramentas open source, incluindo DNSPerf, podem auxiliar nessa tarefa. Caso não seja possível avaliar com precisão a pressão de DNS no seu cluster, siga estas recomendações.
Sempre defina o número de pods do CoreDNS como pelo menos 2, com um limite de recursos de no mínimo 1 núcleo e 1 GiB para um único pod.
O QPS de resolução de nomes de domínio do CoreDNS tem correlação positiva com seu consumo de CPU. Com o NodeLocal DNSCache ativado, cada núcleo de CPU suporta mais de 10.000 QPS. A demanda de QPS para solicitações de nomes de domínio varia significativamente entre diferentes tipos de services. Observe o pico de uso de CPU de cada pod do CoreDNS. Se um pod utilizar mais de um núcleo de CPU durante os horários de pico, recomendamos aumentar o número de réplicas do CoreDNS. Caso não consiga determinar o pico de uso de CPU, utilize conservadoramente uma proporção de 1:8 entre pods e nós do cluster. Ou seja, para cada 8 nós adicionados ao cluster, adicione um pod do CoreDNS.
Ajuste a quantidade de pods do CoreDNS
A quantidade de pods do CoreDNS determina diretamente os recursos de computação disponíveis para ele. Ajuste o número de pods do CoreDNS com base na sua avaliação.
Devido à falta de mecanismo de retransmissão em pacotes UDP, se houver risco de perda de pacotes nos nós do cluster por causa do defeito de UDP do IPVS, reduzir ou reiniciar pods do CoreDNS pode causar timeouts ou exceções de resolução de DNS em todo o cluster por até cinco minutos. Para soluções de exceções de resolução causadas pelo defeito no IPVS, consulte Troubleshoot DNS resolution issues.
-
Ajuste automaticamente com base na política recomendada
Implante o seguinte
dns-autoscaler. Ele ajusta automaticamente o número de pods do CoreDNS em tempo real com base na política recomendada (proporção de 1:8 entre pods e nós do cluster). O número de pods é calculado pela fórmula: replicas = max(ceil(cores × 1/coresPerReplica), ceil(nodes × 1/nodesPerReplica)), e é limitado pelos parâmetrosmaxemin. -
Ajuste manualmente
Execute o comando a seguir para ajustar manualmente o número de pods do CoreDNS.
kubectl scale --replicas={target} deployment/coredns -n kube-system # Replace {target} with the desired number of pods. -
Não utilize dimensionamento automático de workload
Embora recursos de dimensionamento automático de workload, como Horizontal Pod Autoscaler (HPA) e CronHPA, também possam ajustar automaticamente o número de pods, eles realizam operações de dimensionamento frequentes. Devido às exceções de resolução que ocorrem durante a redução de pods, não utilize o dimensionamento automático de workload para controlar o número de pods do CoreDNS.
Ajuste as especificações dos pods do CoreDNS
Outra forma de ajustar os recursos do CoreDNS é modifique as especificações dos pods. Em um ACK managed Pro cluster, o limite padrão de memória para pods do CoreDNS é 2Gi, sem limite de CPU. Defina o limite de CPU como 4096m, com um mínimo de 1024m. Ajuste a configuração dos pods do CoreDNS no console.
Agende pods do CoreDNS
Uma configuração de agendamento incorreta pode impedir a implantação dos pods do CoreDNS, levando à falha do service. Antes de realizar esta operação, certifique-se de estar familiarizado com scheduling.
Recomendamos implantar os pods do CoreDNS em diferentes zonas de disponibilidade e nós do cluster para evitar falhas de nó único ou de zona única. Versões do componente CoreDNS anteriores à v1.8.4.3 possuem uma política padrão de anti-afinidade suave no nível de nó, o que pode fazer com que alguns ou todos os pods sejam implantados no mesmo nó se os recursos forem insuficientes. Se isso ocorrer, exclua os pods para acionar o reagendamento ou atualize o componente para a versão mais recente. As versões do componente CoreDNS anteriores à v1.8 não recebem mais manutenção e devem ser atualizadas o mais breve possível.
Os nós do cluster onde o CoreDNS é executado não devem ter sua CPU ou memória totalmente utilizadas, pois isso afeta o QPS e a latência de resposta da resolução de nomes de domínio. Quando as condições dos nós permitirem, considere utilizar parâmetros personalizados para agendar o CoreDNS em nós dedicados, garantindo um service de resolução de nomes de domínio estável.
Otimize as configurações do CoreDNS
O ACK fornece uma configuração padrão para o CoreDNS. Revise e otimize esses parâmetros para garantir que o CoreDNS forneça services de DNS adequados para seus contêineres de negócios. A configuração do CoreDNS é altamente flexível. Para mais informações, consulte Configure DNS policies and resolve domain names e a documentação oficial do CoreDNS.
As configurações padrão do CoreDNS implantadas com versões anteriores de clusters Kubernetes podem apresentar alguns riscos. Verifique e otimize-as conforme descrito abaixo:
Também é possível utilizar os recursos de inspeção agendada e diagnóstico de falhas do Container Intelligence Service para verificar os arquivos de configuração do CoreDNS. Se o resultado da inspeção do Container Intelligence Service indicar uma exceção na configuração do ConfigMap do CoreDNS, verifique cada um dos itens anteriores.
O CoreDNS pode consumir memória extra ao atualize sua configuração. Após modifique um ConfigMap do CoreDNS, observe o status dos pods. Se um pod ficar sem memória, aumente prontamente o limite de memória do contêiner no Deployment do CoreDNS. Ajuste o limite de memória para 2 GB.
Desative a afinidade de sessão para o kube-dns
A afinidade de sessão pode levar a desequilíbrios significativos de carga entre as réplicas do CoreDNS. Desative-a seguindo estas etapas:
Console
Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
-
No namespace kube-system, clique em Edit YAML à direita do Service kube-dns.
Se o campo sessionAffinity estiver definido como
None, nenhuma ação adicional é necessária.Se o campo sessionAffinity estiver definido como
ClientIP, prossiga com as etapas a seguir.
-
Exclua os campos sessionAffinity e sessionAffinityConfig e todas as suas subchaves, e clique em Update.
# Delete all of the following content. sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 Clique novamente em Edit YAML à direita do Service kube-dns e verifique se o campo sessionAffinity está definido como
None. Um valorNoneindica que o Service Kube-DNS foi modificado com sucesso.
CLI
-
Execute o comando a seguir para visualize as informações de configuração do Service kube-dns.
kubectl -n kube-system get svc kube-dns -o yamlSe o campo sessionAffinity estiver definido como
None, nenhuma ação adicional é necessária.Se o campo sessionAffinity estiver definido como
ClientIP, prossiga com as etapas a seguir.
-
Execute o comando a seguir para abrir e edite o Service chamado kube-dns.
kubectl -n kube-system edit service kube-dns -
Exclua as configurações relacionadas a sessionAffinity (sessionAffinity, sessionAffinityConfig e todas as suas subchaves), salve e saia.
# Delete all of the following content. sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 -
Após concluir a modificação, execute o comando a seguir novamente para verificar se o campo sessionAffinity está definido como
None. Se o valor forNone, a alteração no Service Kube-DNS foi bem-sucedida.kubectl -n kube-system get svc kube-dns -o yaml Execute o comando
kubectl -n kube-system edit configmap corednspara abrir o arquivo de configuração do CoreDNS.Exclua a linha
autopath @kubernetese salve o arquivo.Verifique o status operacional e os logs dos pods do CoreDNS. Se os logs contiverem a palavra
reload, a modificação foi bem-sucedida.Quando um processo do CoreDNS está prestes a terminar, ele entra no modo Lameduck.
No modo
lameduck, o CoreDNS para de aceitar novas solicitações, mas continua processando as existentes até que todas sejam concluídas ou o período de timeout dolameduckseja excedido.Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
No namespace kube-system, clique em Edit YAML à direita do ConfigMap coredns.
No arquivo de configuração do CoreDNS, certifique-se de que o plugin health esteja ativado e defina o timeout do lameduck como
15s. Em seguida, clique em OK.Execute o comando a seguir para abrir o arquivo de configuração do CoreDNS.
No Corefile, certifique-se de que o plugin
healthesteja ativado e defina o parâmetro lameduck como15s.Salve e saia após modifique o arquivo de configuração do CoreDNS.
Se o CoreDNS estiver funcionando normalmente, a alteração foi bem-sucedida. Se algum pod do CoreDNS apresentar anomalia, identifique a causa visualizando seus eventos e logs.
-
Execute o comando a seguir para abrir o arquivo de configuração do CoreDNS.
kubectl -n kube-system edit configmap/coredns -
Verifique se o arquivo contém a linha
ready. Caso contrário, adicione a linhaready, pressione Esc, insira:wq!e pressione Enter para salve o arquivo de configuração modificado e sair do modo de edição.apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } ready # If this line does not exist, add it. Make sure that the indentation is consistent with Kubernetes. kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 prefer_udp } cache 30 loop log reload loadbalance } Verifique o status operacional e os logs dos pods do CoreDNS. Se os logs contiverem a palavra
reload, a modificação foi bem-sucedida.Se o CoreDNS consome 4 núcleos no pico e há 8 núcleos disponíveis, defina
NUM_SOCKETScomo 2.Se o CoreDNS consome 8 núcleos no pico e há 64 núcleos disponíveis, defina
NUM_SOCKETScomo 8.
Desative o plugin autopath
Algumas versões anteriores do CoreDNS tinham o plugin autopath ativado, o que pode causar erros de resolução em alguns casos extremos. Verifique se ele está ativado e edite o arquivo de configuração para desativá-lo. Para mais informações, consulte Autopath.
Após desativar o plugin autopath, o QPS no lado do cliente pode aumentar em até três vezes, e o tempo necessário para resolver um único nome de domínio também pode aumentar em até três vezes. Monitore a carga do CoreDNS e o impacto nos negócios.
Configure o desligamento gracioso
O lameduck é um mecanismo no CoreDNS que permite o desligamento gracioso. Ele garante que, quando o CoreDNS precisa parar ou reiniciar, as solicitações em andamento sejam concluídas sem serem interrompidas abruptamente. O lameduck funciona da seguinte forma:
Console
.:53 {
errors
# The health plugin may have different settings in different CoreDNS versions.
# Scenario 1: The health plugin is not enabled by default.
# Scenario 2: The health plugin is enabled, but no lameduck duration is set.
# health
# Scenario 3: The health plugin is enabled, and the lameduck duration is set to 5s.
# health {
# lameduck 5s
# }
# For all three scenarios, modify the configuration as follows to set the lameduck parameter to 15s.
health {
lameduck 15s
}
# Other plugins do not need to be modified and are omitted here.
}
Se os pods do CoreDNS estiverem funcionando normalmente, a alteração foi bem-sucedida. Se algum pod do CoreDNS apresentar anomalia, identifique a causa visualizando seus eventos e logs.
CLI
kubectl -n kube-system edit configmap/coredns
.:53 {
errors
# The health plugin may have different settings in different CoreDNS versions.
# Scenario 1: The health plugin is not enabled by default.
# Scenario 2: The health plugin is enabled, but no lameduck duration is set.
# health
# Scenario 3: The health plugin is enabled, and the lameduck duration is set to 5s.
# health {
# lameduck 5s
# }
# For all three scenarios, modify the configuration as follows to set the lameduck parameter to 15s.
health {
lameduck 15s
}
# Other plugins do not need to be modified and are omitted here.
}
Configure o protocolo padrão para o plugin forward
O NodeLocal DNSCache utiliza TCP para se comunicar com o CoreDNS. O CoreDNS então se comunica com os servidores DNS upstream usando o mesmo protocolo da solicitação recebida. Portanto, por padrão, as solicitações de contêineres de negócios para resolver nomes de domínio fora do cluster passam pelo NodeLocal DNSCache e pelo CoreDNS, chegando finalmente aos servidores DNS da vpc (por padrão, 100.100.2.136 e 100.100.2.138 em instâncias ECS) via TCP.
Os servidores DNS da vpc têm suporte limitado para TCP. Se você utiliza o NodeLocal DNSCache, modifique a configuração do CoreDNS para priorizar UDP na comunicação com servidores DNS upstream, evitando exceções de resolução. Recomendamos modifique o arquivo de configuração do CoreDNS, que é o ConfigMap chamado coredns no namespace kube-system. Para mais informações, consulte Manage ConfigMaps. No plugin forward, especifique o protocolo para solicitações upstream como prefer_udp. Após essa modificação, o CoreDNS priorizará o UDP para se comunicar com servidores upstream. A modificação é a seguinte:
# Before modification
forward . /etc/resolv.conf
# After modification
forward . /etc/resolv.conf {
prefer_udp
}
Configure o plugin ready
Versões do CoreDNS posteriores à 1.5.0 devem ter o plugin ready configurado para habilitar sondas de prontidão.
Melhore o desempenho com o plugin multisocket
O CoreDNS v1.12.1 introduziu o plugin multisocket. Ativar esse plugin permite que o CoreDNS utilize múltiplos sockets para escutar na mesma porta, melhorando o desempenho do CoreDNS em cenários de alto uso de CPU. Para uma descrição detalhada do plugin, consulte a documentação da comunidade.
Ative o multisocket utilizando o ConfigMap coredns:
.:53 {
...
prometheus :9153
multisocket [NUM_SOCKETS]
forward . /etc/resolv.conf
...
}
O parâmetro NUM_SOCKETS especifica o número de sockets que escutam na mesma porta.
Configuração recomendada: alinhe o NUM_SOCKETS com a utilização estimada de CPU, os limites de recursos de CPU e os recursos disponíveis no cluster. Por exemplo:
Para determinar a configuração ideal, recomendamos testar o QPS e a carga com diferentes definições.
Se você não especifique NUM_SOCKETS, o valor padrão será GOMAXPROCS, que é igual ao limite de CPU do pod do CoreDNS. Se o limite de CPU do pod não estiver definido, o valor será igual ao número de núcleos de CPU no nó onde o pod está sendo executado.