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 VKSgrafana-admin(colecciónHomelab). - opencode: service account
opencode(rolAdmin, token en el Secretgrafana-opencode-token), creada por el grafana-operator. - SSO OIDC (Authentik): login con Authentik (provider OIDC
Grafana, grupoadmins). El admin localadminse 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, conkubectl apply --server-side(ver abajo).alertmanager.enabled: false(el alerting lo hace Grafana Alerting).grafana.admin.existingSecret: grafana-admin(clavesadmin-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 conread-only file system→plugin not registered(issuegrafana/grafana#131490). La variante-slimno los trae empaquetados y los instala del catálogo en el directorio escribible (el cluster sí tiene salida agrafana.com). ⚠️ Al actualizar el chart/imagen, revisar que esta instalación se mantiene.grafana.deploymentStrategy.type: Recreate— el PVC RWO degrafana.db(1 Gi) no permite dos pods a la vez; conRollingUpdateel rollout se bloquea (el pod nuevo no puede montar el volumen hasta que el viejo lo suelta).Recreatetermina el pod viejo primero.grafana.ini.auth.generic_oauth→ OIDC contra Authentik (auth.local.gorkarevilla.com);client_secretpor envGF_AUTH_GENERIC_OAUTH_CLIENT_SECRETdesde el Secret VKSgrafana-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:
GrafanaAlertRuleGroupenclusters/luka/config/grafana-operator/alertrules.yaml(p. ej. el grupolonghorn-iode la incidencia de errores de I/O en kyrie). Los contact points/notification policies están enalerting.yaml(Telegram). - Canal de Telegram: las alertas van al chat ramuh (
chat_id279293304); 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 refuseddel 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.