Netdataとは
Netdataとは分散型のリアルタイムパフォーマンスモニタリングツールです。サーバーの稼働状況などをリアルタイムに把握することを目的としています。他ツールに比べて導入が容易で扱いやすいですが、監視ツールではないのでログ取りには向いていません。詳しくは先駆者様や公式ドキュメントも参照してください。
Netdata Parentsとは
Netdataは本来、分散型としてすべてのシステムで独立して動くソフトウェアで、ユーザー側のブラウザ上のキャッシュファイルに複数のサーバーを見ているという旨の情報を保存し、管理します。Netdata Parentsとはそれらのソフトウェアを「親」と「子」に分けて管理し、親ノードはメトリクスデータを受信、保存、処理する中央ノードとして構成することができます。今回はこの機能を用いてネットワーク内の監視対象を簡単かつ統一的にモニタリングできるようにします。
Netdataの導入
今回は親と子で異なる導入方法を用います。
- 親サーバー:ESXi上のVM Ubuntu22.04×1
- docker copmoseでのインストール
- 子サーバー:物理サーバー Ubuntu22.04×3
- ansibleを用いた一括インストール(docker非使用)
親サーバーがdocker composeなのは、他のマシンでも環境の再現が比較的しやすいからです。
親へのインストール
こちらはdocker composeを用いてインストールします。また、httpsにも対応したいので今回はhttps-portalでLet's Encryptの証明書を利用します。
元のdocker-compose.ymlは公式ドキュメントを参照しています。httpsにする必要がない場合や、その下にある公式ドキュメントに添ったCaddyを用いたLet's Encryptの利用を行う場合はそちらを利用してください。
version: '3'
services:
netdata:
image: netdata/netdata
container_name: netdata
hostname: my_netdata #任意の名前
pid: host
network_mode: host
restart: unless-stopped
cap_add:
- SYS_PTRACE
- SYS_ADMIN
security_opt:
- apparmor:unconfined
volumes:
- ./netdataconfig/netdata:/etc/netdata:rw #公式ドキュメントだと:roになってるけどこれじゃ動かない
- netdatalib:/var/lib/netdata
- netdatacache:/var/cache/netdata
- /etc/passwd:/host/etc/passwd:ro
- /etc/group:/host/etc/group:ro
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /etc/os-release:/host/etc/os-release:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
https-portal:
image: steveltn/https-portal:1
ports:
- '80:80'
- '443:443'
network_mode: host
restart: always
environment:
DOMAINS: 'netdata.hoge.com -> http://127.0.0.1:19999'
STAGE: 'production'
# FORCE_RENEW: 'true'
volumes:
- ./data/https-portal:/var/lib/https-portal
volumes:
netdatalib:
netdatacache:
これを任意の場所においてdocker compose up -d
として導入完了。
ドメイン名もしくはIPアドレスでブラウザから見るとnetdataの画面が見れるはずです。
streamingの下準備
子へのインストールに取り掛かる前に、先ほど設定した親ノードにAPIキーを登録します。やり方は以下に従って行います。
まずは、親ノードでuuidgenを実行してapiキーを決定します
sudo apt install uuid-runtime #もしなければ
uuidgen
~~ここにapiキーが表示される~~
次にnetdataのディレクトリに移動してスクリプトを起動します
cd ~/netdata/netdataconfig/netdata #環境により異なります
sudo ./edit-config stream.conf
そうするとnanoが起動するので[API_KEY]で始まるセクションまでスクロールし、先ほど出てきたuuidを入力します。
- [API_KEY]
+ [11111111-2222-3333-4444-555555555555] #さっきのapiキー
# Default settings for this API key
# This GUID is to be used as an API key from remote agents connecting
# to this machine. Failure to match such a key, denies access.
# YOU MUST SET THIS FIELD ON ALL API KEYS.
type = api
# You can disable the API key, by setting this to: no
# The default (for unknown API keys) is: no
- enabled = no
+ enabled = yes
# A list of simple patterns matching the IPs of the servers that
# will be pushing metrics using this API key.
# The metrics are received via the API port, so the same IPs
# should also be matched at netdata.conf [web].allow connections from
allow from = *
# The default history in entries, for all hosts using this API key.
# You can also set it per host below.
# For the default db mode (dbengine), this is ignored.
#default history = 3600
# The default memory mode to be used for all hosts using this API key.
# You can also set it per host below.
# If you don't set it here, the memory mode of netdata.conf will be used.
# Valid modes:
# save save on exit, load on start
# map like swap (continuously syncing to disks - you need SSD)
# ram keep it in RAM, don't touch the disk
# none no database at all (use this on headless proxies)
# dbengine like a traditional database
- #default memory mode = dbengine
+ default memory mode = dbengine
これで下準備完了。保存してdocker compose restart
でnetdataのdockerを立ち上げ直しておきます。
子へのインストール
こちらはAnsibleというツールを用いて複数台に同時にnetdataを導入します。Ansibleについての詳細な説明は省きますが、冪等性を担保しながら複数のマシンに同じ設定などを反映させることができます。netdataにおいても、公式でansibleを用いた導入手順が解説されているほか、公式のansibleのgithubがあるのでこれに手を加えていきます。
やることはstreamingの設定を加える設定なので、以下に筆者が変更を加えたansibleを用意しました。
別途ansibleを実行するためのサーバーを用意するのも面倒なので今回は親のサーバーで実行します。ネットワークが疎通するならなんでもいいです。
事前準備として親のサーバーからこのサーバーにSSHできるようになっている必要があります。その為、公開鍵を事前に登録しておいてください。
また、パスワード認証で行いたいという場合は以下をansible.cfg
に追記してください。
[defaults]
inventory = ./hosts
gathering = smart
ansible_managed = Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host}
+ask_pass = True
display_skipped_hosts = False
fact_caching = yaml
fact_caching_timeout = 86400
fact_caching_connection = /tmp/facts_cache
[ssh_connection]
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s
+ [privilege_escalation]
+ become_ask_pass = True
hostsファイルに適応したいサーバーを書いた上で以下を実行しました。
sudo apt install ansible-playbook #ansibleの実行環境をインストール
ansible-playbook netdata-agent.yml #netdataの各サーバーへのインストール
#もしパスワード認証をオンにしていた場合は以下も入力する
#SSH password:
#BECOME password[defaults to SSH password]:
ansible-playbook streaming.yml #netdataのparentsへのデータを送信する設定
#もしパスワード認証をオンにしていた場合は以下も入力する
#SSH password:
#BECOME password[defaults to SSH password]:
Input parent ip: xx.xx.xx.xx
Input parent API key: xx-xxx-xxxx
これで最初に作った親ノードのページを確認しに行くと各サーバーがNodesの中に表示されるようになっているはずです。
まとめ
今回はNetdata Parentsでモニタリング環境を構築しました。親のサーバーをさらにNetdata cloudと接続したり、プロキシとして利用する他ミラーリングなども可能なので色々な活用方法を検討してみてください。