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 consiste em 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 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 funcionalidades de 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:
|
Nº |
Descrição |
|
① |
Por padrão, um pod com o dnsConfig local injetado usa 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 usa o servidor DNS implantado na virtual private cloud (VPC) para resolver nomes de domínio externos ao cluster. |
|
④ |
Se o pod com o dnsConfig local injetado falhar ao se conectar ao NodeLocal DNSCache, ele usará o Service kube-dns para se conectar ao CoreDNS e resolver o DNS. |
|
⑤ |
Um pod sem o dnsConfig local injetado usa o Service kube-dns para se conectar ao CoreDNS e resolver o DNS. |
Pré-requisitos
Antes de começar, verifique se:
Um cluster ACK foi criado.
O kubectl está conectado ao cluster.
Limitações
Nós Windows não são suportados. 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 estão instalados.
Se o cluster usar o Terway, a versão 1.0.10.301 ou superior será necessária. Caso o Terway esteja executando no modo ENI inclusivo com IPvlan, configure o Terway para o modo IPvlan primeiro.
O NodeLocal DNSCache atua apenas como um proxy de cache transparente para o CoreDNS e não expõe 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 pode falhar ao resolver domínios externos. Consulte Melhores práticas para services de DNS.
Não instalado em nós master por padrão. Se houver pods executando em nós master com taints, adicione tolerâncias correspondentes ao DaemonSet
node-local-dnsno namespacekube-system.
Instalar o NodeLocal DNSCache
Faça login no console ACK. No painel de navegação à esquerda, clique em console ACKClusters.
Localize seu cluster e selecione 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.
Configurar o NodeLocal DNSCache
Para rotear consultas DNS dos pods pelo NodeLocal DNSCache, defina nameservers no dnsConfig do pod como 169.254.20.10 e o endereço IP do cluster do kube-dns. Use um dos métodos a seguir:
|
Método |
Recomendação |
Descrição |
|
Recomendado |
O controlador de admissão injeta o dnsConfig no momento da 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 workloads. |
Método 1: Injeção automática de dnsConfig
O controlador de admissão injeta o dnsConfig em pods dentro de 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 de destino conforme necessário.
Quando ativado, o seguinte dnsConfig é adicionado aos novos pods. O IP do cluster do kube-dns é incluído como fallback para 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 usa
hostNetworkcom a política de DNSClusterFirstWithHostNet, ou não usahostNetworke emprega a política de 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 template do 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 podem 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 template do 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 é o fallback do kube-dns. |
|
|
Domínios de busca DNS do cluster |
Garante que nomes de services internos sejam resolvidos corretamente. |
|
|
|
Um valor menor reduz as buscas por domínio de pesquisa antes de tentar o nome exatamente como 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 |
|
|
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 os workloads em execução.
Exemplo: Configurar 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.
Atualizar 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, selecione 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 sobrescritas 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, selecione 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.
Configurar 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 Instalar o NodeLocal DNSCache.Caso
host_stack_cidrsjá esteja presente, nenhuma alteração é necessária. Prossiga para Instalar 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 Instalar o NodeLocal DNSCache.