Configure a quantidade de pods, recursos, agendamento e isolamento de nós para evitar interrupções do CoreDNS no modo não gerenciado.
No modo não gerenciado, a disponibilidade e o desempenho do CoreDNS dependem da quantidade de pods, dos limites de recursos, do agendamento e da distribuição entre nós. As configurações padrão atendem clusters pequenos; cargas de trabalho em produção exigem ajustes.
Impactos potenciais
Configurações incorretas ou recursos insuficientes no CoreDNS geram duas categorias de problemas:
Disponibilidade: agendamento inadequado cria pontos únicos de falha no nível de nó ou zona. Recursos insuficientes causam evicção de pods e interrupções no DNS.
Desempenho: contenção de recursos em nós compartilhados aumenta a latência de resposta. Cargas elevadas nos nós provocam perda de pacotes de E/S e falhas nas solicitações de DNS.
Ajuste a quantidade de pods do CoreDNS
Como o protocolo UDP não possui retransmissão, reduzir a escala ou reiniciar o CoreDNS — especialmente quando defeitos no IPVS causam perda de pacotes — pode gerar timeouts ou falhas na resolução de DNS em todo o cluster por até cinco minutos. Consulte Troubleshooting DNS resolution issues.
Não utilize o dimensionamento automático horizontal de pods (HPA) nem o CronHPA para o CoreDNS. Reduções frequentes de escala provocam falhas na resolução.
Avalie a pressão sobre o DNS
Antes de ajustar o número de réplicas, avalie a pressão sobre o DNS. Ferramentas como DNSPerf permitem medir a carga de DNS.
Caso não seja possível medir a pressão diretamente, siga estas diretrizes:
Execute pelo menos 2 pods do CoreDNS com limites de recursos de, no mínimo, 1 núcleo e 1 GB de memória.
O QPS de resolução de DNS escala linearmente com o consumo de CPU. Com o NodeLocal DNSCache, cada núcleo de CPU processa mais de 10.000 consultas por segundo (QPS). Diferentes cargas de trabalho têm necessidades de QPS muito variadas; portanto, monitore o pico de uso de CPU de cada pod do CoreDNS. Se algum pod ultrapassar um núcleo durante os horários de pico de negócios, aumente a escala das réplicas.
Na ausência de dados de carga, comece com 1 pod para cada 8 nós como linha de base.
O aumento de escala só é eficaz quando os nós possuem recursos suficientes. Se houver pouca memória disponível, adicione novos nós ou aumente os recursos por nó.
Após definir a quantidade alvo de réplicas, utilize o ajuste automático (recomendado) ou faça o dimensionamento manual.
Configure o ajuste automático (recomendado)
O componente cluster-proportional-autoscaler ajusta as réplicas do CoreDNS com base no tamanho do cluster. Diferentemente do HPA, ele não depende de métricas de CPU nem realiza reduções de escala disruptivas. Proporção padrão: 1 pod para cada 8 nós.
Fórmula de cálculo de réplicas: replicas = max(ceil(cores × 1/coresPerReplica), ceil(nodes × 1/nodesPerReplica)). Os parâmetros min e max limitam a quantidade entre 2 e 100.
Implante o autoscaler:
apiVersion: apps/v1
kind: Deployment
metadata:
name: dns-autoscaler
namespace: kube-system
labels:
k8s-app: dns-autoscaler
spec:
selector:
matchLabels:
k8s-app: dns-autoscaler
template:
metadata:
labels:
k8s-app: dns-autoscaler
spec:
serviceAccountName: admin
containers:
- name: autoscaler
image: registry.cn-hangzhou.aliyuncs.com/acs/cluster-proportional-autoscaler:1.8.4
resources:
requests:
cpu: "200m"
memory: "150Mi"
command:
- /cluster-proportional-autoscaler
- --namespace=kube-system
- --configmap=dns-autoscaler
- --nodelabels=type!=virtual-kubelet
- --target=Deployment/coredns
- --default-params={"linear":{"coresPerReplica":64,"nodesPerReplica":8,"min":2,"max":100,"preventSinglePointFailure":true}}
- --logtostderr=true
- --v=9
Faça o dimensionamento manual
Para definir uma quantidade específica de réplicas:
kubectl scale --replicas=<target> deployment/coredns -n kube-system # Replace <target> with the target number of pods.
Ajuste as especificações dos pods do CoreDNS
Em um cluster ACK Pro, a configuração padrão dos pods do CoreDNS é:
|
Recurso |
Limite padrão |
|
CPU |
Sem limite |
|
Memória |
2 GiB |
Defina o limite de CPU como 4096m (mínimo de 1024m) com base no pico de uso observado.
Alterar as especificações dos pods do CoreDNS causa o reinício deles, o que pode gerar picos breves de latência ou falhas no DNS. Execute essa operação fora dos horários de pico.
Faça login no ACK console. No painel de navegação à esquerda, clique em Clusters .
Na página Clusters, clique no nome do cluster desejado. No painel de navegação à esquerda, clique em Add-ons.
Na aba Networking, localize CoreDNS e clique em Configuration.
-
Modifique a configuração do CoreDNS e clique em OK.
Na caixa de diálogo CoreDNS Parameter Settings, configure os seguintes parâmetros:
MemoryRequest: solicitação de memória, por exemplo
100Mi.CpuRequest: solicitação de CPU, por exemplo
100m.MemoryLimit: limite de memória, por exemplo
2Gi. Se o limite de memória for muito baixo, o pod poderá ser encerrado por OOMKilled.CpuLimit: limite de CPU. Recomendamos definir este valor como o dobro do CpuRequest.
NodeSelector: rótulo do seletor de nó. Por exemplo, defina Key como
kubernetes.io/ose Value comolinux.
Implante em um pool de nós dedicado
Um pool de nós dedicado isola o CoreDNS de outras cargas de trabalho e evita contenção de recursos.
Reagendar pods do CoreDNS causa o reinício deles, o que pode gerar picos breves de latência ou falhas no DNS. Execute essa operação fora dos horários de pico.
Crie um pool de nós dedicado
Ao criar o pool de nós, siga estas diretrizes:
O CoreDNS exige uso intensivo de rede, não de computação. Utilize instâncias otimizadas para rede, com tamanho recomendado de 4 núcleos e 8 GB de memória.
O pool deve ter pelo menos 2 nós, já que o CoreDNS executa 2 pods por padrão.
Adicione um taint e um rótulo para impedir que outros pods sejam executados nesses nós. Por exemplo, use
system-addon: system-addontanto como par chave-valor do taint quanto como rótulo, comEffectdefinido comoNoSchedule.
Consulte Crie e gerencie pools de nós.
Agende pods do CoreDNS para o pool de nós
Na página Add-ons, localize o cartão CoreDNS e clique em Configuration.
-
Na seção NodeSelector, adicione o rótulo do pool de nós dedicado.
Não exclua os rótulos existentes do NodeSelector.
-
Na seção Tolerations, adicione uma tolerância correspondente ao taint do pool de nós.
Adicione uma entrada de tolerância em Tolerations: defina effect como
NoSchedule, key comosystem-addon, operator comoEquale value comosystem-addon. -
Clique em OK e verifique se os pods do CoreDNS estão em execução nos nós dedicados:
kubectl -n kube-system get pod -o wide --show-labels | grep coredns
Use políticas de agendamento para alta disponibilidade
Para proteger a disponibilidade do DNS, o CoreDNS utiliza duas políticas de agendamento por padrão:
Anti-afinidade de pods (nível de nó): impede que dois pods do CoreDNS sejam executados no mesmo nó. Se um nó falhar, o DNS permanecerá disponível nos demais.
Agendamento com reconhecimento de topologia (nível de zona): distribui os pods do CoreDNS entre zonas de disponibilidade, evitando pontos únicos de falha no nível de zona que a anti-afinidade de pods sozinha não consegue resolver.
Essas políticas aplicam-se apenas durante o agendamento inicial. Se as configurações de nó ou zona forem alteradas, localize o Deployment coredns no ACK console e clique em Redeploy.
Anti-afinidade de pods
O CoreDNS usa uma regra de anti-afinidade requiredDuringSchedulingIgnoredDuringExecution para impedir que dois pods compartilhem o mesmo nó. Isso requer pelo menos 2 nós com recursos suficientes, excluindo:
k8s.aliyun.com: true— nós com node autoscaling ativadotype: virtual-kubelet— nós virtuaisalibabacloud.com/lingjun-worker: true— nós Lingjun
A configuração de afinidade padrão é:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
# virtual nodes have this label
- key: type
operator: NotIn
values:
- virtual-kubelet
# lingjun worker nodes have this label
- key: alibabacloud.com/lingjun-worker
operator: NotIn
values:
- "true"
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
# autoscaled nodes have this label
- key: k8s.aliyun.com
operator: NotIn
values:
- "true"
weight: 100
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: k8s-app
operator: In
values:
- kube-dns
topologyKey: kubernetes.io/hostname
Agendamento com reconhecimento de topologia
Por padrão, o CoreDNS usa topology-aware scheduling para distribuir os pods entre as zonas. A configuração whenUnsatisfiable: DoNotSchedule impõe essa regra — os pods não serão agendados se a condição de equilíbrio entre zonas não puder ser atendida.
Para que isso funcione de forma confiável:
O cluster deve ter nós em pelo menos 2 zonas diferentes, cada uma com pelo menos 1 nó que possua recursos suficientes para o CoreDNS.
Todos os nós devem ter o rótulo
topology.kubernetes.io/zone(aplicado por padrão). Rótulos ausentes ou inconsistentes causam falhas de agendamento ou distribuição desigual.Atualize o cluster para a versão v1.27 ou posterior e o CoreDNS para a versão v1.12.1.3 ou posterior. Versões anteriores do cluster não suportam matchLabelKeys; portanto, uma atualização contínua do CoreDNS pode resultar em pods distribuídos desigualmente entre as zonas e até deixar algumas zonas sem cobertura. Consulte a configuração
matchLabelKeysdescrita abaixo.
Versões do CoreDNS anteriores à v1.12.1.3 usam esta restrição de distribuição de topologia:
topologySpreadConstraints:
- labelSelector:
matchLabels:
k8s-app: kube-dns
maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
A diferença na quantidade de pods entre quaisquer duas zonas não pode exceder o maxSkew (padrão 1). O labelSelector conta pods tanto dos ReplicaSets novos quanto dos antigos; assim, para satisfazer maxSkew=1, o agendador favorece zonas com menos pods no total. Após o término dos pods antigos, os novos pods podem se concentrar em poucas zonas.
CoreDNS v1.12.1.3 e posteriores corrigem esse comportamento com matchLabelKeys (Kubernetes v1.27+):
topologySpreadConstraints:
- labelSelector:
matchLabels:
k8s-app: kube-dns
matchLabelKeys:
- pod-template-hash
nodeTaintsPolicy: Honor
maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
Adicionar matchLabelKeys: [pod-template-hash] restringe a aplicação da restrição ao ReplicaSet atual, garantindo que as atualizações contínuas distribuam os pods uniformemente entre as zonas.