#author("2026-05-11T06:01:35+00:00","default:sysosa","sysosa")
#author("2026-05-11T06:06:14+00:00","default:sysosa","sysosa")
cephの構成員osd HDDの管理は常時必要. 異常がでたら関知して、通知する仕組みを入れてみる

Prometheus: データの収集と蓄積を担う
-HDDの空き容量、読み書きのIOPS, エラーレート、OSDのUp/Down状態を蓄積する
-node-exporterを使えばCPU使用率、メモリ残量、ディスクIO、ネットワーク帯域、ロードアベレージも収集できる

Alertmanager: 通知の判断と配送役
-アラートを整理して無制限にメールを飛ばさない
-Sloackやメールに通知

PrometheusとAlertmanagerは共にcephからデプロイされます

まずはAlertmanagerを構築して、Gmailへテストメールが飛ぶことを確認します

***Alertmanagerの構築 [#sbf6d378]

Alertmanagerはコンテナとして用意されています。
#code(nonumber){{
[root@ceph-mgr ~]# ceph orch apply alertmanager --placement="ceph-mgr" --dry-run
 :
####################
SERVICESPEC PREVIEWS
####################
+--------------+--------------+----------+-------------+
|SERVICE       |NAME          |ADD_TO    |REMOVE_FROM  |
+--------------+--------------+----------+-------------+
|alertmanager  |alertmanager  |ceph-mgr  |             |
+--------------+--------------+----------+-------------+
 :
[root@ceph-mgr ~]# ceph orch apply alertmanager --placement="ceph-mgr" 

[root@ceph-mgr ~]# ceph orch ls alertmanager
NAME          PORTS        RUNNING  REFRESHED  AGE  PLACEMENT
alertmanager  ?:9093,9094      1/1  74s ago    97s  ceph-mgr

[root@ceph-mgr ~]# ceph orch ps ceph-mgr
NAME                   HOST      PORTS        STATUS         REFRESHED   AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID
alertmanager.ceph-mgr  ceph-mgr  *:9093,9094  running (98s)    97s ago  107s    15.2M        -  0.28.1   91c01b3cec9b  2bca804e1112
crash.ceph-mgr         ceph-mgr               running (45m)    97s ago    3w    19.2M        -  20.2.1   fb63cba66eea  ed24078efa6d
mgr.ceph-mgr.nwgopq    ceph-mgr  *:8443,8765  running (45m)    97s ago    3w     633M        -  20.2.1   fb63cba66eea  d8361cc56882
[root@ceph-mgr ~]#
}}
次にメール設定を行います

#code(nonumber){{
[root@ceph-mgr ~]# cat alertmanager.yml
global:
  smtp_smarthost: 'smtp.gmail.com:587'
  smtp_from: 'xxxxxxxxxxxxxxxxxxxxxxxx@gmail.com'
  smtp_auth_username: 'xxxxxxxxxxxxxxxxxxxxxxxx@gmail.com'
  smtp_auth_password: 'aaaabbbbccccdddd'
  smtp_require_tls: true

route:
  receiver: 'gmail-notice'
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 3h

receivers:
  - name: 'gmail-notice'
    email_configs:
      - to: 'xxxxxxxxxxxxxxxxxxxxxxxx@gmail.com'
        send_resolved: true

[root@ceph-mgr ~]# ceph config-key set mgr/cephadm/services/alertmanager/alertmanager.yml -i alertmanager.yml

[root@ceph-mgr ~]# ceph orch redeploy alertmanager

(確認)
[root@ceph-mgr ~]# curl -s http://localhost:9093/api/v2/status | jq -r .config.original     <-- smtp.gmail.comがあるか確認します
}}

テストメールを投じてみます. ceph-mgrにて
#code(nonumber){{
[root@ceph-mgr ~]# curl -X POST http://localhost:9093/api/v2/alerts \
  -H "Content-Type: application/json" \
  -d '[
    {
      "labels": {
        "alertname": "TestAlert",
        "severity": "critical"
      },
      "annotations": {
        "summary": "Alertmanager mail test 1st",
        "description": "manual test"
      },
      "generatorURL": "http://localhost/test",
      "startsAt": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'",
      "endsAt": "'$(date -u -d "+10 minutes" +"%Y-%m-%dT%H:%M:%SZ")'"
    }
  ]'
[root@ceph-mgr ~]#
}}
通信設定が上手く行ってれば、下記のようなGmailが届きます
&ref(2026y05m06d_020054902.png,nolink,70%);


***Prometheus の構築 [#d297b151]

Alertmanagerと同様にコンテナで動きます
#code(nonumber){{
[root@ceph-mgr ~]# ceph orch apply prometheus --placement="ceph-mgr" --dry-run
 :
####################
SERVICESPEC PREVIEWS
####################
+------------+------------+----------+-------------+
|SERVICE     |NAME        |ADD_TO    |REMOVE_FROM  |
+------------+------------+----------+-------------+
|prometheus  |prometheus  |ceph-mgr  |             |
+------------+------------+----------+-------------+
 :
[root@ceph-mgr ~]# ceph orch apply prometheus --placement="ceph-mgr" 

[root@ceph-mgr ~]# ceph orch ps ceph-mgr
NAME                   HOST      PORTS        STATUS         REFRESHED  AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID
alertmanager.ceph-mgr  ceph-mgr  *:9093,9094  running (15m)     3m ago  39m    19.8M        -  0.28.1   91c01b3cec9b  73758e00d14c
crash.ceph-mgr         ceph-mgr               running (83m)     3m ago   3w    19.2M        -  20.2.1   fb63cba66eea  ed24078efa6d
mgr.ceph-mgr.nwgopq    ceph-mgr  *:8443,8765  running (83m)     3m ago   3w     614M        -  20.2.1   fb63cba66eea  d8361cc56882
prometheus.ceph-mgr    ceph-mgr  *:9095       running (3m)      3m ago   3m    27.4M        -  3.6.0    4fcecf061b74  4e9a9ce8ec2d

[root@ceph-mgr ~]# ceph orch ls prometheus
NAME        PORTS   RUNNING  REFRESHED  AGE  PLACEMENT
prometheus  ?:9095      1/1  3m ago     4m   ceph-mgr

[root@ceph-mgr ~]#
}}

どのような状態になれば Alertmanager に通知を依頼するかはPrometheus内で用意されているルールファイルに従う
その内容は http://ceph-mgr:9095 の上部メニュー「Status」->「Rule health」にある
&ref(2026y05m06d_103515724.png,nolink,70%);
あるいは prometheus のコンテナ内の/etc/prometheus/alerting/ceph_alerts.ymlに書かれている
ここでは cintainer idが「4e9a9ce8ec2d」なので
#code(nonumber){{
[root@ceph-mgr ~]# podman exec -it 4e9a9ce8ec2d cat /etc/prometheus/alerting/ceph_alerts.yml
}}
で閲覧できる.

***ハード障害を起こしてみる [#od11cc2a]
こちらは仮想マシンなのでいくらやっても大丈夫ですが、本番システムには適用しないように。。

osd hddの1つを停止してみる
#code(nonumber){{
[root@ceph-mgr ~]# ceph orch daemon stop osd.1
Scheduled to stop osd.1 on host 'ceph-osd01'

[root@ceph-mgr ~]#
[root@ceph-mgr ~]# ceph osd tree
ID   CLASS  WEIGHT   TYPE NAME            STATUS  REWEIGHT  PRI-AFF
 -1         0.29279  root default
 -3         0.09760      host ceph-osd01
  1    hdd  0.04880          osd.1          down   1.00000  1.00000
  0    ssd  0.04880          osd.0            up   1.00000  1.00000
 -7         0.09760      host ceph-osd02
  3    hdd  0.04880          osd.3            up   1.00000  1.00000
  2    ssd  0.04880          osd.2            up   1.00000  1.00000
-10         0.09760      host ceph-osd03
  5    hdd  0.04880          osd.5            up   1.00000  1.00000
  4    ssd  0.04880          osd.4            up   1.00000  1.00000
[root@ceph-mgr ~]#
[root@ceph-mgr ~]# ceph health
HEALTH_WARN 1 osds down; Degraded data redundancy: 8/90 objects degraded (8.889%), 7 pgs degraded

[root@ceph-mgr ~]#
}}
っでメールが届く
&ref(2026y05m06d_200205433.png,nolink,70%); &ref(2026y05m06d_200210662.png,nolink,70%);

っで復旧させてみる
#code(nonumber){{
[root@ceph-mgr ~]# ceph orch daemon start osd.1
Scheduled to start osd.1 on host 'ceph-osd01'
[root@ceph-mgr ~]#
}}

っでメールが届く
&ref(2026y05m06d_202802936.png,nolink,70%); &ref(2026y05m06d_202756816.png,nolink,70%);


***slackでも受け取りたい場合 [#c6f17f1a]

#code(nonumber){{
[root@ceph-mgr ~]# cat alertmanager.yml
global:
  smtp_smarthost: 'smtp.gmail.com:587'
  smtp_from: 'xxxxxxxxxxxxxxxxxxxxxxxx@gmail.com'
  smtp_auth_username: 'xxxxxxxxxxxxxxxxxxxxxxxx@gmail.com'
  smtp_auth_password: 'aaaabbbbccccdddd'
  smtp_require_tls: true

route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 3h
  receiver: 'gmail-slack-notice'

receivers:
  - name: 'gmail-slack-notice'
    email_configs:
      - to: 'xxxxxxxxxxxxxxxxxxxxxxxx@gmail.com'
        send_resolved: true
    slack_configs:
      - api_url: 'https://hooks.slack.com/services/AAAAAAAAAAAAA/VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV'
        channel: '#ceph-alerts'
        send_resolved: true
        title: 'Ceph Alert'
        text: 'Ceph alert detected'

[root@ceph-mgr ~]#
[root@ceph-mgr ~]# ceph config-key set mgr/cephadm/services/alertmanager/alertmanager.yml -i alertmanager.yml
[root@ceph-mgr ~]# ceph orch redeploy alertmanager

(確認)
[root@ceph-mgr ~]# ceph config-key get mgr/cephadm/services/alertmanager/alertmanager.yml
}}

これでslackにも通知が届きます

slackでの「api_url」の値ですが、
slackの「チャンネル」欄の「+」から「チェンネルを作成する」を行います。
&ref(2026y05m11d_143138428.png,nolink);
ここでは「#ceph-alert」を作ります

&ref(2026y05m08d_040034196.png,nolink);
すると「チャンネル」欄に「#ceph-alrt」が表示されます

&ref(2026y05m11d_143500400.png,nolink);

次に、「https://api.slack.com/apps」にアクセスして(認証がある場合はそれに応じて)
下記画面が表示されたら「Create an App」をクリックします
&ref(2026y05m08d_041720877.png,nolink,80%);

下記画面が表示されて、「From scratch」を押下します
&ref(2026y05m08d_041733813.png,nolink);

appの名称を入れます。あとworkspaceを選択します。
ここではappの名称は「ceph-alerts」にしてます。「Create App」ボタンを押下します
&ref(2026y05m08d_041914428.png,nolink);

作られた「ceph-alerts」アプリの設定画面が表示され、左縦メニューから「Incoming Webhooks」を選択します。
表示された「Incoming Webhooks」画面で、「Active Incoming Webhooks」を有効にして(OffからOnへ)、表示された項目「Webhook URLs for Your Workspace」の「Add New Webhook」ボタンを押下します
&ref(2026y05m08d_042051420.png,nolink,70%);

作ったAppをチャンネルにアサインします
&ref(2026y05m08d_042123908.png,nolink,80%);

すると Webhook 向けのURLが用意されます。それを先ほどの api_url に貼り付けます。
すると Webhook 向けのURLが用意されます。「Webhook URL」欄にある「Copy」を押下すしてURLをコピーして 先ほどの api_url に貼り付けます。
&ref(2026y05m08d_042140435.png,nolink,80%);

「Sample curl request to post to channel:」にある文字列は、そのまま「Copy」してターミナルに貼って実行すればslackにメッセージが届きます。テスト用ですね。
1

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS