该文章随时会有校正更新,公众号无法更新,欢迎订阅博客查看最新内容:https://fuckcloudnative.io
前言
目前我们 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.sh https://admin:REDACTED@grafana.dedevsecops.com create_slug () { echo "$1" | iconv -t ascii//TRANSLIT | sed -r s/[^a-zA-Z0-9]+/-/g | sed -r s/^-+\|-+$//g | tr A-Z a-z } full_url=$1 username=$(echo "${full_url}" | cut -d/ -f 3 | cut -d: -f 1) base_url=$(echo "${full_url}" | cut -d@ -f 2) folder=$(create_slug "${username}-${base_url}") mkdir "${folder}" for db_uid in $(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"