📖 Tempo estimado de leitura: 7 min
Um dos desafios mais comuns ao configurar clusters Kubernetes é dimensionar corretamente os recursos necessários para os nós que compõem o cluster. Quantas vCPUs e quanta RAM você realmente precisa para seus workloads? Se você solicitar muitos recursos, estará desperdiçando dinheiro; se solicitar poucos, enfrentará problemas de desempenho ou até mesmo falhas.
Esses requests impactam diretamente o agendador do Kubernetes e influenciam no dimensionamento dos nós, caso sejam máquinas virtuais locais ou instâncias em nuvem.
Para ajudar nesse processo de dimensionamento, desenvolvi uma calculadora interativa que você pode usar para estimar com precisão os requisitos de CPU e memória com base nos seus deployments planejados.
Para entender melhor como esses parâmetros afetam o consumo real de recursos e o planejamento da infraestrutura, desenvolvemos uma calculadora interativa de requests. Ela ajuda a estimar quantos recursos um cluster precisa, com base nas definições dos seus deployments, facilitando a projeção da carga e a escolha do tamanho ideal das instâncias de computação.
O Kubernetes é uma plataforma poderosa para orquestração de contêineres que utiliza dois conceitos fundamentais para gerenciar recursos de computação:
⒈ Requests: A quantidade mínima de recursos que o Kubernetes garante para um pod
⒉ Limits: O valor máximo de recursos que um pod pode consumir
Quando um pod é criado, o scheduler do Kubernetes procura um nó que tenha recursos suficientes disponíveis para satisfazer os requests do pod. Se os nós no seu cluster não tiverem recursos suficientes, os pods ficarão pendentes.
Um cluster subdimensionado pode causar:
− Pods em estado pendente
− Desempenho degradado de aplicações
− Evictions (despejos) frequentes de pods
− Reinicializações de contêineres por OOMKilled (Out of Memory Killed)
Um cluster superdimensionado pode levar a:
− Desperdício significativo de recursos
− Custos desnecessários de infraestrutura
− Baixa eficiência de utilização de recursos
− ROI reduzido nos seus investimentos em Kubernetes
A calculadora oferece dois modos de operação:
O modo básico é perfeito para cálculos rápidos e inclui:
− Número total de pods
− CPU request por pod
− Memória request por pod
Com apenas esses três valores, você obtém uma estimativa inicial dos recursos necessários para sua VM.
Para um dimensionamento mais preciso, o modo avançado permite especificar:
− CPU e memória (tanto requests quanto limits)
− Buffer adicional para crescimento
− Tipo de nó (standard ou alta disponibilidade)
− Fator de utilização personalizado
A calculadora fornece três métricas principais:
⒈ CPU Total Necessário: Soma dos requests de CPU multiplicado pelo número de pods, com ajustes para utilização do sistema
⒉ Memória Total Necessária: Soma dos requests de memória, convertida em unidades apropriadas (Mi/Gi)
⒊ VM Recomendada: Tamanho sugerido de máquina virtual que comportaria seus workloads
Além disso, você pode ver cálculos detalhados clicando em “Ver cálculos detalhados”, o que mostra exatamente como os números foram derivados.
A calculadora considera que você não deve planejar para utilizar 100% dos recursos disponíveis em uma VM. Isso porque:
− O próprio Kubernetes consome recursos
− O sistema operacional e serviços de base precisam de recursos
− Reservar margem é crucial para picos de carga inesperados
Por padrão, a calculadora usa um limite de utilização de 80% para nós standard e 70% para nós de alta disponibilidade.
No modo avançado, você pode definir um buffer adicional para acomodar:
− Crescimento futuro da carga de trabalho
− Variações inesperadas no uso de recursos
− Requisitos de escalonamento horizontal (HPA)
Um buffer de 20% é uma escolha conservadora para a maioria dos ambientes.
− CPU: Comece medindo o uso base da sua aplicação e adicione um buffer de 20-30%
− Memória: Baseie-se no uso médio mais um buffer de 30-40% (a memória tende a variar mais que a CPU)
− CPU: Normalmente 1.5x a 2x o valor do request
− Memória: No máximo 1.5x o valor do request (para evitar OOMKilled)
Para uma aplicação web típica:
resources:
requests:
cpu: 0.5
memory: 256Mi
limits:
cpu: 1.0
memory: 384Mi
− Podem ter um buffer menor
− Foco na proporção requests/limits para maximizar densidade
− Precisam de buffer maior para evitar interrupções
− Devem considerar cargas de pico de I/O
− Requisitos de memória geralmente mais críticos que CPU
− Considere adicionar pelo menos 50% de buffer para memória
Lembre-se que os valores calculados são apenas o ponto de partida. Uma vez que seu cluster esteja em execução:
⒈ Monitore o uso real de recursos
⒉ Compare com as alocações
⒊ Ajuste os requests e limits conforme necessário
⒋ Recalcule o tamanho ideal dos nós
Ao utilizar o Kubernetes, é comum que, ao escalar rapidamente o número de pods (por exemplo, criando 50 pods com um request de CPU de 500 millicores) alguns deles fiquem presos no estado Pending
. Isso geralmente acontece quando os nós do cluster não possuem recursos suficientes disponíveis para atender aos requests de todos os pods.
Suponha que cada pod solicite:
resources:
requests:
cpu: 500m
Se você tentar criar 50 pods com esse request, o total de CPU requisitada será:
50 pods × 500m = 25.000m (ou 25 vCPU)
Agora imagine que cada nó worker do cluster possui apenas 8 vCPU disponíveis. O scheduler do Kubernetes tentará encontrar nós com CPU suficiente para cada pod. Como nenhum nó tem capacidade para receber todos esses pods simultaneamente, apenas alguns serão agendados. O restante ficará em estado Pending
até que recursos suficientes estejam disponíveis.
O scheduler do Kubernetes verifica os recursos disponíveis em cada nó e compara com os requests definidos para cada pod. Se não houver nenhum nó com recursos suficientes, o pod não será agendado.
Recursos considerados pelo scheduler:
− CPU e memória solicitadas (requests
)
− Restrições de afinidade ou anti-afinidade
− Restrições de tolerations e taints
− Recursos disponíveis no momento do agendamento
Algumas boas práticas:
− Dimensione corretamente seus nós: Use ferramentas como o calculador de requests para prever o uso total de CPU e memória.
− Evite requests exagerados: Meça o consumo real da aplicação e ajuste os requests conforme necessário.
− Implemente HPA (Horizontal Pod Autoscaler): Para aumentar o número de réplicas com base em uso real, e não de forma estática.
− Use múltiplos node pools: Com nós de diferentes tamanhos ou perfis para workloads variados.
− Considere a utilização de Cluster Autoscaler: Que adiciona nós dinamicamente conforme a necessidade de agendamento de pods.
Você pode identificar rapidamente quais pods estão em Pending
com:
kubectl get pods --all-namespaces --field-selector=status.phase=Pending
Para ver os motivos exatos de um pod estar pendente:
kubectl describe pod <nome-do-pod>
Isso mostrará mensagens como:
0/3 nodes are available: 3 Insufficient cpu.
Com essas informações, você pode ajustar a configuração do cluster ou dos pods para garantir um agendamento mais eficiente e evitar gargalos na orquestração.
Dimensionar corretamente os recursos para clusters Kubernetes é uma mistura de ciência e arte. Esta calculadora fornece um ponto de partida sólido, mas o monitoramento contínuo e os ajustes são essenciais para otimizar o equilíbrio entre desempenho e custo.
Experimente diferentes cenários, compare os resultados e use estas informações para tomar decisões mais informadas sobre o tamanho das VMs para seu próximo cluster Kubernetes.
− Documentação oficial do Kubernetes sobre gerenciamento de recursos
− Boas práticas para requests e limits
− Vertical Pod Autoscaler - Uma ferramenta complementar para ajustar automaticamente requests
Compartilhe este post e continue acompanhando nosso site para mais novidades sobre Kubernetes e tecnologias open-source!
Dê uma olhada nestes outros artigos interessantes! 🔥
Gostou do que encontrou aqui? A cada clique em um banner, você ajuda a manter este site vivo e gratuito. Seu apoio faz toda a diferença para que possamos continuar trazendo conteúdos que você adora. Muito obrigado! 😊