zaki work log

作業ログやら生活ログやらなんやら

PrometheusのBlackbox Exporterを使ったターゲットノードの死活チェックをお試し (HTTP / TCP)

Blackbox Exporterをお試し。
機能的にはKubernetesのヘルスチェックのhttpGetおよびtcpSocketのように、外部からターゲットに対してネットワーク的に疎通確認を行うExporterとなっている。
(よって、監視対象ノード上で動かす必要はなく、Exporter(を動かすノード)から監視対象ノードへHTTPやTCPアクセスして死活監視を行うように動作する)

github.com

環境は例によってCentOS上に直接立てたPrometheus(非Kubernetes環境)

zaki-hmkc.hatenablog.com

実行バイナリの取得

2020.10.20時点でver 0.18.0

[zaki@cloud-dev prometheus]$ curl -LO https://github.com/prometheus/blackbox_exporter/releases/download/v0.18.0/blackbox_exporter-0.18.0.linux-amd64.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   667  100   667    0     0   1128      0 --:--:-- --:--:-- --:--:--  1130
100 8675k  100 8675k    0     0  2277k      0  0:00:03  0:00:03 --:--:-- 2706k
[zaki@cloud-dev prometheus]$ 
[zaki@cloud-dev prometheus]$ tar xf blackbox_exporter-0.18.0.linux-amd64.tar.gz 
[zaki@cloud-dev prometheus]$ ls -l blackbox_exporter-0.18.0.linux-amd64
合計 17860
-rw-r--r--. 1 zaki zaki    11357 10月 12 18:58 LICENSE
-rw-r--r--. 1 zaki zaki       94 10月 12 18:58 NOTICE
-rw-r--r--. 1 zaki zaki      629 10月 12 18:58 blackbox.yml
-rwxr-xr-x. 1 zaki zaki 18264924 10月 12 18:47 blackbox_exporter

Blackbox Exporterの実行

設定は付属のblackbox.ymlが使用できる。
起動オプション関連は--help付与すれば確認できる。

[zaki@cloud-dev prometheus]$ cd blackbox_exporter-0.18.0.linux-amd64/
[zaki@cloud-dev blackbox_exporter-0.18.0.linux-amd64]$ ./blackbox_exporter --config.file=blackbox.yml
level=info ts=2020-10-20T14:45:01.158Z caller=main.go:212 msg="Starting blackbox_exporter" version="(version=0.18.0, branch=HEAD, revision=60c86e6ce5a1111f7958b06ae7a08222bb6ec839)"
level=info ts=2020-10-20T14:45:01.158Z caller=main.go:213 msg="Build context" (gogo1.15.2,userroot@53d72328d93f,date20201012-09:46:31)=(MISSING)
level=info ts=2020-10-20T14:45:01.159Z caller=main.go:225 msg="Loaded config file"
level=info ts=2020-10-20T14:45:01.159Z caller=main.go:369 msg="Listening on address" address=:9115

デフォルトで9115/TCPでListenする。
この時点で9115/TCPへwebアクセスするとこんな感じ。

f:id:zaki-hmkc:20201020235041p:plain

/metricsにアクセスすれば、Prometheus用のメトリクス一覧も確認できる。

Prometheusへ設定追加

scrape_configsBlackbox Exporter用の設定を追加する。
params.moduleにHTTPアクセスチェック用のhttp_2xxを指定し、ターゲットとするwebサーバーを適当に用意し(なければGoogleYahoo!でも)、targetsのところへ設定する。
(http_2xxとかの定義は、前述のBlackbox Exporterの設定サンプルによるもの。)

Blackbox Exporterは192.168.0.18:9115で動作しているものとする。

設定自体はPrometheus Configurationを参照。

scrape_configs:

  # ...

  - job_name: 'blackbox-sample'
    metrics_path: /probe
    params:
      module: [http_2xx]  # Look for a HTTP 200 response.
    static_configs:
      - targets:
        - http://172.20.220.141
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.0.18:9115  # The blackbox exporter's real hostname:port.

この設定でPrometheusを再起動する。

Targetを確認するとこんな感じ。

f:id:zaki-hmkc:20201020235540p:plain

メトリクス確認

probe_http_status_codeを確認すると200になっている。
(これをグラフで見ても無意味かな…w)

f:id:zaki-hmkc:20201020235649p:plain

また、probe_successを確認すると、1になっている。

f:id:zaki-hmkc:20201020235714p:plain

エラー発生させる

index.htmlを削除してもディレクトリ一覧表示になってしまうので、read権限を外した。

# chmod 600 index.html 

curlで確認すると403なのを確認。

[zaki@cloud-dev ~]$ curl http://172.20.220.141 
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
</body></html>

この状態でPrometheusから確認すると以下の通り。

f:id:zaki-hmkc:20201021000327p:plain

probe_successを確認すると、値は0となる。

ターゲット追加

HTTPS (insecure)

試しにオレオレ証明書httpsサイトを追加。
対象はローカルに立てているGitLabサーバー。

[zaki@cloud-dev ~]$ curl https://gitlab-ce.example.org:8443/ 
curl: (60) Peer's certificate issuer has been marked as not trusted by the user.
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

Prometheusのターゲット設定は以下の通り。

  - job_name: 'blackbox-sample'
    metrics_path: /probe
    params:
      module: [http_2xx]  # Look for a HTTP 200 response.
    static_configs:
      - targets:
        - http://172.20.220.141
        - https://gitlab-ce.example.org:8443/
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.0.18:9115  # The blackbox exporter's real hostname:port.

これは証明書の検証は必要なようで、probe_success0となり、probe_http_status_code0となりHTTPのチェックとして成立しなかった。
が、これはHTTP Probeの設定で、insecureの設定を追加すれば証明書の検証をスキップできる。

以下は、既存のHTTP Probeに追加しているが、http_2xxとは別にmodule設定を(https_insecureとかの名前で)追加してもよいと思う。

modules:
  http_2xx:
    prober: http
    http:
      tls_config:
        insecure_skip_verify: true

TCP

Blackbox Exporterの標準のサンプル設定だとtcp_connectがそのまま使用できるので、(↑でinsecure設定はしているけど)ローカルGitLabのgitlab-ce.example.org:8443を監視設定に設定してみる。
以下のscrape設定をまるっと追加。

  - job_name: 'blackbox-tcpsample'
    metrics_path: /probe
    params:
      module: [tcp_connect]
    static_configs:
      - targets:
        - gitlab-ce.example.org:8443
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.0.18:9115  # The blackbox exporter's real hostname:port.

f:id:zaki-hmkc:20201021002331p:plain


うーん、params.moduleはリスト形式で書けるけど、static_configs.targetsに書くターゲットには個別のモジュールは選択できそうにない。。

その他

Configuratoinのページを見る限り、HTTP・TCP以外に、ICMPとDNSのチェックができる模様。

参考

qiita.com