From f5bcb76738ebe32f45c585cfcb2311d9135c726d Mon Sep 17 00:00:00 2001 From: chemavx Date: Tue, 21 Jul 2026 17:24:02 +0000 Subject: [PATCH] =?UTF-8?q?monitoring:=20la=20contrase=C3=B1a=20de=20Grafa?= =?UTF-8?q?na=20en=20git=20no=20abr=C3=ADa=20nada?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Los sidecars de dashboards y datasources autentican contra la API de Grafana con las credenciales del secret del chart, y recibían 401 en cada recarga. El valor en values era adminPassword: admin, que no es la contraseña de nadie. Lo que apareció al investigarlo cambia el diagnóstico que traíamos anotado. La cuenta admin local se configuró el 26-abr y NO se ha usado desde entonces (last_seen_at y updated, ambos de esa fecha): no hubo ninguna rotación reciente en la UI. El acceso real a Grafana es por Authentik — de ahí el usuario akadmin —, así que la contraseña de esa cuenta no la sabía nadie y era irrecuperable, por ser un hash bcrypt. Conservar la contraseña existente era por tanto imposible: no había ninguna que conservar. Se genera una aleatoria de 28 caracteres, se escribe en el Secret grafana-admin y se resetea la de Grafana para que coincidan (leyendo del secret por stdin: nunca pasa por argv ni se imprime). La cuenta queda como acceso de emergencia; nadie tiene que memorizarla. Para leerla: kubectl get secret grafana-admin -n monitoring \ -o jsonpath='{.data.admin-password}' | base64 -d; echo El secret se crea FUERA del chart y se referencia con grafana.admin.existingSecret, en vez de parchear el secret que genera Helm: con adminPassword en values, el siguiente upgrade lo habría revertido a "admin". Es la misma trampa que el montaje del alerting de hace un rato, y por eso adminPassword desaparece de git. Verificado por el camino real y no por deducción: creando un ConfigMap de prueba con la etiqueta grafana_dashboard, el sidecar escribe el fichero y la recarga responde 200 OK "Dashboards config reloaded" — antes 401. ConfigMap de prueba eliminado. Grafana sano tras el rollout (database ok, 12.4.2), las 5 reglas de alerta provisionadas siguen activas, 25 dashboards y los 3 ficheros de alerting en su sitio. Co-Authored-By: Claude Opus 4.8 --- monitoring/values-kube-prometheus-stack.yaml | 25 ++++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/monitoring/values-kube-prometheus-stack.yaml b/monitoring/values-kube-prometheus-stack.yaml index d1505a1..5337b90 100644 --- a/monitoring/values-kube-prometheus-stack.yaml +++ b/monitoring/values-kube-prometheus-stack.yaml @@ -1,9 +1,7 @@ # Valores del release Helm kube-prometheus-stack (chart 83.2.0, ns monitoring). # -# Este namespace NO está bajo ArgoCD: se gestiona a mano. Hasta el 2026-07-21 -# estos valores solo vivían dentro del release, así que no había forma de saber -# cómo estaba configurado sin interrogar a Helm. Este fichero es la fuente de -# verdad; para aplicarlo: +# 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 @@ -14,11 +12,17 @@ # 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, que conserva lo que no aparece en ninguno de los -# dos renders. Un `helm upgrade --force`, un `kubectl replace` desde el chart, -# o reconstruir el release desde este fichero se habrían llevado por delante -# TODO el alerting de Grafana, en silencio y sin que los paneles se inmutaran. -# Declarado en el chart, el spec resultante es idéntico (no reinició Grafana). +# 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 alertmanager: enabled: false defaultRules: @@ -28,7 +32,8 @@ defaultRules: rules: alertmanager: false grafana: - adminPassword: admin + admin: + existingSecret: grafana-admin extraConfigmapMounts: - configMap: grafana-alerting mountPath: /etc/grafana/provisioning/alerting