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.10por 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:
Fluxo de consulta DNS após a implantação do NodeLocal DNSCache:
|
Nº |
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. |
Pré-requisitos
Antes de começar, verifique se você possui:
Um cluster ACK criado.
O kubectl conectado ao cluster.
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
hostsourewritediretamente 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-dnsno namespacekube-system.
Instale o NodeLocal DNSCache
Faça login no console ACK. No painel de navegação à esquerda, clique em console ACKClusters.
Localize seu cluster e escolha More > Operations > Manage Components na coluna Actions.
Na página Add-ons, clique na aba Networking e localize o ACK NodeLocal DNSCache.
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 |
|
Recomendado |
O controlador de admissão injeta o dnsConfig durante a criação do pod — sem necessidade de edição manual de YAML. |
|
|
Neutro |
Especifique o dnsConfig diretamente no YAML do pod. |
|
|
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 namespacedefault. Substituadefaultpelo 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-systemoukube-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,ecioualibabacloud.com/eci).O pod não possui os rótulos
eci,alibabacloud.com/eciounode-local-dns-injection=disabled.O pod utiliza
hostNetworkcom a política DNSClusterFirstWithHostNet, ou não utilizahostNetworke emprega a política DNSClusterFirst.
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"
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 |
|
|
|
Obrigatório ao especificar um dnsConfig personalizado. |
|
|
|
A primeira entrada roteia para o NodeLocal DNSCache; a segunda serve como fallback para o kube-dns. |
|
|
Domínios de busca DNS do cluster |
Garante que nomes de serviços internos sejam resolvidos corretamente. |
|
|
|
Um valor menor reduz as buscas por domínio antes de tentar o nome exatamente como foi fornecido. O padrão é |
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 |
|
|
Servidores DNS gravados no dnsConfig do pod. Especifique primeiro |
|
|
Domínio de busca DNS gravado no dnsConfig do pod. Na maioria dos clusters, este valor é |
Após editar o arquivo, aplique as alterações:
sudo systemctl daemon-reload
sudo systemctl restart kubelet
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).
-
Rotule o namespace para ativar a injeção automática de dnsConfig.
ImportanteO controlador de admissão ignora pods nos namespaces
kube-systemekube-public. Não ative a injeção para esses namespaces.kubectl label namespace default node-local-dns-injection=enabled -
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.yamlSaída esperada:
deployment.apps/ubuntu created -
Verifique se o Deployment está em execução.
kubectl get deployment ubuntuSaída esperada:
NAME READY UP-TO-DATE AVAILABLE AGE ubuntu 2/2 2 2 7s -
Valide a injeção do dnsConfig. Obtenha o nome de um pod:
kubectl get podsSaída esperada:
NAME READY STATUS RESTARTS AGE ubuntu-766448f68c-m**** 1/1 Running 0 4m39s ubuntu-766448f68c-w**** 1/1 Running 0 4m39sVerifique 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.10emnameserversconfirma a injeção do dnsConfig.
Atualize o NodeLocal DNSCache
Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.
Clique no nome do seu cluster. No painel de navegação à esquerda, escolha Operations > Add-ons.
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
Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.
Clique no nome do seu cluster. No painel de navegação à esquerda, escolha Operations > Add-ons.
Na página Add-ons, localize o NodeLocal DNSCache e clique em Uninstall. Na caixa de diálogo, clique em OK.
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.
-
Abra o ConfigMap do Terway para edição:
kubectl -n kube-system edit cm eni-config -o yaml -
Verifique o ConfigMap:
Se
eniip_virtual_typenão forIPVlan, nenhuma alteração é necessária. Prossiga para Instale o NodeLocal DNSCache.Se
host_stack_cidrsjá estiver presente, nenhuma alteração é necessária. Prossiga para Instale o NodeLocal DNSCache.
-
Se
eniip_virtual_typeforIPVlanehost_stack_cidrsestiver ausente, adicionehost_stack_cidrse defina-o como169.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" } -
Liste os pods do DaemonSet do Terway:
kubectl -n kube-system get pod | grep terway-eniipSaída esperada:
terway-eniip-7**** 2/2 Running 0 30m terway-eniip-s**** 2/2 Running 0 30m -
Exclua os pods para aplicar a configuração atualizada:
kubectl -n kube-system delete pod terway-eniip-7**** terway-eniip-s**** -
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.