Observabilidade no NKPParte 1: os conceitos
Testado emNKP 2.19Kubernetes 1.36.2Rook Ceph 1.19.6Grafana Loki 3.6.7Lab em

Resumo: monitoramento responde se algo está quebrado; observabilidade responde por quê. Esta parte junta os conceitos que uso com clientes (pilares, métodos, SLO e custo) e mostra o que o NKP 2.19 já entrega. No lab, o cluster de workload tinha só métricas. Ligar os logs pelo catálogo levou quatro apps e cerca de 30 minutos, incluindo um storage Ceph completo. E o Alertmanager, ligado desde o primeiro dia, estava disparando alertas para ninguém. Esta é a parte 1 de 3.
Por que esta série
Depois do upgrade do NKP para a 2.19, a pergunta seguinte dos clientes foi quase sempre a mesma: “e como eu vejo o que está acontecendo dentro do cluster?”. A resposta curta é que o NKP já traz muita coisa. A resposta longa tem conceitos, escolhas e alguns cuidados, e virou esta série.
| Parte | Tema |
|---|---|
| 1 | Os conceitos e o que o NKP já entrega (este post) |
| 2 | NKP Insights: o cluster apontando os próprios problemas |
| 3 | OpenTelemetry Operator: traces, métricas e logs de uma aplicação, sem mexer no código |
Tudo foi testado no lab de IA da Clear IT: um cluster de management e um cluster de workload em NKP 2.19, sobre Nutanix AHV.
Monitoramento × observabilidade
Os dois termos aparecem como sinônimos, mas respondem perguntas diferentes.
| Monitoramento | Observabilidade | |
|---|---|---|
| Pergunta | Está funcionando? | Por que não está funcionando? |
| Parte de | Problemas que você já conhece | Problemas que ninguém previu |
| Forma típica | Dashboard e alerta com limite fixo | Explorar dados livremente, cruzando sinais |
| Exemplo | “CPU do nó acima de 90%” | “Por que 10% das compras falham só quando o item é um mouse?” |
Monitoramento é um subconjunto de observabilidade. Você continua precisando dos alertas; a diferença é ter dados suficientes para investigar o que o alerta não explica.
Observabilidade é uma propriedade do sistema
Um sistema é observável quando dá para entender o estado interno dele só olhando o que ele emite. Não é uma ferramenta que se compra: é algo que se constrói, instrumentando as aplicações e guardando os sinais certos.
Os pilares
| Sinal | O que é | Bom para | Exemplos de ferramenta |
|---|---|---|---|
| Métricas | Números ao longo do tempo | Tendência, alerta, capacidade | Prometheus, Thanos, Mimir, VictoriaMetrics |
| Logs | Registros de eventos, em texto | Detalhe de um erro específico | Loki, Elasticsearch, Fluent Bit, Fluentd |
| Traces | O caminho de uma requisição entre serviços | Latência e falhas em sistemas distribuídos | Jaeger, Tempo, Zipkin |
| Eventos do Kubernetes | Mudanças de estado dos objetos | “O que mudou?” | kubectl get events, Headlamp |
| Profiling | Onde o código gasta CPU e memória | Otimização fina | Pyroscope, Parca |
Em Kubernetes, os eventos funcionam na prática como um quarto pilar: um OOMKilled ou um FailedScheduling explica muita coisa antes de qualquer dashboard. O valor de verdade aparece quando os sinais se ligam. Na Parte 3, um clique num trace com erro abre os logs daquela mesma requisição.
O que medir: três métodos
Medir tudo é caro e confuso. Estes métodos ajudam a escolher o mínimo útil.
| Método | Para quê | Sinais |
|---|---|---|
| Quatro sinais de ouro (livro de SRE do Google) | Qualquer serviço voltado ao usuário | Latência, tráfego, erros e saturação |
| RED | Microsserviços e APIs | Rate (taxa), Errors (erros), Duration (duração) |
| USE | Infraestrutura: CPU, disco, rede | Utilization (uso), Saturation (saturação), Errors (erros) |
Uma regra prática: RED para as aplicações, USE para os nós e o storage. Os dashboards que o NKP traz prontos cobrem bem o USE; o RED depende de instrumentar as aplicações, que é o assunto da Parte 3.
SLI, SLO e error budget
É aqui que observabilidade vira conversa de negócio.
| Termo | O que é | Exemplo |
|---|---|---|
| SLI | O indicador medido | % de compras concluídas com sucesso |
| SLO | A meta para o indicador | 99,5% de sucesso em 30 dias |
| Error budget | O quanto se pode errar dentro da meta | 0,5% das compras, cerca de 3,6 horas por mês de indisponibilidade equivalente |
Com um SLO definido, o alerta deixa de ser “a CPU subiu” e passa a ser “estamos gastando o orçamento de erro rápido demais”. Isso reduz alerta inútil e dá um critério claro para decidir entre lançar funcionalidade nova ou investir em estabilidade.
OpenTelemetry: o padrão aberto
O OpenTelemetry é um projeto da CNCF que padroniza como as aplicações geram métricas, logs e traces e como esses dados são transportados. A ideia central: instrumentar uma vez e mandar para qualquer ferramenta, aberta ou paga.
Na prática, ele tira o lock-in da camada de instrumentação. Trocar de backend passa a ser uma mudança de configuração no Collector, não uma reescrita do código. O NKP 2.19 traz o OpenTelemetry Operator no catálogo, e ele é o tema da Parte 3.
As ferramentas do mercado
Uma visão neutra do que se encontra. Não existe a melhor; existe a que encaixa no time, no orçamento e nas regras de retenção de cada empresa.
| Tipo | Exemplos | Pontos fortes | Pontos de atenção |
|---|---|---|---|
| Open source | Prometheus, Grafana, Loki, Tempo, Mimir, Thanos, VictoriaMetrics, Jaeger, OpenTelemetry, Fluent Bit, SigNoz, OpenCost | Sem custo de licença, sem lock-in, comunidade grande | Operar, escalar e guardar os dados é com você |
| Enterprise e SaaS | Datadog, Dynatrace, New Relic, Splunk Observability, Elastic, Grafana Cloud, Honeycomb, Chronosphere | Pronto para usar, correlação e IA embutidas, suporte | Custo cresce com volume; dados saem do ambiente; dependência do fornecedor |
| Da plataforma (Nutanix) | Pilha do NKP (Prometheus, Grafana, Loki, Logging Operator), NKP Insights, operações do Prism | Já integrado, com suporte do fornecedor da plataforma | Escopo limitado ao que a plataforma empacota |
Os critérios que eu uso para escolher:
| Critério | Pergunta |
|---|---|
| Custo | Quanto custa por GB de log, por série de métrica, por host? E daqui a dois anos? |
| Esforço de operação | Quem mantém, atualiza e escala a ferramenta? |
| Retenção | Por quanto tempo preciso guardar, por regra ou por auditoria? |
| Soberania dos dados | Os dados podem sair do ambiente? |
| Lock-in | A instrumentação é aberta (OpenTelemetry) ou proprietária? |
Muitas empresas acabam num modelo misto: a pilha aberta da plataforma para o dia a dia e uma ferramenta paga para as aplicações mais críticas.
O custo da observabilidade
Observabilidade não é de graça, mesmo com ferramentas abertas. O custo vem de três lugares:
- Cardinalidade das métricas: cada combinação de rótulos vira uma série. Um rótulo com o ID do usuário pode multiplicar as séries por milhões.
- Volume e retenção de logs: log de debug ligado em produção enche o storage rápido.
- Recursos do cluster: cada componente da pilha consome CPU, memória e disco.
No lab, o Prometheus do management usava cerca de 5,9 GiB de memória sozinho, com retenção de 10 dias em um volume de 100 GiB. E, ao final desta série, depois de ligar logs, Insights e OpenTelemetry no cluster de workload, a CPU reservada (requests) do cluster foi de 27,1% para 72,5%. Observabilidade precisa entrar no dimensionamento desde o começo.
O que o NKP já entrega ligado
Antes de habilitar qualquer coisa, rodei um inventário só de leitura nos dois clusters. A diferença entre eles foi o primeiro achado.
| Componente | Management | Workload |
|---|---|---|
| Prometheus (kube-prometheus-stack) | ✓ | ✓ |
| Alertmanager | ✓ | ✓ |
| Grafana | ✓ (por cluster e um central) | ✓ |
| Thanos (consulta entre clusters) | ✓ | rota apenas |
| Karma (painel de alertas) | ✓ | rota apenas |
| OpenCost | ✓ (por cluster e um central) | ✓ |
| Grafana Loki + Logging Operator | ✓ | — |
| Grafana Logging | ✓ | — |
| NKP Insights (parte central) | ✓ | — |
| Retenção do Prometheus | 10 dias, 100 GiB | 10 dias, 100 GiB |
O cluster de workload vem com métricas, mas sem logs. Para quem roda as aplicações ali, faltava justamente o sinal mais usado no dia a dia.
O Grafana do workload já mostrava os dashboards de recursos funcionando, com um detalhe que vale um alerta para qualquer cliente: os limites de CPU do namespace kube-system somavam 161% do que o cluster tem.

No catálogo, a categoria Observability tem dois apps, os dois desligados por padrão. Eles são os temas das partes 2 e 3.

No lab: ligando os logs no cluster de workload
Objetivo: ter os logs de todos os pods do cluster de workload no Grafana, usando só o catálogo do NKP.
O caminho dos logs no NKP é este:
São quatro apps no catálogo, e um depende do outro:
| App | Papel | Depende de |
|---|---|---|
| Grafana Logging | Os dashboards e a busca de logs | Grafana Loki |
| Grafana Loki | Guarda e indexa os logs | Rook Ceph Cluster e Logging Operator |
| Logging Operator | Fluent Bit em cada nó coleta; Fluentd filtra e envia | — |
| Rook Ceph Cluster | Cria o storage Ceph e o bucket S3 do Loki | Rook Ceph (o operador) |
O atalho que não funcionou
Comecei pelo Grafana Logging e fui aceitando as dependências que a interface mostrava. Ao habilitar o Loki, o NKP avisou que faltavam duas: Rook Ceph Cluster e Logging Operator. O aviso deixa seguir mesmo assim, e eu segui, para ver o que acontecia.

O app ficou Enabled na interface. Os pods, não:
grafana-loki-v3-ingester-zone-a-0 0/1 CreateContainerConfigError...Warning Failed kubelet Error: secret "dkp-loki" not foundO Secret dkp-loki guarda a credencial do bucket onde o Loki grava. Quem cria esse bucket é o Rook Ceph Cluster, e ele não existia. Repare num detalhe que confunde: Rook Ceph e Rook Ceph Cluster são apps diferentes. O primeiro é só o operador; o segundo é que cria o cluster de storage.
“Enabled” não quer dizer funcionando
O NKP permite habilitar um app com dependência faltando. A interface mostra o app como habilitado, mas ele pode nunca subir. Depois de um Enable, confira os pods, não só o card.
Na ordem certa
Habilitei as dependências que faltavam. O Logging Operator subiu em cerca de um minuto: um operador, 6 Fluent Bit (um por nó) e um Fluentd. O Rook Ceph Cluster levou mais, porque monta um storage inteiro em cadeia: monitores, gerenciadores, discos e o gateway S3.
| Horário | O que aconteceu |
|---|---|
| 00:02 | Grafana Logging, Loki e Rook Ceph habilitados, ignorando os avisos |
| 00:11 | Loki parado: secret "dkp-loki" not found |
| 00:13 | Logging Operator no ar; Fluentd começa a coletar |
| 00:16 | Rook Ceph Cluster habilitado |
| ~00:22 | 3 monitores, 2 gerenciadores e a preparação de 4 discos |
| ~00:32 | Bucket e Secret criados; o Loki se recupera sozinho, sem nenhuma ação |
| ~00:48 | Ceph HEALTH_OK, menos de 32 minutos depois do Enable |
O Ceph criado pelo app usa volumes do storage padrão do cluster e entregou 160 GiB brutos, com 4 discos de dados nos 3 workers, 2 gateways S3 e erasure coding 3+1 para os dados dos buckets. Ele criou dois buckets: o do Loki e um para o Velero.

O dashboard do Ceph tem login próprio
O botão Dashboard do card abre o Ceph Dashboard, mas ele não usa o login único do Kommander. O usuário é admin, e a senha fica no Secret rook-ceph-dashboard-password.
Os logs que chegaram antes do Loki
No Grafana Logging, os logs de kube-system apareceram a partir de 00:20, uns 12 minutos antes de o Loki ficar pronto. A explicação estava no log do Fluentd:
[warn]: ... failed to flush the buffer. retry_times=0 ... error="502 Bad Gateway"[warn]: ... failed to flush the buffer. retry_times=1 ...O Fluentd tentou entregar, recebeu 502 do gateway do Loki, guardou os logs num buffer em disco e foi tentando de novo. Quando o Loki subiu, entregou o que estava guardado. Nada se perdeu.

Resultado
Logs de todos os pods do cluster de workload no Grafana, coletados por Fluent Bit e Fluentd e guardados no Loki sobre um Ceph criado pelo próprio NKP. Cerca de 30 minutos, quase todos esperando o Ceph.
Os alertas que não avisavam ninguém
O Alertmanager vem ligado nos dois clusters. No workload, havia 5 alertas disparados:

| Alerta | Severidade | O que era |
|---|---|---|
| Watchdog | none | Fica sempre disparado de propósito: prova que a cadeia de alertas está viva |
| InfoInhibitor | none | Auxiliar, silencia alertas de nível info |
| CPUThrottlingHigh | info | Sidecar do Fluentd com 30% de throttling de CPU, logo depois de subir |
| KubeProxyDown | critical | Disparado há dois dias. Alarme falso |
O KubeProxyDown é alarme falso porque o cluster não tem kube-proxy: o Cilium faz esse papel.
$ kubectl -n kube-system get ds kube-proxyError from server (NotFound): daemonsets.apps "kube-proxy" not found$ kubectl -n kube-system get cm cilium-config -o jsonpath='{.data.kube-proxy-replacement}'trueE o mais importante estava na configuração padrão:
route: receiver: "null"receivers:- name: "null"O único destino configurado é o "null". Os alertas disparam e não vão para ninguém: nem e-mail, nem Slack, nem Teams. Junto com um alerta crítico falso há dois dias, é o cenário que ensina uma equipe a ignorar alertas.
Antes de produção
Configure pelo menos um destino real no Alertmanager, mande o Watchdog para um serviço de “dead man’s switch” e ajuste ou silencie as regras que não se aplicam ao ambiente, como o KubeProxyDown num cluster com Cilium.
E para IA?
A mesma lógica vale para as cargas de IA, com sinais próprios:
| Camada | O que observar |
|---|---|
| GPU | Uso, memória, temperatura e erros (DCGM Exporter, da NVIDIA) |
| Servidor de inferência | Fila, requisições por segundo, latência |
| LLM | Tokens de entrada e saída, tempo até o primeiro token (TTFT), custo por requisição |
O OpenTelemetry já tem convenções específicas para IA generativa, para registrar modelo, tokens e latência de forma padronizada.
Um modelo de maturidade
Para situar onde cada cliente está:
| Nível | Como é | No lab, antes desta série |
|---|---|---|
| 1. Reativo | Alguém olha o dashboard quando o usuário reclama | — |
| 2. Monitorado | Alertas com limite fixo chegam a alguém | Parcial: alertas existem, mas não chegam a ninguém |
| 3. Observável | Métricas, logs e traces ligados entre si; dá para investigar o desconhecido | Métricas sim; logs só no management; traces não |
| 4. Orientado a SLO | Alertas por error budget; decisões de produto usam os dados | — |
As partes 2 e 3 levam o lab do nível 2 para o 3.
O que aprendi
- O workload vem só com métricas. Logs e traces precisam ser habilitados, e isso tem custo.
- O aviso de dependência deixa seguir, e o resultado é um app “Enabled” que não funciona. Confira os pods depois de cada Enable.
- Rook Ceph e Rook Ceph Cluster são apps diferentes. O primeiro é o operador; o segundo é o storage.
- O buffer do Fluentd segura os logs quando o destino cai. É resiliência que vem de fábrica.
- Alerta sem destino não protege nada, e alerta crítico falso ensina a ignorar alertas.
- Observabilidade consome recursos. Ela entra no dimensionamento, não depois dele.
Checklist de observabilidade básica no NKP
- Inventário do que já está ligado em cada cluster
- Logs habilitados nos clusters de workload, com as dependências na ordem
- Pods conferidos depois de cada Enable, não só o card do app
- Pelo menos um destino real configurado no Alertmanager
- Watchdog ligado a um serviço externo de “dead man’s switch”
- Regras que não se aplicam ao ambiente ajustadas ou silenciadas
- Retenção de métricas e logs definida por regra de negócio
- Consumo da pilha de observabilidade no dimensionamento do cluster
Próxima parte
Na Parte 2, o NKP Insights: habilitar nos dois clusters, ver o que ele encontra sozinho e comparar com os alertas do Prometheus que acabamos de ver.
Referências
- Site Reliability Engineering, capítulo 6: Monitoring Distributed Systems (Google)
- The USE Method (Brendan Gregg)
- OpenTelemetry
- Grafana Loki
- Logging Operator (Kube Logging)
- Rook
- Nutanix Kubernetes Platform Guide 2.19 (portal Nutanix)
Comentários
Os comentários usam o GitHub Discussions; é preciso ter uma conta no GitHub.