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 <noreply@anthropic.com>
78 lines
2.7 KiB
YAML
78 lines
2.7 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
|
|
alertmanager:
|
|
enabled: false
|
|
defaultRules:
|
|
create: true
|
|
disabled:
|
|
PrometheusNotConnectedToAlertmanagers: true
|
|
rules:
|
|
alertmanager: false
|
|
grafana:
|
|
admin:
|
|
existingSecret: grafana-admin
|
|
extraConfigmapMounts:
|
|
- configMap: grafana-alerting
|
|
mountPath: /etc/grafana/provisioning/alerting
|
|
name: grafana-alerting
|
|
grafana.ini:
|
|
server:
|
|
root_url: https://grafana.chemavx.xyz
|
|
ingress:
|
|
annotations:
|
|
cert-manager.io/cluster-issuer: letsencrypt-prod
|
|
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
|
|
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
|