Como configurar o NodeLocal DNSCache

Nesta página, explicamos como configurar o NodeLocal DNSCache em um cluster do Google Kubernetes Engine (GKE). O NodeLocal DNSCache melhora a latência da busca DNS, aumenta a consistência dos horários da busca DNS e reduz o número de consultas DNS a kube-dns executando um cache DNS em cada nó do cluster.

Para uma visão geral de como a descoberta de serviço e o DNS gerenciado funcionam no GKE, consulte Descoberta de serviços e DNS.

Visão geral

O NodeLocal DNSCache é um complemento opcional do GKE que pode ser executado além do kube-dns. O DNSCache NodeLocal é implementado como um DaemonSet que executa um cache DNS em cada nó do cluster. Quando um pod faz uma solicitação DNS, a solicitação vai para o cache DNS em execução no mesmo nó que o pod. Se o cache não conseguir resolver a solicitação DNS, ele encaminhará a solicitação para:

  • o Cloud DNS para consultas de nomes de host externos. Essas consultas são encaminhadas para o Cloud DNS pelo servidor MetaData local em execução no mesmo nó que o pod de origem;
  • kube-dns para todas as outras consultas DNS. O serviço kube-dns-upstream é usado por pods node-local-dns para se comunicar com pods kube-dns.

Um diagrama do caminho de uma solicitação DNS, conforme descrito no parágrafo anterior

Os pods não precisam ser modificados para usar o NodeLocal DNSCache. O NodeLocal DNSCache consome recursos de computação em cada nó do cluster.

Benefícios do NodeLocal DNSCache

  • Tempo médio da busca DNS reduzido
  • As conexões de pods para o cache local não criam entradas de tabela conntrack. Isso evita conexões descartadas e rejeitadas devido ao esgotamento da tabela de conexões e condições de corrida.

Detalhes

  • O NodeLocal DNSCache requer a versão 1.15 ou mais recente do GKE.
  • As conexões entre o cache DNS local e o kube-dns usam TCP em vez de UDP para melhorar a confiabilidade.
  • As consultas DNS para URLs externos (URLs que não se referem a recursos de cluster) são encaminhadas diretamente para o servidor de metadados local do Cloud DNS, ignorando kube-dns.
  • Os caches de DNS local automaticamente selecionam os domínios de stub e os servidores de nomes upstream especificados no kube-dns ConfigMap.

  • Os registros DNS são armazenados em cache para:

    • O TTL do registro ou 30 segundos se o TTL tiver mais de 30 segundos.
    • Cinco segundos se a resposta DNS for NXDOMAIN.
  • Os pods DNSCache do NodeLocal monitoram as portas 53, 9253 e 8080 dos nós. Executar qualquer outro pod hostNetwork ou configurar hostPorts com as portas acima leva à falha do NodeLocal DNSCache e resulta em erros no DNS.

Como ativar o NodeLocal DNSCache

É possível ativar o NodeLocal DNSCache em um cluster atual ou ao criar um novo cluster. Ativar o NodeLocal DNSCache em um cluster atual é um processo disruptivo. Todos os nós do cluster que executam o GKE 1.15 e posteriores são recriados. Os nós são recriados de acordo com o processo de upgrade de nós do GKE.

gcloud

Como ativar o NodeLocal DNSCache em um novo cluster

Para ativar o NodeLocal DNSCache em um novo cluster, use a sinalização --addons NodeLocalDNS:

gcloud container clusters create cluster-name \
  --zone compute-zone \
  --cluster-version cluster-version \
  --addons NodeLocalDNS

Substitua:

  • cluster-name: o nome do novo cluster;
  • compute-zone: a zona do cluster;
  • cluster-version: a versão do cluster (1.15 ou mais recente).

Como ativar o NodeLocal DNSCache em um cluster atual

Para ativar o NodeLocal DNSCache em um cluster atual, use a sinalização --update-addons=NodeLocalDNS=ENABLED:

gcloud container clusters update cluster-name \
  --update-addons=NodeLocalDNS=ENABLED

Console

Use o Console do Google Cloud para ativar o NodeLocal DNSCache ao criar um novo cluster.

  1. Acesse a página "Criar um cluster do Kubernetes" no Console do Cloud.

    Acessar a página de clusters do Kubernetes

  2. Em Nome, insira cluster-name.

  3. Em Zona, selecione us-central1-a.

  4. Em Número de nós, insira 1.

  5. No lado esquerdo da página, clique em Rede.

  6. Marque a caixa de seleção Ativar NodeLocal DNSCache em Opções avançadas de rede.

  7. Clique em Criar.

Como verificar se o NodeLocal DNSCache está ativado

Para verificar se o NodeLocal DNSCache está em execução, liste os pods node-local-dns. Haverá um pod node-local-dns em execução em cada nó que executa a versão 1.15 ou mais recente do GKE.

kubectl get pods -n kube-system -o wide | grep node-local-dns

Como desativar o NodeLocal DNSCache

O NodeLocal DNSCache pode ser desativado usando gcloud:

gcloud container clusters update cluster-name \
  --update-addons=NodeLocalDNS=DISABLED

Como solucionar problemas do NodeLocal DNSCache

Consulte Como depurar a resolução de DNS para informações gerais sobre como diagnosticar problemas de DNS do Kubernetes.

Como validar a configuração do pod

Para verificar se um pod está usando o NodeLocal DNSCache, verifique /etc/resolv.conf no pod para ver se o pod está configurado para usar o servidor de nomes correto:

kubectl exec -it pod-name -- cat /etc/resolv.conf | grep nameserver

O IP do servidor de nomes precisa corresponder à saída do endereço IP por:

kubectl get svc -n kube-system kube-dns -o jsonpath="{.spec.clusterIP}"

Se o endereço IP do servidor de nomes configurado em /etc/resolv.conf não corresponder, será necessário modificar a configuração para usar o endereço IP do servidor de nomes correto.

Política de rede com NodeLocal DNSCache

Ao usar NetworkPolicy com o complemento NodeLocalDNS, são necessárias regras adicionais para permitir que os pods node-local-dns enviem e recebam consultas DNS. Use uma regra ipBlock em NetworkPolicy para permitir a comunicação entre pods node-local-dns e kube-dns:

spec:
  egress:
  - ports:
    - port: 53
      protocol: TCP
    - port: 53
      protocol: UDP
    to:
    - ipBlock:
        cidr: kube-dns-cluster-ip/32
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

Substitua kube-dns-cluster-ip pelo endereço IP do serviço kube-dns obtido usando:

kubectl get svc -n kube-system kube-dns -o jsonpath="{.spec.clusterIP}"

Neste exemplo, usamos uma regra ipBlock porque os pods node-local-dns são executados no modo hostNetwork:True. Uma regra matchLabels não corresponderia a esses pods.

A seguir