Uso do DNSCache do NodeLocal para melhorar o desempenho do DNS
Desafios
Quando o número de solicitações de DNS em um cluster aumenta, a carga de CoreDNS aumenta e os seguintes problemas podem ocorrer:
- Aumento do atraso: o CoreDNS precisa processar mais solicitações, o que pode retardar a consulta do DNS e afetar o desempenho do serviço.
- Aumento do uso de recursos: para garantir o desempenho do DNS, o CoreDNS exige especificações mais altas.
Solução
Para minimizar o impacto do atraso do DNS, implemente o DNSCache do NodeLocal no cluster para melhorar a estabilidade e o desempenho da rede. O DNSCache do NodeLocal executa um proxy de cache do DNS em nós de cluster. Todos os pods com configurações de DNS usam o proxy de cache do DNS em execução em nós em vez do serviço CoreDNS para resolução de nome de domínio. Isso reduz a carga do CoreDNS e melhora o desempenho do DNS do cluster.
Depois que o DNSCache do NodeLocal é habilitado, uma consulta de DNS percorre o caminho, conforme mostrado abaixo.

Restrições
node-local-dns-injection é um rótulo de sistema usado pelo DNSCache do NodeLocal. Use esse rótulo somente nos cenários descritos em Impedir a injeção automática de DNSConfig.
Instalar o complemento
O CCE fornece um complemento NodeLocal DNSCache para você instalar o DNSCache do NodeLocal.

- O complemento node-local-dns suporta apenas clusters de v1.19 e posteriores.
- O DNSCache do NodeLocal serve como um proxy de cache transparente para o CoreDNS e não fornece plug-ins como hosts ou reescrita. Se você quiser ativar esses plug-ins, modifique as configurações do CoreDNS.
- Os pods não podem ser injetados automaticamente em namespaces do sistema, como o kube-system.
- (Opcional) Modifique a configuração do CoreDNS para que o CoreDNS use preferencialmente o UDP para se comunicar com o servidor DNS upstream.
O DNSCache do NodeLocal usa o TCP para se comunicar com o CoreDNS. O CoreDNS se comunica com o servidor DNS upstream com base no protocolo usado pela fonte da solicitação. No entanto, o servidor de nuvem não suporta TCP. Para usar o DNSCache do NodeLocal, modifique a configuração do CoreDNS para que o UDP seja usado preferencialmente para se comunicar com o servidor DNS upstream, evitando exceções de resolução.
Realize as operações a seguir. No complemento avançado, especifique prefer_udp como o protocolo usado pelas solicitações. Após a modificação, o CoreDNS usa preferencialmente o UDP para se comunicar com o sistema upstream.
- Efetue logon no console do CCE e clique no nome do cluster para acessar o console do cluster.
- No painel de navegação, escolha Add-ons. Na página exibida, clique em Edit em CoreDNS.
- Edite a configuração avançada em Parameters e o seguinte conteúdo para o campo plugins:
{ "configBlock": "prefer_udp", "name": "forward", "parameters": ". /etc/resolv.conf" }
- Efetue logon no console do CCE e acesse o console do cluster. Escolha Add-ons no painel de navegação, localize node-local-dns à direita e clique em Install.
- Na página Install Add-on, selecione as especificações do complemento e defina os parâmetros relacionados.
- enable_dnsconfig_admission: depois que essa função for ativada, um controlador de injeção dinâmica de DNSConfig será criado. O controlador intercepta solicitações de criação de pods no namespace rotulado com node-localdns-injection=enabled com base em Admission Webhook e configura automaticamente Pod dnsConfig que usa o cache do DNS. Se essa função estiver desabilitada ou se o pod pertencer a um namespace que não seja de destino, será necessário configurar manualmente DNSConfig para o pod.
- Target Namespace: esse parâmetro está disponível depois que DNSConfig Automatic Injection está ativada. Somente NodeLocal DNSCache da v1.3.0 ou posterior suporta essa função.
- All Enabled: o CCE adiciona o rótulo node-local-dns-injection=enabled a todos os namespaces criados, excluindo os internos (como o kube-system), identifica solicitações de criação de namespace e adiciona automaticamente o rótulo aos namespaces recém-criados.
- Manual configuration: você deve adicionar manualmente o rótulo node-local-dns-injection=enabled aos namespaces que exigem a injeção de DNSConfig. Para mais detalhes, consulte Gerenciar rótulos de namespace.
- Clique em Install.
Usar o DNSCache do NodeLocal
Por padrão, as solicitações de aplicativos são enviadas por meio do proxy de CoreDNS. Para usar node-local-dns como proxy de cache de DNS, use um dos seguintes métodos:
- Injeção automática: configure automaticamente o campo dnsConfig do pod ao criar o pod. (Pods não podem ser injetados automaticamente em namespaces do sistema, como kube-system.)
- Configuração manual: configure manualmente o campo dnsConfig do pod.
Injeção automática
Devem ser satisfeitas as seguintes condições:
- A injeção automática de DNSConfig foi ativada durante a instalação do complemento.
- O rótulo node-local-dns-injection=enabled foi adicionado ao namespace. Por exemplo, execute o seguinte comando para adicionar o rótulo ao namespace default:
kubectl label namespace default node-local-dns-injection=enabled
- O novo pod não é executado em namespaces do sistema, como namespace de kube-system e kube-public.
- O rótulo node-local-dns-injection=disabled para desabilitar a injeção de DNS não é adicionado ao novo pod.
- O novo pod usa a rede de host e DNSPolicy é ClusterFirstWithHostNet. Como alternativa, o pod não usa a rede host e DNSPolicy é ClusterFirst.
Depois que a injeção automática é ativada, as seguintes configurações do dnsConfig são adicionadas automaticamente ao pod criado. Além do endereço DNSCache do NodeLocal 169.254.20.10, o endereço de CoreDNS 10.247.3.10 é adicionado a nameservers, garantindo alta disponibilidade do servidor DNS do serviço.
... dnsConfig: nameservers: - 169.254.20.10 - 10.247.3.10 searches: - default.svc.cluster.local - svc.cluster.local - cluster.local options: - name: timeout value: '' - name: ndots value: '5' - name: single-request-reopen ...
Configuração manual
Adicione manualmente as configurações de dnsConfig ao pod.
Crie um pod e adicione o endereço IP do DNSCache do NodeLocal 169.254.20.10 à configuração de nameservers de DNSConfig.

Os endereços de DNSCache do NodeLocal de diferentes tipos de cluster são os seguintes:
- Cluster do CCE: 169.254.20.10
- Cluster do CCE Turbo: 169.254.1.1
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - image: nginx:alpine name: container-0 dnsConfig: nameservers: - 169.254.20.10 - 10.247.3.10 searches: - default.svc.cluster.local - svc.cluster.local - cluster.local options: - name: ndots value: '2' imagePullSecrets: - name: default-secret
Impedir a injeção automática de DNSConfig
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
node-local-dns-injection: disabled # Prevent automatic DNSConfig injection.
spec:
containers:
- name: container-1
image: nginx:latest
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: default-secret