目前我们 k8s 集群的Grafana使用 ceph 作为持久化存储,一但我将 Grafana 的Deployment 删除重建之后,之前的所有数据都会丢失,重建的 PV 会映射到后端存储的新位置。万幸的是,我真的手欠重建了,还没有提前备份。。。万幸个鬼啊我。
在我历经 250 分钟重建 Dashboard 之后,心里久久不能平静,一句 MMP 差点就要脱口而出。

1. 低级方案

再这样下去我真的要变成 250 了,这怎么能忍,立马打开 Google 研究了一把 Grafana 备份的各种骚操作,发现大部分备份方案都是通过shell脚本调用 Grafana 的API来导出各种配置。备份脚本大部分都集中在这个 gist 中:
https://gist.github.com/crisidev/bd52bdcc7f029be2f295[1]
我挑选出几个比较好用的,大家也可以自行挑选其他的。

导出脚本

#!/bin/bash #Usage: # #export_grafana_dashboards.shhttps://admin:REDACTED@grafana.dedevsecops.com create_slug(){ echo"$1"|iconv-tascii//TRANSLIT|sed-rs/[^a-zA-Z0-9]+/-/g|sed-rs/^-+\|-+$//g|trA-Za-z } full_url=$1 username=$(echo"${full_url}"|cut-d/-f3|cut-d:-f1) base_url=$(echo"${full_url}"|cut-d@-f2) folder=$(create_slug"${username}-${base_url}") mkdir"${folder}" fordb_uidin$(curl-s"${full_url}/api/search"|jq-r.[].uid);do db_json=$(curl-s"${full_url}/api/dashboards/uid/${db_uid}") db_slug=$(echo"${db_json}"|jq-r.meta.slug) db_title=$(echo"${db_json}"|jq-r.dashboard.title) filename="${folder}/${db_slug}.json" echo"Exporting\"${db_title}\"to\"${filename}\"..." echo"${db_json}"|jq-r.>"${filename}" done echo"Done"
这个脚本比较简单,直接导出了所有 Dashboard 的json配置,也没有标记目录信息,如果你用它导出的配置来恢复 Grafana,所有的 Dashboard 都会导入到 Grafana 的General目录下,不太友好。

导入脚本

grafana-dashboard-importer.sh
#!/bin/bash # #addthe"-x"optiontotheshebanglineifyouwantamoreverboseoutput # # OPTSPEC=":hp:t:k:" show_help(){ cat