Grafana Operator(integreatly.org/v1alpha1)创建 Dashboard 指定目录说明

1. 背景

在 Kubernetes 环境中,如果通过 Grafana Operator 管理 Dashboard,通常使用:

apiVersion: integreatly.org/v1alpha1
kind: GrafanaDashboard

该方式通过 Kubernetes CR(Custom Resource)声明式管理 Grafana Dashboard。

默认情况下,如果不指定目录,Dashboard 通常会进入 Grafana 默认目录。

integreatly.org/v1alpha1 版本可以通过 spec.customFolderName 指定 Dashboard 所属 Folder。


2. 指定 Dashboard 目录

示例:

apiVersion: integreatly.org/v1alpha1
kind: GrafanaDashboard

metadata:
  name: insight-grafana-dashboard-redis-instance
  namespace: insight-system
  labels:
    operator.insight.io/managed-by: insight

spec:
  customFolderName: "Middleware"

  json: |-
    {
      "title": "Redis Instance Dashboard",
      "uid": "redis-instance",
      "schemaVersion": 39,
      "version": 1,
      "panels": []
    }

创建后 Grafana 目录结构:

Dashboards
└── Middleware
    └── Redis Instance Dashboard

3. 多级目录

Grafana 支持通过 / 创建多级目录:

spec:
  customFolderName: "Middleware/Redis"

效果:

Dashboards

└── Middleware
    └── Redis
        └── Redis Instance Dashboard

4. 使用 ConfigMap 管理 Dashboard JSON

生产环境推荐将 Dashboard JSON 独立保存到 ConfigMap。

ConfigMap

apiVersion: v1
kind: ConfigMap

metadata:
  name: redis-dashboard-json
  namespace: insight-system

data:
  redis-dashboard.json: |-
    {
      "title": "Redis Instance Dashboard",
      "uid": "redis-instance",
      "panels": []
    }

GrafanaDashboard

apiVersion: integreatly.org/v1alpha1
kind: GrafanaDashboard

metadata:
  name: redis-instance-dashboard
  namespace: insight-system

spec:
  customFolderName: "Middleware/Redis"

  configMapRef:
    name: redis-dashboard-json
    key: redis-dashboard.json

5. 验证配置

查看 Dashboard CR:

kubectl get grafanadashboard \
-n insight-system \
redis-instance-dashboard -o yaml

确认:

spec:
  customFolderName: Middleware/Redis

查看 Grafana Operator 日志:

kubectl logs -n <operator-namespace> \
deployment/grafana-operator

6. 常见问题

6.1 Dashboard 仍然显示在 General

检查字段位置。

正确:

spec:
  customFolderName: "Redis"

  json: |-

错误:

json:
  customFolderName: Redis

6.2 JSON 中配置 Folder 是否有效

无效:

{
  "title": "Redis Dashboard",
  "folder": "Redis"
}

原因:

Dashboard JSON 只负责 Dashboard 内容,例如:

  • Panel
  • Query
  • Variable
  • Annotation

Folder 属于 Grafana 元数据,由 Operator 创建 Dashboard 时处理。


6.3 修改目录后没有变化

如果 Dashboard 已经存在,修改:

customFolderName

可能不会移动已有 Dashboard。

建议删除后重新创建:

kubectl delete grafanadashboard \
redis-instance-dashboard \
-n insight-system

然后:

kubectl apply -f dashboard.yaml

7. 检查 CRD 是否支持

查看字段:

kubectl explain grafanadashboard.spec

或者:

kubectl get crd grafanadashboards.integreatly.org -o yaml \
| grep customFolderName

如果输出:

customFolderName

表示当前版本支持。


8. 推荐目录规划

Grafana

├── Kubernetes
│   ├── Cluster
│   ├── Node
│   ├── Pod
│   └── Ingress
│
├── Middleware
│   ├── Redis
│   ├── MySQL
│   ├── Kafka
│   └── Elasticsearch
│
├── Business
│   ├── EC
│   └── Delivery
│
└── Network
    ├── Zabbix
    └── NPM

示例:

spec:
  customFolderName: "Middleware/MySQL"

9. 总结

需求 配置


指定 Dashboard 目录 spec.customFolderName 一级目录 customFolderName: Redis 多级目录 customFolderName: Middleware/Redis JSON 中配置 Folder 不支持 生产环境推荐 ConfigMap + GrafanaDashboard

对于:

apiVersion: integreatly.org/v1alpha1
kind: GrafanaDashboard

直接增加:

spec:
  customFolderName: "Middleware/Redis"

即可实现 Dashboard 自动归档到指定 Grafana Folder。