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.
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.
Acesse a página "Criar um cluster do Kubernetes" no Console do Cloud.
Em Nome, insira cluster-name.
Em Zona, selecione us-central1-a.
Em Número de nós, insira
1
.No lado esquerdo da página, clique em Rede.
Marque a caixa de seleção Ativar NodeLocal DNSCache em Opções avançadas de rede.
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
- Leia uma visão geral de como o GKE fornece DNS gerenciado.
- Leia DNS para serviços e pods para uma visão geral de como o DNS é usado nos clusters do Kubernetes.