Nginx Ingress子路径暴露Grafana失败:无法加载应用文件求助
核心问题拆解
出现"If you're seeing this Grafana has failed to load its application files"错误,本质是Grafana静态资源请求路径不匹配,或者Ingress转发逻辑错误,结合你用的helm版本,具体原因如下:
1. Grafana根路径配置缺失
kube-prometheus-stack的values.yaml里,必须同时设置root_url和serve_from_subpath两个参数。比如你要通过/grafana子路径访问,需添加:
grafana: grafana.ini: server: root_url: "%(protocol)s://%(domain)s:/grafana/" serve_from_subpath: true
没开serve_from_subpath: true的话,Grafana会把静态资源请求指向根路径(比如/static/js/app.xxx.js),而非子路径下的/grafana/static/js/app.xxx.js,直接导致404。
2. Ingress路径重写配置错误
ingress-nginx需要正确配置路径转发规则,确保/grafana/*的请求能正确映射到Grafana服务的根路径。在kube-prometheus-stack的values里需配置:
grafana: ingress: enabled: true path: /grafana(/|$)(.*) pathType: Prefix annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/configuration-snippet: | proxy_set_header X-Forwarded-Prefix /grafana;
缺少rewrite-target和正则路径的话,Ingress会把完整的/grafana路径传给Grafana,而Grafana默认监听根路径,自然找不到对应资源。
3. Helm版本适配问题
你用的kube-prometheus-stack-41.7.3对应的Grafana版本对serve_from_subpath的依赖更严格,必须明确开启。另外ingress-nginx-4.3.0的正则分组规则要和rewrite-target匹配,比如路径/grafana(/|$)(.*)对应/$2,不能写错分组序号。
4. 浏览器缓存干扰
浏览器可能缓存了旧的静态资源路径,即使配置正确也会加载失败。直接清缓存或者用隐身模式访问测试即可排除。
快速验证方法
- 查看Grafana pod日志,搜是否有静态资源的404请求记录
- 进入Grafana pod,检查
/etc/grafana/grafana.ini里的root_url和serve_from_subpath配置是否生效 - 用
kubectl describe ingress <grafana-ingress-name>查看Ingress规则和注解是否正确
内容的提问来源于stack exchange,提问作者J-Are

