Capitulo 14: Monitoring con Prometheus y Grafana

Por: Artiko
k3skubernetesprometheusgrafanamonitoring

Capitulo 14: Monitoring con Prometheus y Grafana

< Volver al Indice del Tutorial

Por que Monitorear

Un cluster de Kubernetes sin monitoring es como conducir sin tablero de instrumentos. No sabes cuanta CPU consumen tus pods, si un nodo esta al limite de memoria o si un servicio empezo a fallar hace una hora.

El monitoring te da:

Stack de Monitoring

El stack estandar de la industria para Kubernetes es:

El chart kube-prometheus-stack instala los tres componentes junto con exporters y dashboards preconfigurados.

Instalar kube-prometheus-stack

Usa Helm para instalar todo el stack:

# Agregar repositorio
helm repo add prometheus-community \
  https://prometheus-community.github.io/helm-charts
helm repo update

# Crear namespace dedicado
kubectl create namespace monitoring

# Instalar el stack
helm install kube-prometheus \
  prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  -f monitoring-values.yaml

Archivo de valores recomendado para K3s:

# monitoring-values.yaml
prometheus:
  prometheusSpec:
    retention: 7d
    resources:
      requests:
        cpu: 200m
        memory: 512Mi
      limits:
        cpu: 500m
        memory: 1Gi
    storageSpec:
      volumeClaimTemplate:
        spec:
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 10Gi

grafana:
  adminPassword: "tu-password-seguro"
  resources:
    requests:
      cpu: 100m
      memory: 128Mi
    limits:
      cpu: 200m
      memory: 256Mi

alertmanager:
  alertmanagerSpec:
    resources:
      requests:
        cpu: 50m
        memory: 64Mi
      limits:
        cpu: 100m
        memory: 128Mi

Verifica que todos los pods esten corriendo:

kubectl get pods -n monitoring

Como Funciona Prometheus

Prometheus usa un modelo de pull (scraping). En lugar de que las aplicaciones envien metricas, Prometheus las recolecta periodicamente de endpoints HTTP.

Scraping

Cada aplicacion expone un endpoint /metrics que Prometheus consulta a intervalos regulares (por defecto 30 segundos). El endpoint devuelve metricas en formato texto plano.

ServiceMonitor

El operador de Prometheus usa recursos ServiceMonitor para descubrir que servicios debe scrapear:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: mi-app-monitor
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: mi-app
  endpoints:
    - port: metrics
      interval: 15s
      path: /metrics

Esto le dice a Prometheus: “busca Services con el label app: mi-app y scrapea su puerto metrics cada 15 segundos”.

Metricas del Cluster

El stack incluye exporters que recolectan metricas automaticamente:

Node Exporter (metricas de nodos)

kube-state-metrics (estado de objetos)

cAdvisor (metricas de contenedores)

Grafana

Acceder al Dashboard

Expone Grafana con port-forward:

kubectl port-forward -n monitoring \
  svc/kube-prometheus-grafana 3000:80

Accede en http://localhost:3000 con usuario admin y el password configurado.

Dashboards Preconfigurados

El stack incluye dashboards listos para usar:

Encuentra estos dashboards en el menu lateral: Dashboards > Browse.

Crear Paneles Personalizados

Para crear un nuevo panel:

  1. Click en + > Dashboard > Add visualization
  2. Selecciona Prometheus como datasource
  3. Escribe una query PromQL, por ejemplo:
# Porcentaje de CPU usado por namespace
sum(rate(container_cpu_usage_seconds_total{namespace!=""}[5m]))
  by (namespace)
  1. Configura el tipo de visualizacion (grafico, gauge, tabla)
  2. Guarda el dashboard

Alertas

Configurar Alertmanager

El chart ya incluye Alertmanager. Configura las notificaciones en los values:

# En monitoring-values.yaml
alertmanager:
  config:
    route:
      receiver: 'slack-notifications'
      group_wait: 30s
      group_interval: 5m
      repeat_interval: 4h
    receivers:
      - name: 'slack-notifications'
        slack_configs:
          - api_url: 'https://hooks.slack.com/services/TU/WEBHOOK/URL'
            channel: '#alertas-k3s'
            send_resolved: true

Reglas de Alerta

El stack incluye reglas predefinidas. Puedes agregar las tuyas con PrometheusRule:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: alertas-custom
  namespace: monitoring
  labels:
    release: kube-prometheus
spec:
  groups:
    - name: custom.rules
      rules:
        - alert: PodDown
          expr: kube_pod_status_phase{phase="Failed"} > 0
          for: 5m
          labels:
            severity: warning
          annotations:
            summary: "Pod {{ $labels.pod }} en estado Failed"

        - alert: HighCPU
          expr: |
            (1 - avg by(instance)
              (rate(node_cpu_seconds_total{mode="idle"}[5m]))
            ) > 0.85
          for: 10m
          labels:
            severity: critical
          annotations:
            summary: "CPU del nodo {{ $labels.instance }} sobre 85%"

Aplica la regla:

kubectl apply -f alertas-custom.yaml

Consumo de Recursos

El stack de monitoring consume recursos significativos. Estos son valores tipicos en un cluster K3s pequeno:

ComponenteCPU RequestMemoria Request
Prometheus200m512Mi
Grafana100m128Mi
Alertmanager50m64Mi
Node Exporter50m30Mi
kube-state-metrics10m32Mi

Ajustar para Recursos Limitados

Si tu nodo tiene poca RAM, reduce la retencion y los recursos:

prometheus:
  prometheusSpec:
    retention: 3d
    resources:
      limits:
        memory: 512Mi
    storageSpec:
      volumeClaimTemplate:
        spec:
          resources:
            requests:
              storage: 5Gi

En nodos con menos de 4GB de RAM, considera usar soluciones mas ligeras como metrics-server para metricas basicas sin el stack completo.

Resumen

El monitoring es esencial para operar un cluster de forma confiable. Con kube-prometheus-stack obtienes un sistema completo de metricas, visualizacion y alertas con un solo comando de Helm. Ajusta los recursos segun la capacidad de tu cluster.


Siguiente: Capitulo 15: Logs y Debugging —>