Files
k8s-manifests/monitoring/values-kube-prometheus-stack.yaml
T
chemavxandClaude Opus 4.8 379af6d0cc monitoring: recupera el SSO de Grafana con Authentik
Grafana llevaba ~15 días sin SSO: ignoraba la cabecera X-authentik-username, de
modo que Authentik te dejaba pasar y Grafana te pedía credenciales igual. El
último acceso de akadmin (el usuario que crea auto_sign_up) es de hace 15 días.

El bloque [auth.proxy] estaba en el ConfigMap vivo en abril — así consta en el
export de git de aquel momento — pero el chart NUNCA lo ha generado en ninguna
de sus 7 revisiones, así que era un retoque a mano que se perdió por el camino.
Ahora va declarado en values y sobrevive a una reconstrucción.

Aparecida al arreglarlo, otra pieza del mismo tipo: la anotación
router.middlewares que engancha el forward-auth de Authentik al Ingress. Vivía
sólo por el three-way merge de Helm, igual que el montaje de alerting (0501aab)
y el token de Telegram (28f1631). Reconstruir el release habría dejado Grafana
en internet SIN autenticación de Authentik, con sólo su formulario delante.

NO se restaura disable_login_form, que sí traía la config de abril: el
formulario local se queda como puerta de emergencia, con la contraseña del
secret grafana-admin. Que el SSO fallara en silencio es justo lo que pasó aquí.

Verificado: con la cabecera, autentica como akadmin; sin ella sigue dando 401;
una petición externa a grafana.chemavx.xyz redirige (302) al authorize de
Authentik; el formulario local responde 200 y la contraseña de emergencia entra;
0 errores en el arranque. Exports regenerados: el auditor deja monitoring en 2
hallazgos, ambos conocidos (una anotación del controlador y el tag de
uptime-kuma, pendiente de decidir con el resto de tags flotantes).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 08:55:01 +00:00

128 lines
5.6 KiB
YAML

# Valores del release Helm kube-prometheus-stack (chart 83.2.0, ns monitoring).
#
# Este namespace NO está bajo ArgoCD: se gestiona a mano. Este fichero es la
# fuente de verdad del release; para aplicarlo:
#
# helm upgrade kube-prometheus-stack prometheus-community/kube-prometheus-stack \
# --version 83.2.0 -n monitoring -f values-kube-prometheus-stack.yaml
#
# rev 2 (2026-07-21): silenciadas 4 alertas que llevaban meses disparadas sin
# significar nada — ver kubeControllerManager/kubeScheduler/kubeProxy y
# defaultRules.disabled.
# rev 3 (2026-07-21): grafana.extraConfigmapMounts. El montaje del ConfigMap
# grafana-alerting (reglas + contact points + política → Telegram) se había
# añadido A MANO al Deployment y NO lo generaba el chart: sobrevivía solo por
# el three-way merge de Helm. Reconstruir el release desde este fichero se
# habría llevado por delante TODO el alerting, en silencio.
# rev 4 (2026-07-21): grafana.admin.existingSecret y FUERA adminPassword.
# El valor en git era "admin", que no abría nada: la cuenta admin local se
# configuró el 26-abr y no se ha usado desde entonces (se entra por Authentik).
# Los sidecars de dashboards y datasources SÍ la usaban y recibían 401 al
# intentar recargar por API. Ahora la contraseña es aleatoria, vive solo en el
# Secret grafana-admin (creado fuera del chart, nunca en git) y la cuenta queda
# como acceso de emergencia. Leerla:
# kubectl get secret grafana-admin -n monitoring \
# -o jsonpath='{.data.admin-password}' | base64 -d; echo
# rev 5 (2026-07-22): fuera la datasource Alertmanager. OJO: NO la apaga
# alertmanager.enabled=false — el chart la provisiona igual, apuntando a un
# servicio que no existe (error 500 al consultarla). El interruptor real es
# grafana.sidecar.datasources.alertmanager.enabled. Y quitarla del fichero de
# provisioning NO la borra de grafana.db: hay que provisionar el borrado con
# una directiva deleteDatasources de un solo uso (se hizo y se retiró).
# rev 7 (2026-07-22): recuperado el SSO de Authentik, roto desde hace ~15 días
# (último acceso de akadmin). Grafana ignoraba la cabecera X-authentik-username
# -> Authentik te dejaba pasar y Grafana te pedía credenciales igual. El bloque
# auth.proxy existía en el ConfigMap vivo en abril (está en el export de git),
# pero el chart NUNCA lo ha generado en ninguna de sus 6 revisiones, así que
# era otro retoque a mano que se perdió por el camino. Ahora va declarado.
# Junto con él, la anotación del middleware de Traefik: tampoco la generaba el
# chart, y sin ella Grafana queda expuesta sin Authentik delante.
# rev 6 (2026-07-22): grafana.envValueFrom. Mismo caso que rev 3, encontrado al
# auditar el Deployment contra el render: TELEGRAM_BOT_TOKEN y TELEGRAM_CHAT_ID
# estaban puestas A MANO y el chart no las generaba. El contact point de
# alerting usa ${TELEGRAM_BOT_TOKEN}: reconstruir el release desde cero habría
# dejado las alertas de Telegram mudas. Se declaran aquí sin tocar nada vivo.
# (CHAT_ID hoy no lo usa nadie —el chatid del contact point va literal— pero se
# deja para que el render coincida exactamente con lo desplegado.)
alertmanager:
enabled: false
defaultRules:
create: true
disabled:
PrometheusNotConnectedToAlertmanagers: true
rules:
alertmanager: false
grafana:
admin:
existingSecret: grafana-admin
envValueFrom:
TELEGRAM_BOT_TOKEN:
secretKeyRef:
key: TELEGRAM_BOT_TOKEN
name: grafana-telegram-infisical
TELEGRAM_CHAT_ID:
secretKeyRef:
key: TELEGRAM_CHAT_ID
name: grafana-telegram-infisical
extraConfigmapMounts:
- configMap: grafana-alerting
mountPath: /etc/grafana/provisioning/alerting
name: grafana-alerting
grafana.ini:
# SSO con Authentik. Traefik autentica en el borde con el middleware de
# abajo y reenvía X-authentik-username; esto es lo que hace que Grafana se
# fíe de esa cabecera y no vuelva a pedir credenciales. Sin este bloque el
# SSO queda a medias: Authentik te deja pasar y Grafana te enseña SU
# formulario. auto_sign_up crea el usuario (así nació akadmin).
# El formulario local se deja habilitado a propósito, como puerta de
# emergencia: la contraseña vive en el secret grafana-admin.
auth.proxy:
auto_sign_up: true
enabled: true
header_name: X-authentik-username
header_property: username
server:
root_url: https://grafana.chemavx.xyz
ingress:
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
# Sin esta anotación Grafana queda expuesta sin Authentik delante. Estaba
# puesta a mano en el Ingress vivo y el chart no la generaba: sobrevivía
# sólo por el three-way merge, como el montaje de alerting (rev 3).
traefik.ingress.kubernetes.io/router.middlewares: authentik-authentik-forward-auth@kubernetescrd
traefik.ingress.kubernetes.io/router.entrypoints: websecure
enabled: true
hosts:
- grafana.chemavx.xyz
ingressClassName: traefik
tls:
- hosts:
- grafana.chemavx.xyz
secretName: grafana-tls
persistence:
enabled: true
size: 5Gi
storageClassName: local-path
sidecar:
datasources:
alertmanager:
enabled: false
kubeControllerManager:
enabled: false
kubeProxy:
enabled: false
kubeScheduler:
enabled: false
prometheus:
prometheusSpec:
retention: 30d
storageSpec:
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
storageClassName: local-path