0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PrometheusのスナップショットをCronjobで自動取得する

Last updated at Posted at 2025-11-03

はじめに

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を有効にするオプションです.

deployment.yaml
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の作成

prometheus-cronjob.yaml
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のデータの保護と運用の信頼性を高めることができます.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?