Ícone do site CooperaTI

Melhores Práticas em Kubernetes: Definindo Resource Requests e Limits

Melhores Práticas em Kubernetes: Definindo Resource Requests e Limits

Como Technical Evangelist da K2 Cloud, estou aqui para aprofundar em cada uma das melhores práticas essenciais para operar clusters Kubernetes de produção de forma eficiente, segura e econômica. Começamos com um dos pilares fundamentais para a estabilidade e otimização de custos: a correta definição de Resource Requests e Limits para todos os seus Pods.

Em um ambiente Kubernetes, onde múltiplos Pods competem por recursos limitados em nós de trabalho, garantir que cada carga de trabalho declare suas necessidades de CPU e memória é crucial. Ignorar essa prática pode levar a problemas sérios, como contenção de recursos, instabilidade do cluster e desperdício financeiro.


➤ Conheça nossas soluções em nuvem: https://k2cloud.com.br


 

O que são Resource Requests e Limits?

No Kubernetes, Resource Requests e Limits são mecanismos para gerenciar a alocação de recursos computacionais (CPU e memória) para contêineres dentro de um Pod. Eles fazem parte da especificação do Pod e informam ao scheduler do Kubernetes como alocar os Pods nos nós disponíveis e como o Kubelet (o agente do nó) deve gerenciar os recursos para os contêineres em execução.

Resource Requests

Um Resource Request especifica a quantidade mínima de um recurso que um contêiner precisa para funcionar. O scheduler do Kubernetes usa essa informação para decidir em qual nó um Pod deve ser agendado. Ele garante que o nó selecionado tenha recursos disponíveis suficientes para atender às requisições de todos os Pods agendados nele [1].

Por exemplo, se um Pod requisita 500m de CPU (500 milicores, o que equivale a meio núcleo de CPU) e 256MiB de memória, o scheduler só o agendará em um nó que tenha pelo menos essa quantidade de recursos livres.

Resource Limits

Um Resource Limit especifica a quantidade máxima de um recurso que um contêiner tem permissão para consumir. Os limites atuam como um teto para o consumo de recursos. Se um contêiner tentar usar mais recursos do que seu limite, o Kubelet tomará medidas para restringir seu consumo [2].

Para CPU, se um contêiner exceder seu limite, ele será limitado (throttled), o que significa que sua execução será desacelerada. Para memória, se um contêiner exceder seu limite, ele será encerrado pelo Kubelet com um erro Out-Of-Memory (OOMKilled).

Por que Definir Resource Requests e Limits é Essencial?

A definição adequada de requests e limits traz uma série de benefícios cruciais para a operação de clusters Kubernetes em produção:

1. Estabilidade do Cluster: Ao definir requests, você garante que seus Pods terão os recursos mínimos necessários para operar, evitando que sejam agendados em nós sobrecarregados. Limits impedem que um único Pod consuma todos os recursos de um nó, causando instabilidade para outros Pods no mesmo nó [3].
2. Otimização de Custos: Requests e limits são fundamentais para entender e otimizar o uso de recursos. Ao saber quanto cada carga de trabalho realmente precisa e consome, você pode dimensionar seus nós de forma mais precisa, evitando o provisionamento excessivo e reduzindo custos de infraestrutura. Ferramentas como o Kubecost utilizam essas informações para fornecer insights detalhados sobre a alocação de custos [4].
3. Qualidade de Serviço (QoS): O Kubernetes usa requests e limits para atribuir uma Classe de Qualidade de Serviço (QoS) a cada Pod. Existem três classes: Guaranteed, Burstable e BestEffort. Pods com QoS Guaranteed (requests e limits iguais para CPU e memória) têm maior prioridade e menor probabilidade de serem encerrados em situações de escassez de recursos. Pods BestEffort (sem requests ou limits) têm a menor prioridade e são os primeiros a serem encerrados [5]. Definir requests e limits permite controlar a prioridade e o comportamento dos seus Pods.
4. Agendamento Eficiente: O scheduler utiliza requests para tomar decisões de agendamento mais inteligentes, distribuindo as cargas de trabalho de forma equilibrada entre os nós disponíveis. Isso melhora a utilização do cluster e evita nós sobrecarregados.

Como Definir Requests e Limits na Prática

Definir requests e limits não é uma ciência exata e requer observação e ajuste contínuos. Aqui estão algumas diretrizes e ferramentas para ajudar:

1. Comece com Estimativas e Monitore

Se você não tem dados históricos de uso, comece com estimativas razoáveis baseadas no tipo de aplicação. Para aplicações web simples, 100-200m de CPU e 128-256MiB de memória podem ser um bom ponto de partida. Para aplicações mais complexas ou bancos de dados, você precisará de mais. O mais importante é monitorar o uso real após a implantação.

2. Monitore o Uso Real de Recursos

Utilize ferramentas de monitoramento como Prometheus e Grafana (que a K2 Cloud pode ajudar a implementar e otimizar!) para coletar métricas de uso de CPU e memória dos seus Pods. Observe os picos de uso e o consumo médio ao longo do tempo. Isso fornecerá dados valiosos para ajustar seus requests e limits [6].


➤ Conheça nossas soluções em nuvem: https://k2cloud.com.br


 

3. Ajuste Iterativamente

Com base nos dados de monitoramento, ajuste seus requests e limits. Se um Pod consistentemente usa menos recursos do que o requisitado, você pode diminuir o request para liberar capacidade para outros Pods. Se ele atinge frequentemente seu limit de CPU, considere aumentá-lo. Se ele é OOMKilled, aumente o limit de memória.

4. Considere a Classe de QoS

Decida qual Classe de QoS é apropriada para sua aplicação:

5. Use Ferramentas de Otimização

Ferramentas como o Kubecost (especialidade da K2 Cloud!) podem analisar o uso de recursos do seu cluster e recomendar requests e limits ideais, além de identificar desperdícios e oportunidades de economia. O Kubecost integra-se com o Prometheus para fornecer insights precisos sobre o consumo de recursos e os custos associados [7].

Exemplo de Configuração

Veja um exemplo de como definir requests e limits em um manifesto de Pod:

 

Neste exemplo:

Desafios e Considerações

Como a K2 Cloud Pode Ajudar

A K2 Cloud é especialista na otimização e gerenciamento de ambientes Kubernetes. Nossos serviços incluem:

Não deixe seus custos de Kubernetes fugirem do controle! Entre em contato com a K2 Cloud hoje mesmo para um assessment gratuito do seu cluster e descubra como podemos otimizar seus recursos e reduzir seus gastos.

Referências

[1] Kubernetes Documentation: Requests and Limits
[https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#requests-and-limits]

[2] Kubernetes Documentation: Resource Management for Pods and Containers
[https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/]

[3] Kubernetes Best Practices: Resource Management
[https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#best-practices]

[4] Kubecost Documentation: How Kubecost Works
[https://docs.kubecost.com/]

[5] Kubernetes Documentation: Configure Quality of Service for Pods
[https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/]

[6] Prometheus Documentation: Getting Started
[https://prometheus.io/docs/introduction/overview/]

[7] Kubecost Documentation: Integrations
[https://docs.kubecost.com/integrations]

Sair da versão mobile