Como usar o kube-dns


Nesta página, descrevemos como o Google Kubernetes Engine (GKE) implementa a descoberta de serviços usando o kube-dns, o provedor de DNS padrão para clusters do GKE.

Para clusters do Autopilot, não é possível modificar a configuração padrão do kube-dns.

Arquitetura

Ao criar um cluster, o GKE implanta automaticamente os pods do kube-dns no namespace kube-system. Os pods acessam a implantação do kube-dns por um serviço correspondente que agrupa os pods do kube-dns e atribui a eles um único endereço IP (ClusterIP). Por padrão, todos os pods em um cluster usam esse serviço para resolver consultas DNS. O diagrama a seguir mostra a relação entre os pods e o serviço kube-dns.

Relação entre os pods do kube-dns e o serviço kube-dns

O kube-dns é escalonado para atender às demandas de DNS do cluster. Esse escalonamento é controlado pelo kube-dns-autoscaler, um pod implantado por padrão em todos os clusters do GKE. O kube-dns-autoscaler ajusta o número de réplicas na implantação do kube-dns com base no número de nós e núcleos no cluster.

O kube-dns é compatível com até 1.000 endpoints por serviço headless.

Como o DNS do pod é configurado

O agente kubelet em execução em cada nó configura o etc/resolv.conf do pod para usar o ClusterIP do serviço kube-dns. A configuração de exemplo a seguir mostra que o endereço IP do serviço kube-dns é 10.0.0.10. Esse endereço IP é diferente em outros clusters.

nameserver 10.0.0.10
search default.svc.cluster.local svc.cluster.local cluster.local c.my-project-id.internal google.internal
options ndots:5

O kube-dns é o servidor de nomes autoritativo do domínio do cluster (cluster.local). Ele resolve nomes externos recursivamente. Os nomes curtos que não são totalmente qualificados, como myservice, são preenchidos primeiro com caminhos de pesquisa local.

Como adicionar resolvedores personalizados para domínios de stub

É possível modificar o ConfigMap do kube-dns para definir domínios de stub como parte da infraestrutura de DNS nos clusters.

Os domínios de stub permitem configurar resolvedores personalizados por domínio para que o kube-dns encaminhe solicitações DNS para servidores DNS upstream específicos ao resolver esses domínios.

O manifesto do ConfigMap para kube-dns de exemplo a seguir inclui uma configuração stubDomains que define resolvedores personalizados para o domínio example.com.

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    addonmanager.kubernetes.io/mode: EnsureExists
  name: kube-dns
  namespace: kube-system
data:
  stubDomains: |
    {
      "example.com": [
        "8.8.8.8",
        "8.8.4.4",
        "1.1.1.1",
        "1.0.0.1"
      ]
    }

Execute o seguinte comando para abrir um editor de texto:

kubectl edit configmap kube-dns -n kube-system

Substitua o conteúdo do arquivo pelo manifesto e saia do editor de texto para aplicar o manifesto ao cluster.

Servidores de nomes upstream

Se você modificar o ConfigMap para kube-dns para incluir upstreamNameservers, o kube-dns encaminhará todas as solicitações de DNS, exceto *.cluster.local para esses servidores. Isso inclui metadata.internal e *.google.internal, que não podem ser resolvidos pelo servidor upstream.

Se você ativar a federação de identidade da carga de trabalho do GKE ou qualquer carga de trabalho que dependa da resolução metadata.internal, para manter a resolução de nome *.internal, adicione um stubDomain ao ConfigMap.

data:
  stubDomains: |
    {
      "internal": [
        "169.254.169.254"
      ]
    }
  upstreamNameservers: |
    ["8.8.8.8"]

Problemas conhecidos

Limite do domínio de pesquisa

Há um limite de seis domínios de pesquisa DNS no domínio /etc/resolv.conf. Se você definir mais de seis domínios de pesquisa, o seguinte aviso será exibido quando você executar o comando kubectl describe pod:

Search Line limits were exceeded, some search paths have been omitted, the applied search line is: default.svc.cluster.local svc.cluster.local cluster.local c.<project ID>.internal google.internal

Esse aviso é registrado no Cloud Logging na seção de registros do contêiner.

Para resolver esse problema, remova os caminhos de pesquisa extras da configuração.

Considere o limite de upstreamNameservers

O Kubernetes impõe um limite de até três valores de upstreamNameservers. Se você definir mais de três upstreamNameservers, verá o erro a seguir no Cloud Logging nos registros de implantação do kube-dns:

Invalid configuration: upstreamNameserver cannot have more than three entries (value was &TypeMeta{Kind:,APIVersion:,}), ignoring update

Quando isso acontece, o kube-dns se comporta como se não houvesse upstreamNameservers configurados. Para resolver esse problema, remova os upstreamNameservers extras da configuração.

Limitações de desempenho com o kube-dns

Se você estiver enfrentando alta latência com buscas DNS ou falhas de resolução de DNS com o provedor kube-dns padrão, isso pode ser causado por:

  • Como executar buscas DNS frequentes na sua carga de trabalho
  • Implantar uma densidade de pods maior por nó.
  • Executar o kube-dns em VMs Spot ou preemptivas, o que pode levar a exclusões inesperadas de nós e problemas subsequentes de resolução de DNS.

Para melhorar os tempos de busca DNS, escolha uma das seguintes opções:

  • Evite executar componentes críticos do sistema, como kube-dns no VMs Spot ou preemptivas. O uso de VMs Spot ou preemptivas para DNS pode causar falhas e interromper o cluster.
  • Como prática recomendada, crie pelo menos um pool de nós composto por VMs padrão (não Spot ou preemptivas) para hospedar componentes críticos do sistema, como o kube-dns. Para garantir que cargas de trabalho críticas sejam programadas apenas no pool de nós confiável que as impede de serem executadas em VMs preemptivas ou do Spot, use taints e tolerâncias para VMs Spot.
  • Ative NodeLocal DNSCache.
  • Escalone verticalmente o kube-dns.
  • Verifique se o aplicativo usa funções baseadas em dns.resolve* em vez de em dns.lookup, porque o segundo é síncrono. As funções dns.resolve* sempre executam uma consulta DNS assíncrona na rede.

Registros DNS de serviço

O kube-dns só cria registros DNS para serviços que têm endpoints{track-name="k8sLink" track-type="concept"}.

TTL grande de servidores upstream de DNS

Se o kube-dns receber uma resposta DNS de um resolvedor de DNS upstream com um TTL grande ou "infinito", ele mantém esse valor de TTL para a entrada DNS no cache. A entrada nunca expira e pode criar uma discrepância entre a entrada e o endereço IP real resolvido para o nome do TTL.

O GKE resolve esse problema nas seguintes versões do plano de controle definindo um valor de TTL máximo como 30 segundos para qualquer resposta DNS que tenha um TTL maior que 30 segundos:

  • 1.21.14-gke.9100
  • 1.22.15-gke.2100
  • 1.23.13-gke.500
  • 1.24.7-gke.500
  • 1.25.2-gke.500 ou mais recente.

Esse comportamento é semelhante ao NodeLocal DNSCache.

A seguir