获取和恢复Prometheus的备份
在容器中启动Prometheus并备份数据的要点有三个。
-
- Prometheusのデータは/prometheusに保存されている。
-
- PrometheusのTSDB (time series database)のAdminAPIには、”snapshot”という機能があり、/prometheusのある時刻での断面を取得できる
- 新規Prometheusが起動したら、/prometheusごとスナップショットを上書きすることでリカバリできる
我正在参考以下文章。
https://prometheus.io/docs/prometheus/latest/querying/api/#snapshot -> 请访问该链接以获取关于 Prometheus 快照功能的最新API文档。
https://prometheus.io/docs/operating/security/ -> 请参考该链接以获取关于 Prometheus 安全性操作的文档。
https://devopstales.github.io/home/backup-and-retore-prometheus/ -> 请参考该链接以了解有关备份和还原 Prometheus 的操作的详细信息。
验证环境如下。
-
- Prometheus 2.23.0
- Kubernetes 1.20
以下是詳細步驟。
启用管理员API
假设Prometheus在Kubernetes集群中作为部署正在运行。请确认数据目录/prometheus已经通过PersistentVolume等方式持久化保存。(如果没有确认,执行以下操作将会导致数据丢失)
首先,我們需要檢查Admin API是否已啟用。通過以下命令檢查Deployment,如果沒有”- –web.enable-admin-api”這一行,就需要添加它,然後保存並退出。這樣Deployment就會更新完成。
$ kubectl edit deploy prometheus
spec:
containers:
- args:
- --config.file=/etc/prometheus/prometheus.yml
- --storage.tsdb.path=/prometheus
- --storage.tsdb.retention.time=30d
- --web.console.libraries=/usr/share/prometheus/console_libraries
- --web.console.templates=/usr/share/prometheus/consoles
+ - --web.enable-admin-api
image: prom/prometheus:v2.23.0
Pod将自动重新启动,从而启用Admin API。
在进行有效化之前,即使执行管理员API也会返回404页面未找到。
使用“快照”API创建备份。
接下来,我们将使用 Prometheus 的 API 进行端口转发等操作进行连接。
$ kubectl port-forward svc/<prometheusのService名> 9090:9090 &
$ curl -XPOST http://localhost:9090/api/v1/admin/tsdb/snapshot
│{"status":"success","data":{"name":"20210106T080347Z-0af2560383d17909"}}
$ bg
(Ctrl+cでport-forwardを終了)
使用以下命令可以确认在/prometheus/snapshots路径下存在与API返回值的名称相同的备份目录。
$ kubectl exec prometheus-5fd8f7f855-hnhvd -- ls /prometheus/snapshots -lt
total 4
drwxr-xr-x 8 nobody nogroup 4096 Jan 6 08:03 20210106T080347Z-0af2560383d17909
将备份从容器内移到其他地方。
将之前确认过的目录全部复制到终端上。
mkdir backup-prometheus
kubectl cp prometheus-5fd8f7f855-hnhvd:/prometheus/snapshots/20210106T080347Z-0af2560383d17909 ./backup-prometheus
我要确认里面是有东西的。
ls backup-prometheus
01EV938GHBWTFM8ZMTWDWA1FTK 01EVAT6A9S7CV7SGD6HAJHK4WX 01EVAT6AMWFF76KPXWEN14VG23 01EVB121HNVRERS45KPTXXNSA8 01EVB7XRSQZ9WQ57ECD17DV548 01EVBBJ9TQ0XVHGGN5BQ7FD3GJ
将数据恢复到新的Prometheus服务器上。
启动新的Prometheus。
删除Prometheus上的现有文件夹。
kubectl exec -it prometheus-57df548d7c-tvx4d -- /bin/sh -c "rm -rf /prometheus/*"
将备份(快照)复制到Prometheus容器内。
kubectl cp ./backup-prometheus prometheus-57df548d7c-tvx4d:/prometheus/
kubectl exec -it prometheus-57df548d7c-tvx4d -- /bin/sh -c "mv /prometheus/backup-prometheus/* /prometheus/"
如果数据没有被恢复,建议停止并重新创建容器。
kubectl delete pod prometheus-57df548d7c-tvx4d
通过这个方式,Prometheus容器已经使用新的名称重新启动,并且数据已经恢复。
总结
通过快照API备份了/prometheus文件夹,并使用kubectl cp将其导出,然后通过kubectl cp将其导入到新创建的Prometheus,从而备份和恢复了Prometheus的数据。