Kubernetes部署Grafana时仪表盘配置失败求助
核心错误分析
错误信息明确显示:
lvl=eror msg="Server shutdown" logger=server error="*provisioning.ProvisioningServiceImpl run error: Failed to create provisioner: Failed to read dashboards config: could not parse provisioning config file: dashboards.yaml error: read /etc/grafana/provisioning/dashboards/dashboards.yaml: is a directory"
问题本质是:Grafana尝试读取/etc/grafana/provisioning/dashboards/dashboards.yaml作为配置文件,但该路径实际是一个目录,导致配置解析失败,服务启动终止。
具体问题点及修复步骤
1. 解决挂载路径冲突
你的Deployment中,首先通过grafana-pv将PVC的provisioning子目录挂载到了/etc/grafana/provisioning,这意味着该目录下的dashboards子目录完全由PVC存储内容控制。后续你又尝试将grafana-dashboards ConfigMap中的dashboards.yml挂载到/etc/grafana/provisioning/dashboards/dashboards.yml,如果PVC的provisioning/dashboards目录下已存在名为dashboards.yaml的目录(Grafana会自动扫描该目录下的.yaml/.yml文件作为配置),就会触发这个错误。
修复后的Deployment挂载配置:
将PVC挂载到Grafana的数据存储目录(而非配置目录),避免覆盖配置目录的原有结构:
volumeMounts: # 将PVC挂载到Grafana数据目录,而非配置目录 - mountPath: /var/lib/grafana name: grafana-pv - mountPath: '/etc/grafana/grafana.ini' name: grafana-ini - mountPath: '/etc/grafana/provisioning/dashboards/dashboards.yml' name: grafana-dashboards subPath: dashboards.yml - mountPath: '/etc/grafana/provisioning/dashboards/Home.json' name: grafana-home subPath: Home.json
2. 修正dashboards.yml的格式错误
你的grafana-dashboards ConfigMap中的配置文件错误使用了JSON风格的大括号{},且存在语法缺失(YAML格式不需要大括号,且键值对后需正确换行),这会导致Grafana解析失败。
修复后的dashboards.yml内容:
apiVersion: 1 providers: # Folders - name: 'test1Status' folder: 'test1Status' folderUid: 'test1' options: path: /etc/grafana/provisioning/dashboards/test1 - name: 'test2Status' folder: 'test2Status' folderUid: 'test2' options: path: /etc/grafana/provisioning/dashboards/test2 # Separate dashboards (General folder) - name: 'Versions info' options: path: /etc/grafana/provisioning/dashboards/Versions-info.json - name: 'Home' options: path: /etc/grafana/provisioning/dashboards/Home.json - name: 'Namespaces' options: path: /etc/grafana/provisioning/dashboards/Namespaces.json
3. 确保配置的目录存在
在dashboards.yml中配置的test1、test2目录需要在容器中存在,否则Grafana会触发目录不存在的错误。可以通过添加initContainer创建这些目录:
# 在Deployment的spec.template.spec下添加initContainer initContainers: - name: create-dashboard-directories image: busybox:latest command: ['mkdir', '-p', '/etc/grafana/provisioning/dashboards/test1', '/etc/grafana/provisioning/dashboards/test2'] volumeMounts: - mountPath: /etc/grafana/provisioning/dashboards name: dashboards-temp-dir # 在volumes下添加临时卷 volumes: - name: dashboards-temp-dir emptyDir: {}
4. 统一配置文件后缀
Grafana会扫描provisioning/dashboards下的.yaml和.yml文件,确保你的配置文件后缀一致,避免出现同名的目录和文件(比如不要同时存在dashboards.yaml目录和dashboards.yml文件)。
验证修复
- 更新ConfigMap:
kubectl apply -f grafana-dashboards-configmap.yaml
- 更新Deployment:
kubectl apply -f grafana-deployment.yaml
- 查看Pod日志确认错误消失:
kubectl logs <grafana-pod-name>
内容的提问来源于stack exchange,提问作者Julia

