Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Use the NodeLocal DNSCache add-on

Última atualização: Jun 27, 2026

Instale um cache de DNS por nó para reduzir a latência de consultas e melhorar a confiabilidade da resolução.

Como funciona

O NodeLocal DNSCache é composto por dois componentes:

  • DaemonSet (agente de cache de DNS): Executa em cada nó, cria uma interface de rede virtual e escuta consultas DNS no endereço 169.254.20.10 por padrão. Para alterar o endereço IP de escuta, envie um ticket.

  • Deployment (controlador de admissão): Intercepta solicitações de criação de pods via webhooks de admissão e injeta automaticamente o dnsConfig nas especificações do pod.

Baseado no CoreDNS, o agente de cache fornece apenas proxy e armazenamento em cache. Não ative plugins como hosts ou rewrite nele — configure-os diretamente no CoreDNS.

Fluxo de consulta DNS após a implantação do NodeLocal DNSCache:

image

Fluxo de consulta DNS após a implantação do NodeLocal DNSCache:

image

Descrição

Por padrão, um pod com o dnsConfig local injetado utiliza o NodeLocal DNSCache, que escuta consultas DNS enviadas para 169.254.20.10 no nó.

Caso o NodeLocal DNSCache não encontre uma entrada em cache, ele usa o Service kube-dns para encaminhar a consulta ao CoreDNS.

O CoreDNS utiliza o servidor DNS implantado na Virtual Private Cloud (VPC) para resolver nomes de domínio externos ao cluster.

Se o pod com dnsConfig local injetado falhar ao se conectar ao NodeLocal DNSCache, ele usará o Service kube-dns para se conectar ao CoreDNS e realizar a resolução DNS.

Um pod sem o dnsConfig local injetado usa o Service kube-dns para se conectar ao CoreDNS e efetuar a resolução DNS.

Consulte Políticas de resolução DNS e políticas de cache.

Pré-requisitos

Antes de começar, verifique se você possui:

Limitações

  • Não há suporte para nós Windows. Para pods em nós virtuais (incluindo pods ECI e ACS), o cache de DNS é suportado apenas quando o NodeLocal DNSCache v1.6.0 ou posterior e o ack-virtual-node v2.14.0 ou posterior estiverem instalados.

  • Se o cluster utilizar Terway, é necessária a versão 1.0.10.301 ou posterior. Caso o Terway opere no modo ENI inclusivo com IPvlan, configure o Terway para o modo IPvlan antes de prosseguir.

  • O NodeLocal DNSCache atua exclusivamente como um proxy de cache transparente para o CoreDNS e não oferece extensibilidade de plugins. Configure plugins como hosts ou rewrite diretamente no CoreDNS.

  • Configure o protocolo padrão do plugin forward do CoreDNS antes de usar o NodeLocal DNSCache, caso contrário o CoreDNS poderá falhar na resolução de domínios externos. Consulte Melhores práticas para serviços de DNS.

  • Não instalado em nós mestre por padrão. Se houver pods executando em nós mestre com taints, adicione tolerâncias correspondentes ao DaemonSet node-local-dns no namespace kube-system.

Instale o NodeLocal DNSCache

  1. Faça login no console ACK. No painel de navegação à esquerda, clique em console ACKClusters.

  2. Localize seu cluster e escolha More > Operations > Manage Components na coluna Actions.

  3. Na página Add-ons, clique na aba Networking e localize o ACK NodeLocal DNSCache.

  4. Clique em Install. Na caixa de diálogo, clique em OK.

Configure o NodeLocal DNSCache

Para rotear consultas DNS dos pods através do NodeLocal DNSCache, defina nameservers no dnsConfig do pod como 169.254.20.10 e o endereço IP de cluster do kube-dns. Utilize um dos métodos abaixo:

Método

Recomendação

Descrição

Método 1: Injeção automática de dnsConfig

Recomendado

O controlador de admissão injeta o dnsConfig durante a criação do pod — sem necessidade de edição manual de YAML.

Método 2: dnsConfig manual

Neutro

Especifique o dnsConfig diretamente no YAML do pod.

Método 3: Parâmetros de inicialização do kubelet

Não recomendado

Modifica o kubelet e exige reinicialização, o que pode interromper cargas de trabalho.

Método 1: Injeção automática de dnsConfig

O controlador de admissão injeta o dnsConfig nos pods em namespaces rotulados com node-local-dns-injection=enabled. Rotule um namespace para ativar a injeção:

kubectl label namespace default node-local-dns-injection=enabled
Isso ativa a injeção apenas para o namespace default . Substitua default pelo namespace desejado conforme necessário.

Quando ativado, o seguinte dnsConfig é adicionado aos novos pods. O IP de cluster do kube-dns é incluído como fallback para garantir alta disponibilidade.

dnsConfig:
  nameservers:
  - 169.254.20.10
  - 172.21.0.10
  options:
  - name: ndots
    value: "3"
  - name: attempts
    value: "2"
  - name: timeout
    value: "1"
  searches:
  - default.svc.cluster.local
  - svc.cluster.local
  - cluster.local
dnsPolicy: None

Condições de injeção

A injeção ocorre somente quando todas as condições abaixo são atendidas:

  • O pod não está no namespace kube-system ou kube-public.

  • O namespace do pod possui o rótulo node-local-dns-injection=enabled.

  • O namespace do pod não possui rótulos relacionados ao ECI (virtual-node-affinity-injection, eci ou alibabacloud.com/eci).

  • O pod não possui os rótulos eci, alibabacloud.com/eci ou node-local-dns-injection=disabled.

  • O pod utiliza hostNetwork com a política DNS ClusterFirstWithHostNet, ou não utiliza hostNetwork e emprega a política DNS ClusterFirst.

Se a injeção falhar, verifique todas as condições acima.

Desativar a injeção para pods específicos

Para excluir pods específicos da injeção, adicione node-local-dns-injection=disabled aos rótulos do modelo de pod:

metadata:
  labels:
    node-local-dns-injection: "disabled"
Importante

Em versões do NodeLocal DNSCache anteriores à v1.6.0 ou versões do ack-virtual-node anteriores à v2.14.0, pods ECI não conseguem usar o NodeLocal DNSCache, o que causa falhas de DNS. Nesse caso, desative a injeção para o Deployment adicionando node-local-dns-injection=disabled aos rótulos do modelo de pod.

Método 2: dnsConfig manual

Especifique o dnsConfig diretamente na especificação do pod:

apiVersion: v1
kind: Pod
metadata:
  name: alpine
  namespace: default
spec:
  containers:
  - image: alpine
    command:
      - sleep
      - "10000"
    imagePullPolicy: Always
    name: alpine
  dnsPolicy: None
  dnsConfig:
    nameservers: ["169.254.20.10","172.21.0.10"]
    searches:
    - default.svc.cluster.local
    - svc.cluster.local
    - cluster.local
    options:
    - name: ndots
      value: "3"
    - name: attempts
      value: "2"
    - name: timeout
      value: "1"

Campos principais:

Campo

Valor

Observações

dnsPolicy

None

Obrigatório ao especificar um dnsConfig personalizado.

nameservers

169.254.20.10, IP de cluster do kube-dns

A primeira entrada roteia para o NodeLocal DNSCache; a segunda serve como fallback para o kube-dns.

searches

Domínios de busca DNS do cluster

Garante que nomes de serviços internos sejam resolvidos corretamente.

ndots

3

Um valor menor reduz as buscas por domínio antes de tentar o nome exatamente como foi fornecido. O padrão é 5. Consulte resolv.conf.

Método 3: Parâmetros de inicialização do kubelet

No arquivo /etc/systemd/system/kubelet.service.d/10-kubeadm.conf, adicione --cluster-dns com o IP do NodeLocal DNSCache e o IP do kube-dns:

--cluster-dns=169.254.20.10 --cluster-dns=<kube-dns-ip> --cluster-domain=<search-domain>

Parâmetro

Descrição

--cluster-dns

Servidores DNS gravados no dnsConfig do pod. Especifique primeiro 169.254.20.10, seguido pelo IP do kube-dns.

--cluster-domain

Domínio de busca DNS gravado no dnsConfig do pod. Na maioria dos clusters, este valor é cluster.local.

Após editar o arquivo, aplique as alterações:

sudo systemctl daemon-reload
sudo systemctl restart kubelet
Importante

Reiniciar o kubelet pode interromper brevemente as cargas de trabalho em execução.

Exemplo: Configure o NodeLocal DNSCache para um Deployment

Ative o NodeLocal DNSCache para um Deployment no namespace default usando o Método 1 (injeção automática).

  1. Rotule o namespace para ativar a injeção automática de dnsConfig.

    Importante

    O controlador de admissão ignora pods nos namespaces kube-system e kube-public. Não ative a injeção para esses namespaces.

    kubectl label namespace default node-local-dns-injection=enabled
  2. Implante uma aplicação de exemplo. Salve este YAML como ubuntu-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ubuntu
      labels:
        app: ubuntu
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: ubuntu
      template:
        metadata:
          labels:
            app: ubuntu
        spec:
          containers:
          - name: ubuntu
            image: ubuntu
            command: ["sh", "-c"]
            args: ["sleep 100000"]

    Aplique o manifesto:

    kubectl apply -f ubuntu-deployment.yaml

    Saída esperada:

    deployment.apps/ubuntu created
  3. Verifique se o Deployment está em execução.

    kubectl get deployment ubuntu

    Saída esperada:

    NAME     READY   UP-TO-DATE   AVAILABLE   AGE
    ubuntu   2/2     2            2           7s
  4. Valide a injeção do dnsConfig. Obtenha o nome de um pod:

    kubectl get pods

    Saída esperada:

    NAME                      READY   STATUS    RESTARTS   AGE
    ubuntu-766448f68c-m****   1/1     Running   0          4m39s
    ubuntu-766448f68c-w****   1/1     Running   0          4m39s

    Verifique o dnsConfig de um pod:

    kubectl get pod ubuntu-766448f68c-m**** -o=jsonpath='{.spec.dnsConfig}'

    Saída esperada:

    map[nameservers:[169.254.20.10 172.21.0.10] options:[map[name:ndots value:5]] searches:[default.svc.cluster.local svc.cluster.local cluster.local]]

    A presença de 169.254.20.10 em nameservers confirma a injeção do dnsConfig.

Atualize o NodeLocal DNSCache

  1. Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.

  2. Clique no nome do seu cluster. No painel de navegação à esquerda, escolha Operations > Add-ons.

  3. Na página Add-ons, localize o NodeLocal DNSCache e clique em Upgrade. Na caixa de diálogo, clique em OK.

Tolerâncias personalizadas no DaemonSet node-local-dns são substituídas durante a atualização. Reconfigure-as posteriormente. Se a atualização falhar, consulte Solução de problemas de componentes .

Desinstalar o NodeLocal DNSCache

  1. Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.

  2. Clique no nome do seu cluster. No painel de navegação à esquerda, escolha Operations > Add-ons.

  3. Na página Add-ons, localize o NodeLocal DNSCache e clique em Uninstall. Na caixa de diálogo, clique em OK.

Importante

Após a desinstalação, todas as consultas DNS serão direcionadas diretamente ao CoreDNS. Escale horizontalmente o CoreDNS antes de desinstalar para lidar com o aumento de carga.

Configure o Terway para o modo IPvlan

Em clusters com versões antigas do Terway, a configuração padrão pode não rotear o tráfego DNS para 169.254.20.10 corretamente. Atualize a configuração antes de instalar o NodeLocal DNSCache.

  1. Abra o ConfigMap do Terway para edição:

    kubectl -n kube-system edit cm eni-config -o yaml
  2. Verifique o ConfigMap:

  3. Se eniip_virtual_type for IPVlan e host_stack_cidrs estiver ausente, adicione host_stack_cidrs e defina-o como 169.254.20.10/32. Salve e saia.

    10-terway.conf: |
     {
       "cniVersion": "0.3.0",
       "name": "terway",
       "eniip_virtual_type": "IPVlan",
       "host_stack_cidrs": ["169.254.20.10/32"],
       "type": "terway"
     }
  4. Liste os pods do DaemonSet do Terway:

    kubectl -n kube-system get pod | grep terway-eniip

    Saída esperada:

    terway-eniip-7****         2/2     Running   0          30m
    terway-eniip-s****         2/2     Running   0          30m
  5. Exclua os pods para aplicar a configuração atualizada:

    kubectl -n kube-system delete pod terway-eniip-7**** terway-eniip-s****
  6. Faça login em um nó do cluster e verifique a atualização:

    cat /etc/cni/net.d/*

    Saída esperada:

    {
      "cniVersion": "0.3.0",
      "name": "terway-chainer",
      "plugins": [
        {
          "eniip_virtual_type": "IPVlan",
          "host_stack_cidrs": [
            "169.254.20.10/32"
          ],
          "type": "terway"
        },
        {
          "type": "cilium-cni"
        }
      ]
    }

    Depois que todos os pods do Terway estiverem em execução, prossiga para Instale o NodeLocal DNSCache.

Próximos passos