K8s em Exemplos: Monitoramento Prometheus

Prometheus é o padrão para métricas Kubernetes. Aplicações expõem métricas em um endpoint HTTP; Prometheus as coleta periodicamente. O Prometheus Operator simplifica o deploy com recursos customizados como ServiceMonitor e PodMonitor. Use para: alertas, dashboards, planejamento de capacidade, rastreamento de SLO.

terminal

Instale kube-prometheus-stack via Helm. Isso faz deploy de Prometheus, Alertmanager, Grafana e o Prometheus Operator que fornece os CRDs ServiceMonitor, PodMonitor e PrometheusRule.

$ helm install prometheus prometheus-community/kube-prometheus-stack -n monitoring --create-namespace
NAME: prometheus
STATUS: deployed
NOTES: kube-prometheus-stack has been installed.
metrics-app.yaml

Aplicações expõem métricas em um endpoint /metrics no formato Prometheus. Annotations informam ao Prometheus para coletar deste Pod. Porta 8080 serve a app; métricas podem estar na mesma porta ou em porta diferente.

apiVersion: v1
kind: Pod
metadata:
  name: web-app
  annotations:
    prometheus.io/scrape: "true"
    prometheus.io/port: "8080"
    prometheus.io/path: "/metrics"
spec:
  containers:
    - name: app
      image: my-app:v1
      ports:
        - containerPort: 8080
          name: http
service-monitor.yaml

ServiceMonitor (do Prometheus Operator) define como coletar de Services. Seleciona Services por label e especifica qual porta coletar. Mais poderoso que annotations para setups complexos.

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: web-app-monitor
  labels:
    release: prometheus
spec:
  selector:
    matchLabels:
      app: web-app
  endpoints:
    - port: http
      path: /metrics
      interval: 30s
  namespaceSelector:
    matchNames:
      - default
prometheus-rules.yaml

PrometheusRule define regras de alerta e gravação. Regras de gravação pré-computam queries custosas. Regras de alerta disparam quando condições são atendidas por uma duração.

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: api-server-rules
spec:
  groups:
    - name: api-server
      rules:
        - alert: HighErrorRate
          expr: |
            sum(rate(http_requests_total{status=~"5.."}[5m]))
            / sum(rate(http_requests_total[5m])) > 0.05
          for: 5m
          labels:
            severity: critical
          annotations:
            summary: "Alta taxa de erros em {{ $labels.service }}"
terminal

Verifique se o Prometheus está descobrindo seus targets. Cheque recursos ServiceMonitor/PodMonitor, depois consulte o endpoint ou UI de targets do Prometheus para confirmar que a coleta está funcionando.

$ kubectl get servicemonitors -A
NAMESPACE   NAME               AGE
default     api-server         5m
default     web-app-monitor    10m

$ kubectl port-forward svc/prometheus 9090:9090 -n monitoring &
$ curl localhost:9090/api/v1/targets | jq '.data.activeTargets[].labels'

Índice | GitHub | Use as setas do teclado para navegar |