はじめに
Prometheusのデータは,障害発生時の調査トラブルシューティングにおいて重要な情報源です.
そのため,定期的にバックアップをしておくことが重要です.
この記事では,PrometheusがKubernetes上で動いている環境を前提にPrometheusの管理APIを使ってスナップショットを作成し,バックアップとして活用する方法を紹介します.
スナップショットとは,Prometheusの時系列データの状態を保存する仕組みであり,データのバックアップやリストアに利用できます.
前提条件
- Kubernetesクラスタが動作していること
- PrometheusがKubernetes上で稼働していること
-
kubectlコマンドでクラスタにアクセス可能であること
環境構成
| 項目 | 内容 |
|---|---|
| OS | Ubuntu 24.04.2 LTS |
| Prometheus バージョン | 2.53.1 |
| Namespace | monitoring |
| Pod名 | prometheus-865cf687cf-pnzkl |
| ポート | 9090 |
| VM台数 | 1 |
| CPU | 2 vCPUs |
| メモリ | 2GB |
実装手順
1. Admin APIの有効化
1-1 .Deploymentの修正
PrometheusのスナップショットAPIは,デフォルトでは無効化されています.
スナップショットを作成するために以下のように--web.enable-admin-apiをDeploymentに追加してください.
--web.enable-admin-apiは,Prometheusの管理用APIを有効にするオプションです.
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
containers:
- name: prometheus
image: quay.io/prometheus/prometheus:v2.53.1
args:
- --config.file=/etc/prometheus/prometheus.yml
- --storage.tsdb.path=/prometheus
- --storage.tsdb.retention=31d
- --web.enable-admin-api # ←追加する
ports:
- containerPort: 9090
volumeMounts:
- name: config-volume
mountPath: /etc/prometheus
- name: data
mountPath: /prometheus
volumes:
- name: config-volume
configMap:
name: prometheus-config
- name: data
persistentVolumeClaim:
claimName: prometheus-pvc
1-2. 変更の適用
修正したyamlファイルをapplyして適用させます.
$ kubectl apply -f prometheus-deployment.yaml
deployment.apps/prometheus unchanged
$
2. APIの動作確認
2-1. Podの動作確認
まずは,PrometheusのPodが起動していることを確認します.
$ kubectl get pods -n monitoring
NAME READY STATUS RESTARTS AGE
prometheus-865cf687cf-pnzkl 1/1 Running 0 4m31s
$
- READYが1/1になっていれば,Podは正常に稼働しています.
- PodのSTATUSがRunningになっていることも確認してください.
2-2. Podへのポートフォワード
ローカルからポートフォワードを設定し、APIを叩いて確認します。
$ kubectl port-forward -n monitoring prometheus-865cf687cf-pnzkl 9090:9090
Forwarding from 127.0.0.1:9090 -> 9090
Forwarding from [::1]:9090 -> 9090
Handling connection for 9090
2-3. スナップショットの作成
APIが有効化されていれば,以下のような出力になります.
$ curl -XPOST http://127.0.0.1:9090/api/v1/admin/tsdb/snapshot
{"status":"success","data":{"name":"20251103T032528Z-3674418c9e2c5b60"}}
$
- スナップショットのデータは,
/prometheus/snapshotsに作成されます.
API無効時のエラー
- deployment.yamlに
--web.enable-admin-apiが指定されていない場合は以下のようなエラーが出力されます.
$ curl -XPOST http://127.0.0.1:9090/api/v1/admin/tsdb/snapshot
{"status":"error","errorType":"unavailable","error":"admin APIs disabled"}
$
- この場合はdeployment.yamlに
--web.enable-admin-apiを追加できていない可能性があるため,deployment.yamlを確認してください.追加した後は再度デプロイする必要があります.
2-4. Pod内で確認
以下のコマンドを実行し,スナップショットが作成されたことを確認します.
$ kubectl exec -it -n monitoring prometheus-865cf687cf-pnzkl -- sh -c "cd /prometheus/snapshots && exec sh"
$
$ ls
20251103T032528Z-3674418c9e2c5b60
$
-
20251103T032528Z-3674418c9e2c5b60という名前で保存されていることが分かります.
3. CronJobによる自動バックアップの設定
スナップショットの作成を自動化するために,Cronjobを作成します.
3-1. CronJobの作成
apiVersion: batch/v1
kind: CronJob
metadata:
name: prometheus-backup
namespace: monitoring
spec:
schedule: "0 3 * * *" # 毎日3時に実行
jobTemplate:
spec:
template:
spec:
containers:
- name: snapshot
image: curlimages/curl:8.6.0
args:
- -XPOST
- http://prometheus.monitoring.svc.cluster.local:9090/api/v1/admin/tsdb/snapshot
restartPolicy: OnFailure
- このCronJobでは,毎日3次にPrometheusのスナップショットを作成します.
- スナップショットは,Prometheusのデータディレクトリに保存されます.
- 必要に応じて,作成したスナップショットを外部ストレージにコピーする処理の追加が可能です.
3-2. 適用
作成したyamlファイルをapplyして適用させます.
$ kubectl apply -f prometheus-cronjob.yaml -n monitoring
cronjob.batch/prometheus-backup created
$
4. CronJobの動作確認
4-1. CronJobの一覧の確認
$ kubectl get cronjobs -n monitoring
NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
prometheus-backup 0 3 * * * <none> False 0 <none> 52s
$
4-2. 手動で実行
テストのため,手動でJobを起動します.
$ kubectl create job --from=cronjob/prometheus-backup test-snapshot -n monitoring
]job.batch/test-snapshot created
$
| 項目 | 内容 |
|---|---|
| コマンド | kubectl create job |
| CronJob | /prometheus-backup |
| 作成されるJob名 | test-snapshot |
| 名前空間 | monitoring |
4-3. ログの確認
$ kubectl logs job/test-snapshot -n monitoring
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 72 100 72 0 0 737 0 --:--:-- --:--:-- --:--:-- 742
{"status":"success","data":{"name":"20251102T042203Z-73dd195e362d42a7"}}
$
5. スナップショットの確認
Podから作成されたスナップショットを確認します.
$ kubectl exec -n monitoring -it prometheus-865cf687cf-pnzkl -- ls /prometheus/snapshots
20251102T042203Z-73dd195e362d42a7
$
- 先ほど作成された
20251102T042203Z-73dd195e362d42a7があることが分かります.
6. バックアップのローカル取得
6-1. ローカルへコピー
必要に応じて,作成されたスナップショットをローカルへコピーします.
$ kubectl cp -n monitoring prometheus-865cf687cf-pnzkl:/prometheus/snapshots ./snapshots
tar: removing leading '/' from member names
$
| 項目 | 内容 |
|---|---|
| コピーコマンド | kubectl cp |
| 名前空間 | monitoring |
| コピー元(Pod内のパス) | prometheus-865cf687cf-pnzkl:/prometheus/snapshots |
| コピー先(ローカルパス) | ./snapshots |
6-2. コピーの確認
$ ls ~/Prometheus/snapshots
20251102T042203Z-73dd195e362d42a7
$
- ローカルにコピーされていれば成功です.
おわりに
今回は,PrometheusのバックアップをKubernetes上で自動化する方法を紹介しました.Admin APIを利用したスナップショットの取得とCronJobによる定期的な実行を組み合わせることで,手動でのバックアップ作業を減らし,継続的にバックアップを取得することができます.
今後の発展としては,以下のような方向性が考えられます.
- スナップショットを外部ストレージへ自動転送
- 古いスナップショットの削除
- 取得したスナップショットからのリストア
これにより,Prometheusのデータの保護と運用の信頼性を高めることができます.