结果:已合并 (2026-10-17 01:16, grafana-community/helm-charts#896), 发布了 Chart grafana 14.0.1。 事实上,这些内容取自 GitHub 的 PR、检查和发布记录、Chart 源码(PR 的基础提交
71c86de1)、Grafana 官方文档以及 TT Lab 仓库的提交记录。时间均为韩国时间(KST)。
目录
一句话总结
| PR | grafana-community/helm-charts#896 [grafana] Document that the admin password is only applied on first start |
| 修改内容 | Chart README 中新增 33 行的“Admin user and password”小节,Chart 版本 14.0.0 → 14.0.1 |
| 反应 | 无机器人评审。14 项检查全部通过,维护者留下“Thanks!”并批准 |
| 结果 | PR 公开 10-17 00:50 → 合并 01:16(26 分钟),28 秒后发布 grafana-14.0.1 |
1. 问题所在:我们遇到的现象
TT Lab 集群中的 Grafana 是作为 kube-prometheus-stack Chart 附带的 Grafana Chart 运行的。2026-09-24,我们将 values 文件中的管理员密码移除,改为引用 admin.existingSecret 的 Secret,因此需要记录更改密码的步骤。
问题就在这里卡住了。即使仅将 Secret 改为新值,Grafana 重新启动后, 也只能用旧密码登录。 并且,负责重新加载仪表盘和数据源的 sidecar 会使用 Secret 的新值来调用 Grafana,从而导致认证失败(基于 Chart 模板)。因此,我们在步骤中加入了“先在 Grafana 内部将密码改为
grafana cli ”的阶段。
遇到同样问题的人不在少数。在 Chart 迁移到新仓库之前的旧仓库中,曾多次出现过相同的报告(grafana/helm-charts#152、#3568、#3790),但在新仓库的 README 中依然没有这方面的说明。
2. 原因:文档和模板的哪一行
Chart 的行号基于 PR 的基础提交 71c86de1 。
- Grafana 只读取一次管理员密码。 配置文档中的
admin_password项将该值描述为“Set once on first-run”。Chart 会将此值传递为GF_SECURITY_ADMIN_PASSWORD环境变量,如果数据库在重启后得以保留(持久卷或外部数据库),则从第二次启动开始将不再使用此变量。 - Sidecar 使用 Secret 的值进行身份验证。
templates/_pod.tpl会为每个 sidecar 从同一个 Secret 中提取REQ_USERNAME·REQ_PASSWORD并进行设置。一旦 Secret 与数据库不一致,sidecar 的 reload 调用就会收到401。 - 如果留空,Chart 生成的随机值将依赖于
lookup。templates/_helpers.tpl第 131–138 行 的grafana.password将集群中的 Secret 读取为lookup并使用该值,如果不存在则生成一个 40 位的随机值。在使用helm template进行渲染的工具(如 Argo CD 等)中,lookup不会返回任何内容,因此每次渲染时都会产生一个新值。
实际测量
在编写 PR 之前,我们没有盲目相信文档文字,而是进行了实际测量。我们在 TT Lab 集群中预先拉取的 Grafana 13.2.0 镜像上启动了一个临时 Pod,并在重启后依然保留的 sqlite 数据目录上检查了 GET /api/user 的响应代码。
| 阶段 | pw-one |
pw-two |
|---|---|---|
首次启动,环境变量 pw-one |
200 | 401 |
使用相同数据重启,环境变量 pw-two |
200 | 401 |
要放入 README 的 grafana cli … reset-admin-password --password-from-stdin 作为 pw-two |
401 | 200 |
helm template(Helm v3.18.2) 在adminPassword不加修改地运行两次,admin-password的值每次都不一样,而加上--set adminPassword=x则完全相同。- Chart 的基础镜像(13.2.4-distroless)虽然没有 Shell,但由于
/usr/share/grafana/bin位于PATH中,因此可以通过kubectl exec直接调用grafana cli,并且 Chart 中配置了GF_PATHS_DATA,使得 CLI 可以打开与服务器相同的数据库。这一点也已经过验证并写在了 PR 正文中。 - Sidecar 的
401是根据模板和上述实际测量得出的结论,并非通过 Sidecar 日志直接看到(未实际测量)。
3. 修改内容:diff 要点
在 Chart README 的原有小节之间插入了“Admin user and password”小节,并按照仓库规则,仅修改文档也提升了 Chart 版本。
-version: 14.0.0
+version: 14.0.1
+## Admin user and password
+...
+Grafana reads these variables only when it creates the admin user, that is on the first
+start with an empty database. When the database survives pod restarts ...
+- Changing `adminPassword`, or the password in `admin.existingSecret`, and running
+ `helm upgrade` restarts the pod but does not change the password stored in the database.
+- The sidecars ... call the Grafana reload API with the user and password from the same
+ Secret. Once the Secret and the database disagree, these calls fail with `401 Unauthorized`.
+- When neither `adminPassword` nor `admin.existingSecret` is set, ... `lookup` ...
+To rotate the password of a running installation, change it in Grafana first and then
+update the Secret (or `adminPassword`) to the same value:
修改密码的命令采用了通过标准输入传递的形式(避免值留在 Shell 历史记录或进程参数中)--password-from-stdin),并写在其中。
PR 正文中写明了修改内容及原因、上述实测结果、旧仓库的问题链接,以及“仅修改文档,未添加 helm-unittest”的说明,
并且勾选了模板中的所有检查项(DCO 签名、提升 Chart 版本、标题中的 [grafana] 前缀)。正文末尾添加了一句话,说明是在 AI 的帮助下编写并经过了亲自审查。
4. 响应:26 分钟
| 时间(10-17) | 日 |
|---|---|
| 00:35 | 提交(DCO 签名·SSH 签名) |
| 00:50 | 公开 PR |
| 00:50 ~ | 检查:Chart 测试、生成文件、标题、DCO、9 个集成测试、Super Linter — 全部 14 项通过 |
| 01:14 | 维护者评论 “Thanks!” |
| 01:16 | 批准,5 秒后合并 |
| 01:16 | 合并 28 秒后 grafana-14.0.1 发布 |
与 SeaweedFS 不同,这次没有审查机器人,维护者也只说了一个词。这意味着没有什么需要修改的地方。我们无需采取任何额外行动。
5. 收获:开源贡献技巧
- 迁移后的仓库中还留存着旧的问题。 随着 Chart 迁移到新组织,旧仓库中的报告并未反映到新的 README 中。 如果在正文中关联旧的问题编号,维护者就会立刻明白这并非“某个人的抱怨”,而是“一个存在已久已知的问题”。
- 将文档的一行文字与一个响应代码表放在一起。 “Set once on first-run”虽然准确但很简短。200/401 表格展示了这句话在实际运维中到底意味着什么。
- 放入 README 的命令要亲自运行测试。 确认了 distroless 镜像中的
grafana cli是否在PATH中、是否打开了相同的数据库之后才写下来。如果读者复制并粘贴的命令是错的,那么文档还不如没有。 - 首先符合仓库的规则。 仅修改文档也要提升 Chart 版本的规则、标题前缀、DCO 签名。填满所有检查项的 PR 可以让维护者需要确认的内容减少。这一次,合并和发布都是自动进行的。
- 将同样的陷阱写进我们的运维文档中。 上游文档是面向所有人的,而运维流程则必须能够在 TT Lab 集群中完全照做。本次 PR 的重启顺序(先 Grafana,后 Secret)早就存在于我们的运维流程中了。
Titi 的话。 密码是个只在第一次记住的朋友。就算你换了小纸条(Secret),它的记忆也不会变,所以必须先直接告诉朋友新密码,然后再去换小纸条。把这个写进文档后,仅仅 26 分钟就收到了“谢谢!”。
链接
所有资料查阅于 2026-10-17。
- PR: grafana-community/helm-charts#896 (合并提交
e45de0a3) - 发布: grafana-14.0.1
- Grafana 配置文档
admin_password: https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#admin_password - Grafana CLI 重置管理员密码: https://grafana.com/docs/grafana/latest/administration/cli/#reset-admin-password
- 旧仓库的报告: grafana/helm-charts#152
- Chart 源码(基础提交):
templates/_pod.tpl,templates/_helpers.tpl