Saltar a contenido

kube-prometheus-stack

Stack de monitorización del cluster: Prometheus (métricas), Grafana (visualización) y node-exporter + kube-state-metrics (colección de métricas de nodos y de objetos k8s). El alerting se hace con Grafana Alerting (no con Alertmanager).

Resumen

Recoge las métricas del cluster y de los nodos. Prometheus scrapea los ServiceMonitors/PodMonitors (node-exporter, kube-state-metrics y las apps que expongan métricas, p. ej. Traefik :9100). Grafana las visualiza y ejecuta las alertas. Alertmanager está desactivado (alertmanager.enabled: false).

Estado

Campo Valor
Estado Operativo
Argo CD Application kube-prometheus-stack
Namespace monitoring

Despliegue

Campo Valor
Método Helm chart
Chart / imagen kube-prometheus-stack@91.7.0 (app v0.94.1)
Origen https://prometheus-community.github.io/helm-charts
Config en el repo clusters/luka/apps/kube-prometheus-stack/application.yaml

Red

Campo Valor
Service kube-prometheus-stack-prometheus (ClusterIP :9090), kube-prometheus-stack-grafana (ClusterIP :80)
IP —
URL interna https://grafana.local.gorkarevilla.com
URL externa — (solo interna)
TLS cert-manager wildcard *.local.gorkarevilla.com (Traefik)

Acceso y usuarios

  • Grafana admin: user admin, password en el Secret VKS grafana-admin (colección Homelab).
  • opencode: service account opencode (rol Admin, token en el Secret grafana-opencode-token), creada por el grafana-operator.
  • SSO OIDC (Authentik): login con Authentik (provider OIDC Grafana, grupo admins). El admin local admin se mantiene como respaldo.

Configuración

  • crds.enabled: false — los CRDs de prometheus-operator (>256KB) no se instalan vía client-side apply. Se instalan aparte, una sola vez, con kubectl apply --server-side (ver abajo).
  • alertmanager.enabled: false (el alerting lo hace Grafana Alerting).
  • grafana.admin.existingSecret: grafana-admin (claves admin-user/admin-password).
  • grafana.image.tag: 13.2.2-slim + grafana.env.GF_PLUGINS_PREINSTALL: prometheus,loki — en Grafana 13.2 los datasources core (Prometheus/Loki/…) pasaron a bundled catalog plugins en un directorio de solo lectura y el auto-install falla con read-only file system → plugin not registered (issue grafana/grafana#131490). La variante -slim no los trae empaquetados y los instala del catálogo en el directorio escribible (el cluster sí tiene salida a grafana.com). ⚠️ Al actualizar el chart/imagen, revisar que esta instalación se mantiene.
  • grafana.deploymentStrategy.type: Recreate — el PVC RWO de grafana.db (1 Gi) no permite dos pods a la vez; con RollingUpdate el rollout se bloquea (el pod nuevo no puede montar el volumen hasta que el viejo lo suelta). Recreate termina el pod viejo primero.
  • grafana.ini.auth.generic_oauth → OIDC contra Authentik (auth.local.gorkarevilla.com); client_secret por env GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET desde el Secret VKS grafana-oauth (envFromSecret).
  • prometheus.prometheusSpec.retention: 15d.
  • node-exporter y kube-state-metrics con los defaults del chart (habilitados).

CRDs (bootstrap manual)

Los CRDs de prometheus-operator miden hasta ~833KB y el kubectl apply (client-side) añade un annotation last-applied-configuration que supera los 256KB permitidos. Por eso se instalan una sola vez con server-side apply (que no usa ese annotation):

helm pull prometheus-community/kube-prometheus-stack --version 91.7.0 --untar
kubectl apply --server-side -f kube-prometheus-stack/charts/crds/crds/

Al actualizar el chart (nueva versión), repetir este paso para los CRDs. El resto del despliegue lo gestiona Argo CD con crds.enabled: false.

Almacenamiento

  • Prometheus: PVC Longhorn 20 Gi (StatefulSet, SC por defecto).
  • Grafana: PVC Longhorn 1 Gi (grafana.db).

Dependencias

  • Depende de: k3s, Longhorn, VKS (secret grafana-admin), Traefik (ingress).
  • Usado por: grafana-operator (SA + datasources), y futuros ServiceMonitors de apps.

Backup y recuperación

  • Re-desplegable desde Git; las series de Prometheus no se backupean (retención 15d).

Monitorización

  • Es el propio stack de monitorización. Targets en http://...:9090/targets.
  • Reparto de responsabilidades del alerting:
  • Grafana Alerting (este stack): solo monitores de uso de recursos (CPU, memoria, disco, saturación de nodos/pods, etc.).
  • Uptime Kuma: los monitores de disponibilidad/uptime de los servicios (HTTP checks, ping, etc.). No se duplican aquí.
  • Reglas de alerta vía grafana-operator: GrafanaAlertRuleGroup en clusters/luka/config/grafana-operator/alertrules.yaml (p. ej. el grupo longhorn-io de la incidencia de errores de I/O en kyrie). Los contact points/notification policies están en alerting.yaml (Telegram).
  • Canal de Telegram: las alertas van al chat ramuh (chat_id 279293304); canales del mismo bot: Casa (-665545694), Casa-dev (-778840696). Ver grafana-operator.md.

Dashboards (carpeta Homelab)

Importados vía grafana-operator (GrafanaDashboard, clusters/luka/config/grafana-operator/dashboards.yaml):

Dashboard URL
Node Exporter Full https://grafana.local.gorkarevilla.com/d/rYdddlPWk/node-exporter-full
Kubernetes / Views / Global https://grafana.local.gorkarevilla.com/d/k8s_views_global/kubernetes-views-global
Kubernetes / Views / Namespaces https://grafana.local.gorkarevilla.com/d/k8s_views_ns/kubernetes-views-namespaces
Kubernetes / Views / Nodes https://grafana.local.gorkarevilla.com/d/k8s_views_nodes/kubernetes-views-nodes
Argo CD https://grafana.local.gorkarevilla.com/d/qPkgGHg7k/argocd
cert-manager https://grafana.local.gorkarevilla.com/d/u6M5igpWk/cert-manager
Traefik https://grafana.local.gorkarevilla.com/d/dce21912-67de-483c-9e82-bca8167c2fe7/traefik

Longhorn (13032) se quitó: importa bien pero no tiene datos (sus métricas no se scrapean por el connection refused del manager). Re-añadir al arreglar el ServiceMonitor de Longhorn.

Referencias

Notas / TODO

  • Habilitar ServiceMonitors/PodMonitors de apps (Traefik, CNPG, Longhorn, Reloader, Vaultwarden): follow-up posterior.
  • Alertas de Grafana Alerting (reglas) pendientes de definir. Solo de recursos: la disponibilidad de servicios es cosa de Uptime Kuma.