【自宅システム】管理するサーバにPrometheus/Grafana環境を導入してみた

  • URLをコピーしました!
目次

はじめに

こんにちは。ネットワークエンジニアの「だいまる」です。

今回はネットワークではなく、本ブログや妻のブログである「えのきだけブログだけ」や個人の生活を便利、快適にするために構築しているプライベートクラウド等のサーバの状態を監視するために「Grafana」と「Prometheus」を導入してみました。

ちなみに最近、NetflixからHuluに乗り換え、イッテQやブラッシュアップライフをみております。

ダッシュボードはやっぱりGrafana

そもそもGrafanaとは?

 今回、ダッシュボードに使ったのは「Grafana」というGrafana Labが開発したオープンソースのダッシュボードになります。

 このダッシュボードは、PrometheusだけではなくAWSやElastic Search等、数多くのデータソースとの連携が可能となっており、企業でもかなり使われている印象があります。

 実際、前の会社でも使われており、今の会社でも使われています。

Grafanaの詳細については、公式HPの「https://grafana.com/oss/grafana/」で確認したほうが早いと思うのでリンクを貼り付けておきます。

たったの5分!!Grafanaの導入方法

 Grafanaのインストール方法はとても簡単で短時間で済みます。(以下の手順で実施すれば完了!!)

 ※Debian/Ubuntuのインストール方法(他OSは公式HP「https://grafana.com/grafana/download?edition=oss」をご参照ください)

Step1:libfontconfig1のインストール
 sudo apt-get install -y adduser libfontconfig1

Step2:wgetによるGrafanaのインストール
 wget https://dl.grafana.com/oss/release/grafana_10.0.3_amd64.deb

Step3:dpkgによるパッケージのインストール
 sudo dpkg -i grafana_10.0.3_amd64.deb

 上記の3つのコマンドを実施し、systemctlによるサービス開始を実施すれば起動されます。

Grafanaのデフォルトのポート番号は「3000」になります。

利用するOSによってはポート開放を実施する必要もあるので注意してください。

【ポート開放方法例】
①firewall-cmdによる開放
firewall-cmd --add-port=3000/tcp --zone=public --permanent
firewall-cmd --reload
firewall-cmd --list-ports --zone=public

②ufwによる開放
 ufw allow 3000

ポート開放後は、「http://(IPアドレス):3000」でアクセス可能となります。

デフォルトのユーザ/パスワードは「admin/admin」になります。

独自ドメインによるGrafanaへのアクセス方法

 次に独自ドメインによるGrafanaへのアクセス方法を検討しました。

私が自宅で構築しているWebアプリは一応独自ドメインを取得しアクセスできるようにしているため(かなり送信元は絞ってます)、そのWebアプリ経由でGrafanaを見れるようにしたかったので対応しました。

対応方法は全部で4つとなります。

  1. Apacheのインストール
  2. Proxy(Apache)の設定
  3. Grafanaの設定
  4. リバースプロキシの設定(場合による)

 この手順にしている理由は、構成による影響が大きい点とポート番号80を他サービスで利用する際にGoogleで調べて対応してみたのですがうまくいかなかった点が大きいです。

アクセス元
アクセス元
Webアプリ
Webアプリ
Grafana
Grafana
Apache
Apache
Grafana
Grafana
80番ポート
80番ポート
3000番ポート
Proxy
3000番ポート…
Text is not SVG – cannot display

1. Apacheのインストール

 まず、初めの手順としてはApacheのインストールになります。

Apacheのインストールは、以下コマンドで簡単にできます。

① sudo apt install apache2

② sudo systemctl start apache2 (Apache2サービスの開始)

③ sudo systemctl enable apache2 (Apaceh2サービスの自動起動ON) 

2. Proxy(Apache)の設定

 Apacheのインストール後はGrafanaにアクセスするために、Proxyの設定を行います。

デフォルトではProxyモジュールが導入されていないため、以下コマンドでProxyモジュールを追加します。

① sudo a2enmod proxy(Proxyモジュールの追加)
Enabling module proxy.
To activate the new configuration, you need to run:
  systemctl restart apache2

② sudo systemctl restart apache2 (上記で再起動しろと言われるので再起動)

 再起動後はProxyが利用できるので、設定ファイルを編集します。

設定ファイルは「/etc/apache2/mods-available/proxy.conf」となり、今回設定した内容は以下の通りとなります。

※OSやインストール方法によっては、若干ディレクトリや設定ファイル名が異なる場合があります。

<IfModule mod_proxy.c>

	# If you want to use apache2 as a forward proxy, uncomment the
	# 'ProxyRequests On' line and the <Proxy *> block below.
	# WARNING: Be careful to restrict access inside the <Proxy *> block.
	# Open proxy servers are dangerous both to your network and to the
	# Internet at large.
	#
	# If you only want to use apache2 as a reverse proxy/gateway in
	# front of some web application server, you DON'T need
	# 'ProxyRequests On'.

	ProxyRequests Off 
	<Proxy *>
	   AddDefaultCharset off
	   Require all granted ←をgrantedにしないとアクセス不可なので注意
	   #Require local
	</Proxy>

	# Enable/disable the handling of HTTP/1.1 "Via:" headers.
	# ("Full" adds the server version; "Block" removes all outgoing Via: headers)
	# Set to one of: Off | On | Full | Block
	ProxyVia On
	ProxyPreserveHost On  ←をOnにすることで独自ドメインをURLに保持した状態でアクセス可能(独自ドメインではない場合は不要)
        ProxyPass / http://localhost:3000/
        ProxyPassReverse / http://localhost:3000/

</IfModule>

 今回は、上記設定で保存しApache2を再起動しました。

3. Grafana設定ファイルの編集

Apache2の設定を完了したとしても、Grafanaの方で受け付ける準備をしないとGrafanaにより拒否されます。

そのため、今回は以下設定(設定ファイル:/etc/grafana/grafana.ini)で起動させました。

[server]
# The public facing domain name used to access grafana from a browser
domain = "<ドメイン名>"

# The full public facing url you use in browser, used for redirects and emails
# If you use reverse proxy and sub path specify full url (with sub path)
root_url = %(protocol)s://%(domain)s:%(http_port)s/<アクセス元ディレクトリ>

 domainはアクセス元のドメイン名を指定してあげるとそのドメインによるアクセスを可能とします。

※本ブログであれば、daimaru-tech-blog.comになります。

そして、root_urlはシステム内で「daimaru-tech-blog.com」でアクセスするわけにもいかないので、「daimaru-tech-blog.com/grafana」などでアクセスするようにすると思うのですが、その場合のディレクトリを記載します。

4. Webアプリ側のApache2にリバースプロキシの設定

 今回の構成では、セキュリティ面や運用・保守の観点からWebアプリ側のサーバを経由しGrafanaにアクセスするようにしています。

その場合、Webアプリ側の設定は以下のように設定しました。

<IfModule mod_proxy.c>

	# If you want to use apache2 as a forward proxy, uncomment the
	# 'ProxyRequests On' line and the <Proxy *> block below.
	# WARNING: Be careful to restrict access inside the <Proxy *> block.
	# Open proxy servers are dangerous both to your network and to the
	# Internet at large.
	#
	# If you only want to use apache2 as a reverse proxy/gateway in
	# front of some web application server, you DON'T need
	# 'ProxyRequests On'.

	ProxyRequests Off 
	<Proxy *>
	   AddDefaultCharset off
	   Require all granted ←をgrantedにしないとアクセス不可なので注意
	   #Require local
	</Proxy>

	# Enable/disable the handling of HTTP/1.1 "Via:" headers.
	# ("Full" adds the server version; "Block" removes all outgoing Via: headers)
	# Set to one of: Off | On | Full | Block
	ProxyVia On
	ProxyPreserveHost On  ←をOnにすることで独自ドメインをURLに保持した状態でアクセス可能(独自ドメインではない場合は不要)
        ProxyPass / http://<Grafanaサーバのアドレス>/
        ProxyPassReverse / http://<Grafanaサーバのアドレス>/

</IfModule>

 Proxyの設定を少し行っただけなので、簡単に終わると思います。

Prometheus/Node Exporterとは

 今回導入したPrometheusとNode Exporterとは、サーバのアクセス状況や負荷等を監視するために開発されたオープンソースのシステムとなります。

 ざっくりな概要にはなりますが、Prometheusのアーキテクチャは以下の図のようなイメージとなります。
※細かいアーキテクチャの記載は割愛しています。

Promethus Server
Promethus Server
Target(監視対象)
Node Exporter
Target(監視対象)…
Alert Manager
Mail/LINE etc
Alert Manager…
Prometheus WebUI
Grafana
Prometheus WebUI…
Pull
Pull
Metrics
Metrics
Push
Push
PromQL
PromQL
監視対象上で起動するNode Exporterから
サーバのデータを取得
監視対象上で起動するNode Exporterから…
Promethusで利用されるPromQLを用いて、
Grafana等の可視化システムに分析・表示
Promethusで利用されるPromQLを用いて、…
閾値を設定し、Alert をMailやLINE等で通知
閾値を設定し、Alert をMailやLINE等で通知
Text is not SVG – cannot display

 今回は、Prometheusサーバと監視対象(Target)に導入するNode Exporter、GrafanaとPrometheusとの連携部分お話となります。

Prometheusの導入

 Prometheusの導入もGrafana同様にwgetコマンドを利用しダウンロードします。

最新のバージョンは公式HP「https://prometheus.io/download/」で確認できます。

wget https://github.com/prometheus/prometheus/releases/tag/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz

上記ファイルをtarコマンドで解凍し、設定ファイルの編集やPrometheusファイルの移動を実施しました。

Step1:ファイルの移動
cp -r prometheus-2.45.0.linux-amd64 /usr/local/src/

Step2:設定ファイルの編集
sudo vim  /usr/lib/systemd/system/prometheus.service

Step3:デーモンの読込
sudo systemctl daemon-reload

Step4:システム起動
sudo systemctl enable prometheus.service
sudo systemctl start prometheus.service

Step5:正常状態の確認
http://(IPアドレス):9090

上記の手順で実施していただくとスムーズにインストール・起動ができると思います。

Step2での設定ファイル(/usr/lib/systemd/system/prometheus.service)の中身は以下の通りとなります。

ログのローテーション期間は1年程度にしています。

[Unit]
Description=Prometheus - Monitoring system and time series database
Documentation=https://prometheus.io/docs/introduction/overview/
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/src/prometheus-2.45.0.linux-amd64/prometheus \
  --config.file=/usr/local/src/prometheus-2.45.0.linux-amd64/prometheus.yml --storage.tsdb.retention.time 1y \

[Install]
WantedBy=multi-user.target

そして、Step3とStep4を実施するとPrometheusの起動が可能となります。

※注意点:ポートの解放は必要になる場合もあります。

Step5でアクセスすると以下のように表示されるようになります。

Toppage

こうなれば、Prometheusサーバの準備は一旦完了です。

Node Exporterの導入・Prometheusサーバとの連携

 次に監視対象(Target)にNode Exporterを導入し、Prometheusサーバとの連携方法について説明していきたいと思います。

Step1:Node Exporterの導入

Node Exporterのインストール方法は様々ありますが、今回はapt installで実施してみました。

もちろん、wgetによるダウンロード/tarコマンドによる回答でも実施可能です。

sudo apt install prometheus-node-exporter

インストール後は、Node Exporterを起動すると9100番ポートにアクセスすることで状態を確認することが可能となります。

Node_Exporter トップ画面

上記画面の「Metrics」をクリックすると様々なサーバに関する情報が表示されます。

この情報が表示されていれば、Node Exporterの導入完了です。
※情報は一部の表示となります。

Step2:Prometheusサーバとの連携

Node Exporterを導入した後は、Prometheusサーバとの連携になります。

アーキテクチャの図にもある通り、Node Exporterの情報を取得するにはPrometheusサーバがPull方式で取得するため、設定などはPrometheusサーバの方で行います。

今回、設定した内容(/usr/local/src/prometheus-2.45.0.linux-amd64/prometheus.yml)は以下の通りとなります。

# my global config
global:
  scrape_interval: 20s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 20s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).
  scrape_timeout: 20s
# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]
  - job_name: "Mgmt"
    static_configs:
      - targets: ["<IPアドレス>:9100","<IPアドレス>:9100"]
  - job_name: "Service"
    static_configs:
      - targets: ["<IPアドレス>:9100","<IPアドレス>:9100"]

この設定ファイルでPrometheusを起動させると、指定したTargetにデータを取得しにいきます。

今回追記した部分は最後の太文字部分の-job_name: “proemtheus”から最終行までです。

job_nameはグループ名として認識してもらえれば問題ないと思います。

その結果、prometheusのstatusをチェックするとこんな感じで見えるようになります。

Prometheus Statusチェック画面

完成したサーバ監視システム

最後に完成したダッシュボードはこんな感じになります。

最後に

 今回導入したのはサーバに対する監視システムでした。

次回は、今導入奮闘中のネットワーク機器やネットワークに対する監視システムの導入について記事をまとめていきたいと思います。

PrometheusやGrafanaについて更に勉強したい方は、以下の教材を読んでみるのがおすすめかと思います。

  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次