Prometheus サービスディスカバリ (dns編)

スポンサーリンク

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)を表示すると、サービスディスカバリの結果が表示されます。

Service Discoveryの結果確認

Targetsページ(http://<ip_addr>:9090/targets)を表示すると、監視対象ホストの一覧が表示されます。

targetの一覧確認

タイトルとURLをコピーしました