本文の内容は、2021年8月11日にDonald Pattersonが投稿したブログ(https://sysdig.com/blog/monitoring-pihole-prometheus/)を元に日本語に翻訳・再構成した内容となっております。
去年、Sysdigを使ってクリスマス用のハムを作りました。正直、それを思い出しただけでお腹が空いてきましたが、考えてしまいました。デザートはどうだろう?
今日は、Prometheus Remote Writeを使ってパイを焼いて食べる話をしたいと思います。ただし、ただのパイではなく、Raspberry Piを使います。具体的には、コミュニティで人気の高いオープンソースプロジェクト Pi-holeをご紹介します。この記事では、Prometheus Remote WriteでPi-holeを簡単に監視できる方法を紹介します。
Pi-holeとは?
Pi-holeは、あなたのネットワークにおける広告とインターネット追跡のブロッカーです。Raspberry Piなどのデバイス上で動作するように設計されていますが、ほとんどのLinuxシステムに簡単にインストールできます。アプリケーションで定義したルールに基づいて、Pi-holeは、他の方法ではイーサネットに出て行くDNSリクエストを傍受し、潜在的に危険なリクエストや広告を含むリクエストをブロックします。ネットワークに接続されているすべてのデバイスが保護されます。携帯電話、タブレット、コンピュータ、そしてeBayで購入したばかりの恐るべきノーブランドのIoTデバイスも保護されます。
そのため、一部の企業や学校では、従業員が危険な場所にナビゲートするのを防ぎ、ウェブ閲覧中の子どもを保護する方法としてPi-holeを使用しています。
ここでは、Prometheus Remote Writeを使ってPi-holeの監視を適切に開始し、Pi-holeがネットワークをうまく保護していることを確認する方法を見てみましょう。
Prometheus Remote WriteでPi-holeを監視する
Raspberry PiにPrometheusサーバーを搭載することは、RaspisがSDメモリーカードをストレージとして使用していることから、問題となることがあります。集中的な連続書き込みはカードにダメージを与え、長時間の保存設定はSDカードの利用可能なストレージを使い切ってしまいます。そのため、ローカルのPrometheusを設定して保持時間を短くし、ディスクの占有率を最小限にして、コンピュータやクラウドサービスにホストされたPrometheusサーバーにデータを送信するように設定することができます。
Prometheus Remote Writeを使ったPi-holeの監視では、Prometheus エクスポーターからいくつかの重要なメトリクスを引き出すエージェントに頼るのではなく、Prometheus自体を構成して、好みのメトリクスを完全にエージェントレスでPrometheusサーバーに書き込むことができます。
このソリューションは、部屋やLAN、建物ごとに異なるPi-Holeがある場合、データを一元化することも可能です。
Piを焼いてみよう!
材料は以下の通りです:- Raspberry Pi OS Liteが動作し、Pi-holeがインストールされている、あらゆる種類のRaspberry Pi
- Docker
- Pi-hole Prometheus エクスポーター
- Prometheusサーバーが稼働しているdockerコンテナ
Piを包むためのおいしいパイ皮
この後の手順でDockerを使用するので、RaspiにDockerをインストールしておく必要があります。curl -sSL https://get.docker.com | sudo sh
詰め物の準備
Prometheus サーバーが受け取るメトリクスを取得するために、Prometheus エクスポーターをデプロイしましょう。Prometheus エクスポーター とは何か?
エクスポーターとは、Prometheus 以外のエンドポイントからデータを取得し、それを Prometheus のメトリクス形式に変換して、Prometheus サーバーでスクレイピングできるようにする「トランスレーター」または「アダプター」プログラムです。Prometheus エクスポーターには、様々な種類のものがあり、あらゆるものを監視することができます。このプロジェクトでは、Pi-hole エクスポーターが必要になります。Pi-hole エクスポーターは、Pi-Hole 用に書かれたシンプルなエクスポーターで、すでにコンテナ化されています。
最初のステップは、エクスポーターがPi-Holeからデータを収集するために使用できるクレデンシャルを取得することです。最も簡単な方法は、APIキーを使うことです。APIキーは、以下のコマンドで取得できます。
awk -F= -v key="WEBPASSWORD" '$1==key {print $2}' /etc/pihole/setupVars.conf
次に、エクスポーターをバックグランドで実行するデーモンとして立ち上げる必要があります。今回は9617番ポートでエクスポーターを公開していますが、空いているポートを利用しても構いません。
sudo docker run \ -d \ --network="host" \ -e 'PIHOLE_HOSTNAME=127.0.0.1' \ -e "PIHOLE_API_TOKEN=<Pi-Hole Token>" \ -e 'INTERVAL=10s' \ -e 'PORT=9617' \ -p 9617:9617 \ ekofr/pihole-exporter:v0.0.11
コンテナが起動したら、Pi-Holeからメトリクスが収集され、Exporterによって公開されているかどうかをテストできます。
curl -s http://127.0.0.1:9617/metrics | grep pihole # HELP pihole_ads_blocked_today This represent the number of ads blocked over the current day # TYPE pihole_ads_blocked_today gauge pihole_ads_blocked_today{hostname="127.0.0.1"} 21319 # HELP pihole_ads_percentage_today This represent the percentage of ads blocked over the current day # TYPE pihole_ads_percentage_today gauge pihole_ads_percentage_today{hostname="127.0.0.1"} 28.602285 …
また、Webブラウザで/metricsエンドポイントにアクセスして、収集されたメトリクスや利用可能なメトリクスを確認することもできます。
Piを焼き上げましょう!
さて、メトリクスがローカルで利用できるようになったので、Prometheus Remote WriteでPi-holeの監視を開始するために、Prometheusサーバーに転送する方法が必要になります。前述したように、Prometheus のコンテナ版を使ってこれを実現します。まず、prometheus.ymlファイルを作成します。基本的なものは、先ほど解凍したバイナリにすでに含まれているので、コピーをテンプレートとして使うことができます。
まず始めに、いくつかの主なセクションを紹介します。
external_labelsセクション
このセクションでは、Prometheusのデスティネーション・サーバーに書き込まれたメトリクスにラベルを渡すことができます。
scrape_configs セクション
ここでは、Prometheusにどこからメトリクスをスクレイピングするかを伝えるジョブを定義することができます。この場合、必要なジョブは、ループバックに接続して、ポート9617のPi-Hole エクスポーターからメトリクスを収集することだけです。
デフォルトでは、Prometheus は代替手段が定義されていない場合、/metrics パスからスクレイピングしますが、これはまさに私たちが必要とするものです。
remote_writeセクション
このセクションでは、Prometheus サーバーにメトリクスを送信するために使用します。ここでは、Prometheus サーバーの API エンドポイントとなる URL を定義する必要があります。
前述の変更を加えた結果の prometheus.yml は以下の通りです:
global: scrape_interval: 10s # By default, scrape targets every 15 seconds. evaluation_interval: 10s # By default, scrape targets every 15 seconds. scrape_timeout: 10s # By default, is set to the global default (10s). # Attach these labels to any time series or alerts when communicating with # external systems (federation, remote storage, Alertmanager). external_labels: monitor: 'pihole' origin_prometheus: 'donald-pihole' # A scrape configuration containing exactly one endpoint to scrape: scrape_configs: - job_name: 'pihole' static_configs: - targets: ['127.0.0.1:9617'] remote_write: - url: "<PROMETHEUS_SERVER_URL>" tls_config: insecure_skip_verify: true
Prometheus のインストール作業を簡単にするために、公式の Prometheus docker イメージを使って、Raspiでサーバーを起動することをお勧めします。これにより、Pi-Hole エクスポーターからスクレイピングが開始され、Prometheus サーバーにメトリクスがリモートで書き込まれます。
docker run \ -p 9090:9090 \ -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \ prom/prometheus
食べましょう!
Prometheus コンテナを起動して数分後には、Sysdig Monitor で利用可能な pihole_* メトリクスが美味しそうに表示されるはずです。ダッシュボードはGrafanaでも何でも構いませんが、ここでは便宜上Sysdig Monitorを使用します。PromQLでは、シンプルなものから複雑なものまで、あらゆるクエリーを作成することができます。これにより、新しいPi-Holeのデプロイメントを好きなように監視することができます。
わずか数分で、ネットワーク上のリクエストを完全に可視化するダッシュボードを作成することができ、より安全で守られていることを実感できました。
SysdigのマネージドPrometheusサービスは、Prometheusのremote write機能をサポートしています。これにより、メトリクスのための長期的なマネージドストレージソリューションを簡単に導入することができ、最小限のオーバーヘッドで重要なメトリクスを監視することができ、あなたのウエストライン(腰回り)への影響もありません!
Sysdig Monitorのフリートライアルでは、わずか数分でこの機能を試すことができます。