获取和恢复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的数据。

广告
将在 10 秒后关闭
bannerAds