Prometheusはコンテナやクラウドなどの大量コンポーネントを監視する事に特化したソフトウェアです。監視対象は大量に存在しますので、その監視対象を1つ1つ手作業で定義するのは非現実的です。このような問題に対応するため、Prometheusには監視対象を動的に検出するサービスディスカバリという機能が備わっています。このページではサービスディスカバリの1つであるDNSを併用する方法を説明します。
前提
参照資料
動作確認済環境
- Rocky Linux 8.5
- Prometheus 2.36.2
- bind 9.11.26
構成図
3台の仮想マシンに対して、以下コンポーネントがインストール済の状態とします。
+----------------+ +----------------+ +----------------+ | linux010 | | linux020 | | linux030 | | 172.16.1.10/24 | | 172.16.1.20/24 | | 172.16.1.30/24 | | | | | | | | dns(bind) | | | | | | node_exporter | | node_exporter | | node_exporter | | prometheus | | | | | +----------------+ +----------------+ +----------------+
DNSサーバの構成
PrometheusはDNSのSRVレコードを読み取って、動的に監視対象ホストを変更する事ができます。DNSサーバはどのような構築方法でも差し支えございません。Windows環境でもLinux環境でもパブリッククラウドのマネージドサービスでも差し支えございません。以下、bindを使用する場合の設定例を紹介します。
パブリッククラウドで動作確認する方はマネージドサービスの利用をおすすめします。パブリッククラウドでbindなどを構築するのは、一定以上のネットワークの理解が必要となります。ネットワークに苦手意識がある方は、おとなしくマネージドサービスを使った方が無難かと思います。
dnf install bind bind-utils
SRVレコードとは、IPアドレスだけでなくポート番号や優先順位(Priority)や重み付け(Weight)を定義したレコードです。bindでは以下のような書式で表します。
_Service._Proto.Name TTL Class SRV Priority Weight Port Target
以下のように記述すれば、_metric._tcp.gokatei.net.はlinux010, linux020, linux030の3台で負荷分散される事を表します。
_metric._tcp.gokatei.net. IN SRV 1 0 9100 linux010.gokatei.net. _metric._tcp.gokatei.net. IN SRV 2 0 9100 linux020.gokatei.net. _metric._tcp.gokatei.net. IN SRV 3 0 9100 linux030.gokatei.net.
以下のようなprometheusとnode_exporterに対する定義を設定したゾーンファイルを作成します。
cat << 'EOF' > /var/named/db.gokatei.net $TTL 604800 @ IN SOA ns.gokatei.net. root.gokatei.net. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS ns.gokatei.net. @ IN A 172.16.1.10 ns IN A 172.16.1.10 _prometheus._tcp.gokatei.net. IN SRV 1 1 9090 linux010.gokatei.net. _node._tcp.gokatei.net. IN SRV 1 1 9100 linux010.gokatei.net. _node._tcp.gokatei.net. IN SRV 2 1 9100 linux020.gokatei.net. _node._tcp.gokatei.net. IN SRV 3 1 9100 linux030.gokatei.net. linux010 IN A 172.16.1.10 linux020 IN A 172.16.1.20 linux030 IN A 172.16.1.30 EOF
/etc/named.confの編集例は以下の通りです。デフォルト設定から変更している部分はハイライトで表示します。
// // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // options { listen-on port 53 { 0.0.0.0/0; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; secroots-file "/var/named/data/named.secroots"; recursing-file "/var/named/data/named.recursing"; allow-query { 0.0.0.0/0; }; /* - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion. - If you are building a RECURSIVE (caching) DNS server, you need to enable recursion. - If your recursive DNS server has a public IP address, you MUST enable access control to limit queries to your legitimate users. Failing to do so will cause your server to become part of large scale DNS amplification attacks. Implementing BCP38 within your network would greatly reduce such attack surface */ recursion yes; dnssec-enable yes; dnssec-validation yes; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */ include "/etc/crypto-policies/back-ends/bind.config"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; zone "gokatei.net" IN { type master; file "db.gokatei.net"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
bindを起動します。
systemctl enable named.service --now
prometheusとnode_exporterのSRVレコードの設定をdigコマンドで確認します。
[root@linux010 ~]# dig srv _prometheus._tcp.gokatei.net. @127.0.0.1 <omitted> ;; ANSWER SECTION: _prometheus._tcp.gokatei.net. 604800 IN SRV 1 1 9090 linux010.gokatei.net. <omitted> [root@linux010 ~]# dig srv _node._tcp.gokatei.net. @127.0.0.1 <omitted> ;; ANSWER SECTION: _node._tcp.gokatei.net. 604800 IN SRV 3 1 9100 linux030.gokatei.net. _node._tcp.gokatei.net. 604800 IN SRV 2 1 9100 linux020.gokatei.net. _node._tcp.gokatei.net. 604800 IN SRV 1 1 9100 linux010.gokatei.net. <omitted>
サービスディスカバリ
prometheus.ymlの設定例
/etc/prometheus/prometheus.ymlを以下のように編集します。
global: scrape_interval: 10s scrape_configs: - job_name: example dns_sd_configs: - names: - '_prometheus._tcp.gokatei.net.' - '_node._tcp.gokatei.net.'
設定を反映させるために再起動します。
systemctl restart prometheus.service
動作確認
Service Discoveryページ(http://<ip_addr>:9090/service-discovery)を表示すると、サービスディスカバリの結果が表示されます。
Targetsページ(http://<ip_addr>:9090/targets)を表示すると、監視対象ホストの一覧が表示されます。