如何正确配置K8s上的Grafana使用MySQL并解决登录401异常问题
问题根因分析与解决方案
疑问1解答:paths配置是否需要关联MySQL
- 完全不需要,paths下的所有路径都是Grafana实例本地文件系统的路径,和后端数据库无关联:
- data目录用于存储本地缓存、临时文件、插件运行产生的本地数据等
- provisioning目录用于存储预配置的数据源、仪表盘、告警规则等YAML配置文件
- 只要保证K8s Pod中这两个路径对Grafana运行用户有可读(provisioning)、可读写(data)权限即可,无需修改。
登录异常问题排查与修复
你当前的配置存在多处常见错误,优先修复以下核心问题后再验证:
修正ini配置格式
Grafana使用的ini配置要求所有配置块([paths]、[server]、[database]等)必须顶格书写,你当前贴出的配置里[server]、[security]等块前有缩进,会导致Grafana无法正确识别配置块,后续参数全部不生效。
补全MySQL连接参数
Grafana依赖Go语言的MySQL驱动,必须开启parseTime=true参数才能正确解析时间类型数据,否则会导致session有效期、用户登录状态等时间字段解析错误,直接触发401未授权、登录后被踢的问题。
修改[database]配置如下:
[database] type = mysql host = mydb-host:3306 name = grafana_db user = grafana password = grafanapasswd # 新增以下参数 url = mysql://grafana:grafanapasswd@mydb-host:3306/grafana_db?parseTime=true&loc=Local max_open_conn = 100 max_idle_conn = 20 conn_max_lifetime = 14400
如果你使用的是MySQL 8.0版本,还要确认grafana数据库用户的认证方式为mysql_native_password,Grafana 7.0.5内置的驱动不支持8.0默认的caching_sha2_password认证,执行以下SQL修改:
ALTER USER 'grafana'@'%' IDENTIFIED WITH mysql_native_password BY 'grafanapasswd'; FLUSH PRIVILEGES;
修正server相关配置
你当前配置的domain = localhost仅适用于本地访问的场景,K8s部署的Grafana需要将domain和root_url改为你实际访问Grafana的公网/集群内网域名,否则cookie的作用域配置错误,浏览器不会存储登录session cookie,导致登录状态无效:
[server] # 替换为你实际访问的域名,比如grafana.example.com domain = grafana.example.com root_url = %(protocol)s://%(domain)s/grafana serve_from_sub_path = true
同时根据你实际访问的协议调整cookie_secure参数:如果用HTTPS访问则设为true,HTTP访问则设为false。
其他排查方向
如果以上修改后仍有问题,按以下优先级排查:
- 确认Grafana部署的副本数:如果是多副本部署,检查
[session]配置块的provider参数是否为database(7.x版本默认就是database,如果手动改成了file会导致多副本间session不共享,请求漂移到其他副本就会401) - 检查MySQL数据库的grafana用户权限:确认除了CREATE权限外,还有SELECT、INSERT、UPDATE、DELETE权限,否则session数据无法写入数据库
- 查看Grafana Pod的运行日志,搜索
login、session、mysql相关的报错,可直接定位具体失败原因 - 确认Grafana实例和MySQL实例的时区配置一致,避免session过期时间计算错误导致登录状态提前失效
内容的提问来源于stack exchange,提问作者gedit
相关产品推荐
相关产品推荐

