Como dominar a resiliência do Kubernetes com Grafana e Prometheus:

finops day
3 min readOct 20, 2023

--

Ao escrever este artigo, buscamos uma maneira de contribuir com insights sobre como o namespace do Kubernetes está usando seus recursos. Para isso, criamos um dashboard que detalha o consumo de request.

Antes disso, vamos dar uma breve visão sobre os temas abordados.

O Kubernetes é uma plataforma de orquestração de contêineres que permite aos desenvolvedores implantar e gerenciar aplicativos em escala.

O Grafana é uma ferramenta de visualização de dados que pode ser usada para monitorar as aplicações através de gráficos.

O Prometheus é um sistema de monitoramento de código aberto que pode ser usado para coletar e armazenar dados.

Em conjunto, o Grafana e o Prometheus podem fornecer uma solução abrangente de monitoramento para o Kubernetes.

Aqui estão alguns benefícios de usar o Grafana e o Prometheus para monitorar o Kubernetes:

  • Visibilidade
  • Escalabilidade
  • Flexibilidade

Aqui estão alguns exemplos de como o Grafana e o Prometheus podem ser usados para monitorar o Kubernetes:

  • Monitoramento de recursos: O Grafana pode ser usado para visualizar dados de recursos do Kubernetes, como CPU, memória e armazenamento. Isso pode ajudar os usuários a identificar problemas de desempenho ou capacidade.

Evitando armadilhas

Uma das armadilhas mais comuns ao usar o Kubernetes é solicitar mais recursos do que o necessário. Isso pode levar a desperdício de recursos e a custos desnecessários.

O painel de recomendações do Grafana pode ajudá-lo a identificar namespaces onde a carga de trabalho implantada não é eficiente. O painel mostra a porcentagem de CPU solicitada que está sendo realmente usada.

Se você vir um namespace com uma porcentagem de uso de CPU solicitada baixa, pode ser possível reduzir as solicitações de recursos para esse namespace. Isso pode ajudar a reduzir o desperdício de recursos e a custos desnecessários.

Interpretação:

Você pode usar os parâmetros abaixo para incluir a palheta de desempenho.

Request abaixo de 10% é representado pela cor vermelha (Pouco produtivo).

Request abaixo de 60% é representado pela cor amarela (intermediários).

Request acima de 60% é representado pela cor verde (produtivo).

Request acima de 90% é representado pela cor roxo (Não produtivo, pode representar gargalos no microserviço).

Importante olhar o limits definido para cada deployment, é com base nele que a porcentagem pode estar ultrapassando 100%.

Além disso, o cálculo final pode haver divergências quando o deployment está sem request definido.

Obs: Valores definidos como n/a não tem request definido.

Ações:

Se você identificar uma recomendação de uso de CPU vermelha ou amarela, você pode tomar as seguintes ações:

  • Investigar o problema para determinar a causa.
  • Redistribuir a carga para outros namespaces.
  • Ajustar os requests de recursos para os contêineres.

Observações:

  • As recomendações de uso de são apenas uma diretriz. Você pode ajustar as recomendações de acordo com as necessidades específicas do seu cluster.
  • As recomendações de uso de podem mudar ao longo do tempo, conforme o uso do cluster muda.

Queries utilizadas:

CPU:

A primeira consulta calcula o uso total de CPU para cada namespace:

sum(rate(container_cpu_usage_seconds_total{image!="" ,namespace!~"monitoring|kube-system", pod=~"$pod"})) by (namespace)

A segunda consulta calcula o uso total de CPU solicitado para cada namespace:

sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{namespace!~"monitoring|kube-system", node=~"$node", resource="cpu"}) by (namespace)

A terceira consulta calcula a porcentagem de CPU solicitada que está sendo realmente usada em cada namespace:

sum(rate(container_cpu_usage_seconds_total{image!="" ,namespace!~"monitoring|kube-system", pod=~"$pod"} > 0 )) by (namespace) / sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_requests{namespace!~"monitoring|kube-system", node=~"$node", resource="cpu"} > 0 ) by (namespace)

Memory:

A primeira consulta calcula o uso total de Memória para cada namespace:

sum (container_memory_working_set_bytes{image!="" ,namespace!~"monitoring|kube-system", pod=~"$pod"}) by (namespace)

A segunda consulta calcula o uso total de Memória solicitado para cada namespace.

sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{namespace!~"monitoring|kube-system",resource="memory", node=~"$node"}) by (namespace)

A terceira consulta calcula a porcentagem de Memória solicitada que está sendo realmente usada em cada namespace:

sum (container_memory_working_set_bytes{image!="" ,namespace!~"monitoring|kube-system", pod=~"$pod"} > 0 ) by (namespace)/
sum(cluster:namespace:pod_memory:active:kube_pod_container_resource_requests{namespace!~"monitoring|kube-system",resource="memory", node=~"$node"} > 0 ) by (namespace)

Agradecimentos:

Um agradecimento especial a Antonio de Abreu e Rodrigo Ferradas pela valiosa contribuição e insights compartilhados. Seus conhecimentos têm sido essenciais para guiar a comunidade nas melhores práticas e estratégias.

Esperamos que isso ajude!

--

--