Observabilidade no Kubernetes
Como instrumentar uma infraestrutura em MicroK8s para coleta de Métricas e Traces de aplicações com Grafana e Prometheus
Como instrumentar uma infraestrutura em MicroK8s para coleta de métricas e traces de aplicações com Grafana
O Kubernetes tornou-se uma plataforma essencial para orquestração de contêineres, e o MicroK8s é uma solução leve e fácil de usar para quem deseja rodar Kubernetes localmente ou em ambientes de desenvolvimento. No entanto, à medida que suas aplicações crescem em complexidade, a necessidade de monitoramento e observabilidade torna-se crítica.
Vale ressaltar que Kubernetes e a observabilidade são componentes essenciais para a gestão de aplicações modernas em ambientes de nuvem, mas sua implementação pode levar a um aumento significativo nos custos se não forem gerenciados de forma eficiente. Por exemplo, o Kubernetes pode escalar automaticamente os recursos com base na demanda, o que é ótimo para garantir a disponibilidade da aplicação, mas também pode resultar em custos imprevistos. Um cluster Kubernetes que escala horizontalmente (HPA - Horizontal Pod Autoscaler) pode criar múltiplas réplicas de pods durante picos de tráfego, consumindo mais recursos de CPU, memória e armazenamento. Se esses recursos não forem otimizados ou se o dimensionamento automático for configurado de forma agressiva, a infraestrutura pode acabar utilizando mais instâncias de nuvem do que o necessário, elevando a fatura mensal.
Neste artigo, vamos explorar como instrumentar uma infraestrutura em MicroK8s para coletar métricas e traces de aplicações, utilizando o Grafana para visualização.
Pré-requisitos
Antes de começarmos, certifique-se de que você tem o seguinte configurado:
- MicroK8s instalado e configurado: Se ainda não o fez, tenho uma publicação sobre como começar com K8S, ou; dê uma olhada na documentação oficial para instalar o MicroK8s.
- kubectl: Ferramenta de linha de comando para interagir com o cluster Kubernetes, que já existe no microk8s.
- Helm: Gerenciador de pacotes para Kubernetes. Instale-o seguindo as instruções aqui.
Habilitar Add-ons no MicroK8s
O MicroK8s vem com vários add-ons que podem ser habilitados facilmente. Para nossa configuração, vamos habilitar o metrics-server
e o prometheus
.
microk8s enable metrics-server
microk8s enable prometheus
O metrics-server
coleta métricas de recursos como CPU e memória, enquanto o prometheus
é uma ferramenta de monitoramento e alerta que vai nos ajudar a coletar métricas mais detalhadas.
Instalar o Prometheus e Grafana com Helm
Vamos usar o Helm para instalar o Prometheus e o Grafana em nosso cluster.
Verificar a instalação:
kubectl get pods
Você deve ver pods relacionados ao Prometheus, Grafana e outros componentes em execução.
Instalar o Prometheus:
helm install prometheus prometheus-community/kube-prometheus-stack
Este comando instala o Prometheus junto com o Grafana e outros componentes necessários.
Adicionar o repositório Helm do Prometheus:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
Configurar o Prometheus para Coletar Métricas
O Prometheus já vem configurado para coletar métricas básicas do Kubernetes. No entanto, se você quiser coletar métricas específicas de suas aplicações, você precisará configurar o Prometheus para fazer scraping dessas métricas.
- Verificar se o Prometheus está coletando métricas:Acesse a interface do Prometheus (normalmente disponível em
http://localhost:9090
se você estiver usando port-forward) e verifique se as métricas da sua aplicação estão sendo coletadas.
Criar um ServiceMonitor
:O ServiceMonitor
é um recurso customizado que o Prometheus usa para descobrir serviços e coletar métricas. Aqui está um exemplo de como criar um ServiceMonitor
para uma aplicação:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: my-app-monitor
namespace: default
spec:
selector:
matchLabels:
app: my-app
endpoints:
- port: web
interval: 30s
Salve este arquivo como my-app-monitor.yaml
e aplique-o com:
kubectl apply -f my-app-monitor.yaml
Configurar o Grafana para Visualizar Métricas
O Grafana já foi instalado junto com o Prometheus. Agora, vamos configurá-lo para visualizar as métricas coletadas.
- Adicionar o Prometheus como Fonte de Dados:
- No Grafana, vá para
Configuration
>Data Sources
. - Clique em
Add data source
e selecionePrometheus
. - No campo
URL
, insirahttp://prometheus-operated:9090
. - Clique em
Save & Test
.
- No Grafana, vá para
- Criar Dashboards:Agora que o Prometheus está configurado como fonte de dados, você pode criar dashboards para visualizar as métricas. Aqui está um exemplo de como criar um gráfico simples:
- Vá para
Create
>Dashboard
>Add new panel
. - No campo
Metrics
, insira uma métrica do Prometheus, comohttp_requests_total
. - Ajuste o gráfico conforme necessário e salve o dashboard.
- Vá para
Acessar o Grafana:Para acessar o Grafana, você pode usar o port-forward:
kubectl port-forward svc/prometheus-grafana 3000:80
Agora, acesse http://localhost:3000
no seu navegador. O usuário padrão é admin
e a senha pode ser obtida com:
kubectl get secret prometheus-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
Coletar Traces com Jaeger
Além de métricas, traces são essenciais para entender o comportamento de suas aplicações em um ambiente distribuído. Vamos usar o Jaeger para coletar traces.
- Visualizar Traces no Jaeger:Acesse a interface do Jaeger (normalmente disponível em
http://localhost:16686
se você estiver usando port-forward) e visualize os traces coletados.
Configurar sua Aplicação para Enviar Traces:Dependendo da linguagem e framework que você está usando, a configuração para enviar traces para o Jaeger pode variar. Aqui está um exemplo básico para uma aplicação em Node.js usando o jaeger-client
:
const jaeger = require('jaeger-client');
const opentracing = require('opentracing');
const config = {
serviceName: 'my-app',
reporter: {
agentHost: 'jaeger-agent',
agentPort: 6832,
},
sampler: {
type: 'const',
param: 1,
},
};
const tracer = jaeger.initTracer(config);
opentracing.initGlobalTracer(tracer);
Instalar o Jaeger com Helm:
helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
helm repo update
helm install jaeger jaegertracing/jaeger
Atente-se com os custos!
A observabilidade, que inclui a coleta de métricas, logs e traces, também pode contribuir para o aumento dos custos. Ferramentas como Prometheus, Grafana e Jaeger geram grandes volumes de dados, especialmente em ambientes com muitas aplicações e microsserviços. Por exemplo, armazenar métricas detalhadas de todos os pods em um cluster Kubernetes ou coletar traces de cada requisição em um sistema distribuído pode exigir um armazenamento robusto e caro. Além disso, o processamento e a análise desses dados podem consumir recursos computacionais adicionais, especialmente se forem utilizados serviços gerenciados de nuvem, como o Amazon CloudWatch, Google Cloud Operations Suite ou Azure Monitor, que cobram com base no volume de dados processados e armazenados. Sem uma política clara de retenção de dados ou filtragem de métricas menos relevantes, os custos podem sair do controle rapidamente.
Referências:
- https://microk8s.io
- https://www.gov.br/governodigital/pt-br/privacidade-e-seguranca/ppsi/guia_processo_gestao_dados.pdf
- The Observability Book
- https://www.finops.org/assets/why-finance-processes-need-to-catch-up-to-finops/