Con el SSO ya funcionando (379af6d), a la web sólo se entra por Authentik.
Ayer se dejó abierto a propósito porque el SSO acababa de estar 15 días roto en
silencio y no quería quedarme sin puerta; hoy, verificado que funciona, se
cierra.
Lo que NO cierra, y es lo que importa: la auth básica de la API sigue abierta.
De ella cuelgan los dos sidecars —que es exactamente lo que se rompió mudo el
21 y dejó de recargar dashboards y datasources— y la puerta de emergencia con
la contraseña del secret grafana-admin.
Sí desaparece la otra: el POST /login pasa a devolver 400. Comprobado antes y
después, porque era la salida que uno supondría disponible y ya no lo está.
El procedimiento de rescate queda escrito junto al valor: la API con
grafana-admin, y disable_login_form: false + helm upgrade para recuperar el
formulario en un minuto.
Verificado: SSO entra como akadmin; la auth básica entra como admin;
disableLoginForm=true y authProxyEnabled=true en /api/frontend/settings; desde
fuera sigue el 302 a Authentik; y los DOS sidecars probados con ConfigMaps
reales, con 200 OK y el dashboard de prueba llegando de verdad a Grafana (y
desapareciendo al retirar el ConfigMap). 0 errores en el arranque.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
139 lines
6.1 KiB
YAML
139 lines
6.1 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).
|
|
# disable_login_form cierra el formulario local: por la web sólo se entra
|
|
# por Authentik. NO cierra la auth básica de la API, que es de donde cuelgan
|
|
# los dos sidecars y la puerta de emergencia.
|
|
#
|
|
# SI EL SSO SE CAE Y NO PUEDES ENTRAR POR LA WEB:
|
|
# 1. La API sigue abierta con la contraseña del secret grafana-admin:
|
|
# kubectl get secret grafana-admin -n monitoring \
|
|
# -o jsonpath='{.data.admin-password}' | base64 -d; echo
|
|
# y contra localhost:3000 dentro del pod, o por port-forward.
|
|
# 2. Para recuperar el formulario, poner disable_login_form: false aquí y
|
|
# helm upgrade. Tarda un minuto y no pierde nada.
|
|
auth:
|
|
disable_login_form: true
|
|
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
|