ラズパイ Ceph を Zabbix で監視する

自宅ラボでは Cephadm を使ってラズパイに Ceph クラスタを構築して遊んでます。

今回は Ceph の Zabbix モジュールを使って Zabbix からラズパイ Ceph クラスタを監視できるようにします。 ただモジュールを有効化するだけでは Zabbix から監視できなかったので、手順を残します。

ちなみにラズパイ Ceph クラスタCentOS/RockyLinux/AlmaLinux 各種 OS を使った混合環境です。 本当はクラスタ構築の話から投稿したかったのですが、モチベの関係で先にこのネタから投稿します。

Zabbix モジュール有効化

Ceph Manager Daemon (MGR) は、モジュールという形でダッシュボード機能や他製品との連携機能を提供しています。

Cephadm 自体も「Orchestrator モジュール」を使って Ceph を管理しているようです。

公式のモジュール一覧は ここ (でいいんですかねぇ…?)

MGR のモジュールの中に「Zabbix モジュール」があるので、このモジュールを有効化して使います。

ceph mgr module enable zabbix

Zabbix モジュールのパラメータのうち、以下の 2 つを設定します。

  • zabbix_host: Zabbix サーバのホスト名
  • identifier: Zabbix に登録する Ceph クラスタ
ceph zabbix config-set zabbix_host zabbix.example.com
ceph zabbix config-set identifier raspi-ceph

今回はその他のパラメータはデフォルト値のまま使いました。 以下のコマンドでパラメータを確認します。

ceph zabbix config-show

または、ダッシュボードから直接有効にすることもできます。

f:id:nnstt1:20220206215401p:plain

f:id:nnstt1:20220206215604p:plain

Zabbix 設定

Ceph 用の Zabbix テンプレート ceph-mgr Zabbix module が公開されているので、Zabbix にインポートします。

f:id:nnstt1:20220206220907p:plain

Zabbix にラズパイ Ceph クラスタ監視用のホストを登録します。 このとき、ホスト名は Zabbix モジュールの identifier パラメータと同じ文字列を設定する必要があります。

f:id:nnstt1:20220206220828p:plain

また、テンプレートに ceph-mgr Zabbix module を指定します。

f:id:nnstt1:20220206220844p:plain

ここまで設定すれば Ceph の情報を Zabbix から見れるようになるはずですが、Zabbix には監視データが飛んできません。

Cephadm かつラズパイ (ARM) の場合は追加で対応が必要です。

Ceph コンテナでは Zabbix モジュールが使えない

Cephadm で Ceph を構築した場合、各ノードに Ceph コンテナがデプロイされます。

MON/MGR/OSD それぞれ別コンテナとして起動しますが、すべて同じイメージ quay.io/ceph/ceph が使われます。

この公式 Ceph コンテナイメージには、Zabbix モジュールが利用する zabbix_sender コマンドが同梱されていません。

ceph/ceph-container の Issue によると、依存関係を懸念してサードパーティ製のパッケージは除外しているようです。 Issue にも書かれている通り、必要なパッケージがあれば自分でイメージに追加すれば Zabbix モジュールを使えるようになります。

ARM64 版 Ceph コンテナに zabbix_sender 追加

上述の通り、Cephadm で Zabbix モジュールを使うには zabbix_sender コマンドをインストールした Ceph コンテナイメージを使う必要があります。

zabbix_sender は zabbix-agent パッケージからインストールされます。

しかし残念ながら、 ARM64 向けの zabbix-agent パッケージは公開されていません。 そのため、ソースから zabbix_sender をビルドして Ceph コンテナイメージに追加します。

以下は Dockerfile の例です。 (Dockerfile のうまい書き方があればツイッターでコメントください🙇)

ちなみにリポジトリの内容を書き換えてるのは CentOS 8: Failed to download metadata for repo 'appstream' の件があったからです。

FROM centos:centos8 AS builder
RUN sed -i 's/#baseurl=http:\/\/mirror.centos.org/baseurl=http:\/\/vault.centos.org/' /etc/yum.repos.d/CentOS-Linux-AppStream.repo && \
    sed -i 's/#baseurl=http:\/\/mirror.centos.org/baseurl=http:\/\/vault.centos.org/' /etc/yum.repos.d/CentOS-Linux-BaseOS.repo && \
    sed -i 's/#baseurl=http:\/\/mirror.centos.org/baseurl=http:\/\/vault.centos.org/' /etc/yum.repos.d/CentOS-Linux-Extras.repo && \
    yum install -y git zip automake pcre-devel gcc make && \
    git clone https://git.zabbix.com/scm/zbx/zabbix.git -b 5.4.10 --depth 1
WORKDIR /zabbix/
RUN ./bootstrap.sh && \
    ./configure --enable-agent --disable-dependency-tracking && \
    make && \
    make install

FROM quay.io/ceph/ceph:v16.2.7
COPY --from=builder /usr/local/bin/zabbix_sender /usr/bin/zabbix_sender

この Dockerfile をラズパイなどの ARM64 上でビルドしたら zabbix_sender 入りの Ceph コンテナができます。

Ceph ノード内の設定ファイルを書き換えて、作成したイメージを使うように MGR の設定を変更します。 ここは正式な手順があるかもしれませんが、そこまで追えませんでした。

  • /var/lib/ceph/[fsid]/mgr.ceph1.cxsytc/unit.image
  • /var/lib/ceph/[fsid]/mgr.ceph1.cxsytc/unit.run

これで Zabbix に Ceph の監視データを飛ばせるようになりました。

Zabbix から見た Ceph

Zabbix モジュール & テンプレートを使った Ceph 監視データはこんな感じです。

f:id:nnstt1:20220206225853p:plain

f:id:nnstt1:20220206225958p:plain

苦労した割にあんまり使い勝手よく無さそうな…正直、Grafana のほうが見やすそう…。