Slide 1

Slide 1 text

運用視点での PrometheusのNW機器のモニタリング ネットワークプログラマビリティ勉強会 #19 2020/01/29 ビッグローブ株式会社 基盤本部 ネットワーク技術部 自動化推進グループ 滝口 敏行

Slide 2

Slide 2 text

2 BIGLOBE Inc. 初めに  最新のOSS監視システムであるPrometheusを利用すると 従来の監視システムにおいてNW運用観点で課題だったところが解決できることがわかりました。  PrometheusのSNMPを使ったネットワーク機器の監視ノウハウや事例が少ないので、 今回はPrometheusのSNMP監視のノウハウをご紹介したいと思います。 SNMP

Slide 3

Slide 3 text

3 BIGLOBE Inc. 自己紹介 滝口 敏行  業務:ネットワークインフラ周りの運用自動化の実装を進めるチームに所属。  経歴:現在3社目です。  年齢:最後の昭和生まれです。  細かいこと:  趣味はドラムです。ヘビィメタルバンドのコピーやってます。  新婚です。(Janog 44の前日に入籍しました)  昨年夏のJanog44のハッカソンにて優勝しました。 ⇒成果物の本番活用は現在着手中なので、 また機会がありましたらお話しいたします。

Slide 4

Slide 4 text

4 BIGLOBE Inc. 従来のモニタリングシステムの課題  従来のモニタリングシステムはSNMPのifIndexやifNameなどでInterfaceごとにユニークに管理している。 回線増速や移設などによるInterfaceやラインカード交換により監視対象トラフィックのifIndexやifNameに変更が発生する。  監視システムの都度メンテナンスをしないと対象トラフィックを継続的に監視することは難しい。  規模が大きくなると工数がかかるので自動化したい。  回線のActive/Standby・接続先のキャリア単位・拠点単位でのグルーピングされたトラフィックデータが見たい。 1Gbps 10Gbps 450 500 550 600 650 9:00 9:10 9:20 9:30 9:40 9:50 10:00 10:10 10:20 10:30 10:40 10:50 11:00 1G_eth0[Mbps] 閾値[600Mbps] 増速 Active Standby ifIndex: 10 ifName: 1G_eth0 ・・・ ifIndex: 110 ifName: 10G_eth0 1Gbps 1Gbps 0 200 400 600 9:00 9:20 9:40 10:00 10:20 10:40 11:00 Active[Mbps] 0 200 400 600 800 9:00 9:20 9:40 10:00 10:20 10:40 11:00 Standby[Mbps] 0 200 400 600 800 9:00 9:10 9:20 9:30 9:40 9:50 10:00 10:10 10:20 10:30 10:40 10:50 11:00 Active[Mbps] Standby[Mbps] 自動集計

Slide 5

Slide 5 text

5 BIGLOBE Inc. 各回線の識別キーワードから動的に集計するのはどうか?  ifIndexやifNameなどの自ホスト・自インターフェイスを起点としたモニタリングだと構成変更・抽象度を上げた集計に弱い  通信先・拠点・役割などのキーワードベースなら変更と集計に強くなるのではないか?  ホスト名やInterface Descriptionには、何かしら拠点や通信先・役割を識別するキーワードが埋め込まれているはず。  これらをキーワードを組み合わせて自動で集計してモニタリングできる仕組みは作れないか?

Slide 6

Slide 6 text

6 BIGLOBE Inc. 拠点B  特徴  時系列データベース(TSDB)のデータクエリ(PromQL)が強力。  PrometheusサーバとNW機器を直接通信させる必要はない。  SNMP-ExporterがNW機器からSNMP情報を収集する役割を担当。  SNMP-ExporterとPrometheusはHTTP APIで通信するため、疎結合に配置できる。  監視ダッシュボードはカスタマイズ性の高いOSSのGrafanaで実装。  Grafana上でPromQLが定義できるので、高度な集計を行うクエリでのグラフ生成ができる  ざっくりとしたアーキテクチャイメージ 拠点A メイン拠点 救世主のPrometheusについて Prometheus TSDB (時系列DB) Grafana AlertManager Scrape HTTP Server Mail, Slack 等へ通知 SNMP- Exporter HTTP Server SNMP Walk / Get SNMP- Exporter HTTP Server SNMP Walk / Get Operator

Slide 7

Slide 7 text

7 BIGLOBE Inc. 詳しいPrometheusの解説は割愛します…  Prometheus自体を詳しく知りたい方は 以下のPrometheusの書籍をお勧めします。 「PrometheusでKubernetesを監視する本」 https://booth.pm/ja/items/1570360 • 電子版:¥ 800 • 書籍版:¥ 1,000  著者 : かめねこさん @kameneko1004  Kubernetesを監視することをテーマとされておりますが、 Prometheus全般の解説がスマートにまとまっており、 ハンズオン的にPrometheusを構築できるので Prometheusをまず触ってみたいという方にはお勧めの一冊です。 ここで紹介することを快諾していただいた かめねこさん、ご協力いただきありがとうございました! ⇒PromQLやGrafana、Alert Manager、各種Exporterなどを さらに深堀されたい場合は、 O’ REILLYの「入門 Prometheus」をお勧めします。 https://www.oreilly.co.jp/books/9784873118772/

Slide 8

Slide 8 text

8 BIGLOBE Inc. デモ実演  デモイメージ抜粋 Interface Descriptionで 「CarrierA」に部分一 致するIFを指定 DescPhraseの条件に合致した IFを持つ機器で、ホスト名に 「tokyo」がある機器を指定 ※候補が自動でプルダウンメ ニューに出てくる HostnameとInterfaceで条件にあ う候補が選択できるので、 選択したもののデータが描写される

Slide 9

Slide 9 text

9 BIGLOBE Inc. 作り方を説明します (時間の許す限り・・・) ~デモ環境~ Prometheus: v2.15.2 Grafana: v6.5.2

Slide 10

Slide 10 text

10 BIGLOBE Inc. 作り方①(snmp_exporter構築)  Githubリポジトリ https://github.com/prometheus/snmp_exporter  構築手順① 始めにどのMIB,OIDを取得するか指定する定義ファイルsnmp.yml を作成するが、これを手で作るのは大変。  snmp-generatorというツールを使ってsnmp.ymlを生成する。 ※「[参考] snmp-generatorのDockerインスタンス作成手順」ページ参照  構築手順② 生成されたsnmp.ymlを指定してDockerインスタンスを起動させる ※「[参考] snmp_exporterのDockerインスタンス作成手順」ページ参照  構築手順③ 試しにsnmp.ymlに定義した監視対象から情報取得できるか確認する。 - http://:9116 へアクセスし、 Targetに監視対象機器のホスト名、ModuleにDEMOを入力して、 Submitボタンを押下すると、 しばらくしてSNMPの収集情報が表示される。

Slide 11

Slide 11 text

11 BIGLOBE Inc. $ sudo apt-get install make $ git clone -b v0.16.1 https://github.com/prometheus/snmp_exporter.git $ cd snmp_exporter/ $ wget https://github.com/prometheus/snmp_exporter/releases/do wnload/v0.16.1/snmp_exporter-0.16.1.linux-amd64.tar.gz $ tar -xvzf snmp_exporter-0.16.1 .linux-amd64.tar.gz $ cp snmp_exporter-0.16.1.linux-amd64/snmp_exporter ./ $ cd generator/ $ vi generator.yml ※⇒のサンプルgenerator.ymlの内容に上書きする $ make mibs ※エラーが出る場合はMakefileの対象URLを修正する $ sudo docker build -t snmp-generator . $ sudo docker run -ti -v "${PWD}:/opt" -v "${PWD}/mibs:/root/.snmp/mibs" snmp-generator generate [参考] snmp-generatorのDockerインスタンス作成手順(ホストOS: Ubuntu 18.04LTS)  手順 ※バージョン0.16.1を基準にしているので、適宜変えてください。 modules: DEMO: walk: - sysDescr - sysName - sysUpTime - ifDescr - ifAlias - ifHighSpeed - ifType - ifMtu - ifIndex - ifOperStatus - ifAdminStatus - ifHCInOctets - ifHCOutOctets - ifInErrors - ifOutErrors - ifInDiscards - ifOutDiscards lookups: - source_indexes: [ifIndex] lookup: ifDescr drop_source_indexes: false - source_indexes: [ifIndex] lookup: ifAlias drop_source_indexes: false - source_indexes: [ifIndex] lookup: ifName drop_source_indexes: false overrides: ifType: type: EnumAsInfo auth: community: public  サンプルgenerator.yml ※適宜MIBやOID, Community値を追加・編集してください

Slide 12

Slide 12 text

12 BIGLOBE Inc. $ cd {git cloneしたディレクトリ}/snmp_exporter/ $ cp generator/snmp.yml ./ $ vi snmp.yml ※必要に応じて⇒のサンプルsnmy.ymlの内容をもとに編集する $ sudo docker build -t snmp-exporter . $ sudo docker run --detach --name snmp-exporter -- restart always -v “${PWD}/snmp.yml:/etc/snmp_exporter/snmp.yml” -v /etc/hosts:/etc/hosts:ro -p 9116:9116 snmp-exporter ※監視対象機器の名前解決をDockerホスト側でできるようにしておく。 監視対象機器の名前解決できるDNSサーバがいる場合は 赤字部分を「--dns=X.X.X.X(DNSサーバのアドレス)」とする [参考] snmp_exporterのDockerインスタンス作成手順(ホストOS: Ubuntu 18.04LTS)  手順 ※ [参考] snmp-generatorのDockerインスタンス作成手順を実施済みとする。 # WARNING: This file was auto-generated using snmp_exporter generator, manual changes will be lost. DEMO: &DEMO walk: <<中略>> - labels: - ifIndex labelname: ifName oid: 1.3.6.1.2.1.31.1.1.1.1 type: DisplayString auth: community: public TOKYO: ←Community値が同じモジュール名を作る <<: *DEMO auth: community: XXXXXXX ← SNMPコミュニティ値を指定  サンプルsnmp.yml ※SNMP Community値が違う機器が複数存在する場合は赤字部分を追記していく。

Slide 13

Slide 13 text

13 BIGLOBE Inc. 作り方②(Prometheusサーバへ登録)  構築手順① Prometheusサーバへ監視対象を登録するため、 prometheus.ymlを編集する。 ※⇒のprometheus.ymlのscrape_config階層配下に赤字部分を追記  構築手順② Prometheusのプロセスを再起動して設定を反映する。  構築手順③ 監視ターゲット一覧画面を開いて、 対象の機器のモニタリングが開始すること確認する。 URL:「http(s):///targets」 ※数分してStateが「UNKNOWN」から「UP」に変わる。 scrape_configs: <<中略>> - job_name: DEMO ←snmp.ymlで定義したモジュール名DEMOを指定する scrape_interval: 1m ←ここで監視間隔を個別に指定できる。例:5分であれば5mと指定。 static_configs: - targets: - DEMO_Router01_osaka ←DEMOに紐づく監視対象のホスト名を記載する。 metrics_path: /snmp params: module: [DEMO] ← snmp.ymlで定義したモジュール名DEMOを指定する relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: hostname source_labels: [sysName] - target_label: __address__ replacement: :9116 - job_name: TOKYO ←snmp.ymlで定義したモジュール名TOKYOを指定する scrape_interval: 1m static_configs: - targets: - DEMO_Router01_Tokyo ←TOKYOに紐づく監視対象のホスト名を記載する。 metrics_path: /snmp params: module: [TOKYO] ←snmp.ymlで定義したモジュール名TOKYOを指定する relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: hostname source_labels: [sysName] - target_label: __address__ replacement: :9116  prometheus.yml SNMP Community値 種別(モジュール数)分 ここの記載を追加していく

Slide 14

Slide 14 text

14 BIGLOBE Inc. 作り方③(GrafanaでダッシュボードVariables設定)  構築手順① ※GrafanaからPrometheusの登録は事前に完了しておく DashBoardの作成画面を開き、「Dashborad Settings」 -> [Variables]を選択する。  構築手順② 下記一覧表に記載している三つの変数を作成して、「Save Dashboard」をして設定を保存する。 ※[参考]Variables定義画面を参照 Name DescPhrase Hostname Interface Type Text box Query Query Data source - prometheus prometheus Query - ifDescr{ifAlias=~"(.*$DescPhrase.*?) "} ifDescr{ ifAlias=~"(.*$DescPhrase.*? )", instance=~"(.*$Hostname.*?)"} Regex - .*instance="(.*?)".* .*ifName=*"(.*?)".* Multi-Value - Enable Enable 作成するVariables一覧 この設定でキーワード検索部分の機能を実現。 ※Queryで参照する時系列データをPromQLで検索し、Regexで狙ったパラメータのみを抽出している。

Slide 15

Slide 15 text

15 BIGLOBE Inc. [参考]Variables定義画面

Slide 16

Slide 16 text

16 BIGLOBE Inc. 作り方④(グラフ作成) InterfaceのInputトラフィックレート InterfaceのOutputトラフィックレート Query Prometheusサーバを選択 ※事前にGrafanaの設定でPrometheusサーバを登録しておく Prometheusサーバを選択 ※事前にGrafanaの設定でPrometheusサーバを登録しておく Metrics (PromQL) irate(ifHCInOctets{ifAlias=~".*$DescPhrase.*?", instance=~"$Hostname", ifName=~"$Interface"}[2m]) * 8 irate(ifHCOutOctets{ifAlias=~".*$DescPhrase.*?", instance=~"$Hostname", ifName=~"$Interface"}[2m]) * 8 Visualization Left Y -> Unit -> Data Rate -> bits/sec Left Y -> Unit -> Data Rate -> bits/sec 備考 prometheus.ymlのscrape_intervalの二倍の値を赤字部分に 指定する。 prometheus.ymlのscrape_intervalの二倍の値を赤字部分に 指定する。 PromQLでのトラフィックレート集計はirate関数(従来の監視ツールのトラフィックレートと同等の値を算出)を利用。 Variablesで指定した各キーワードを条件に指定して、合致するデータを描写している  構築手順① DashBoardの作成画面にて、「Add Query」を選択する  構築手順② 下記一覧表に記載している三つの設定を投入して、グラフを作成する。 ※[参考]グラフ作成画面を参照 グラフ定義一覧

Slide 17

Slide 17 text

17 BIGLOBE Inc. [参考]グラフ作成画面

Slide 18

Slide 18 text

18 BIGLOBE Inc. さいごに  Prometheusを使うと、 従来のSNMP監視においてもインテリジェントなモニタリング・集計ができることを紹介しました。  しかし、公開されているPrometheusにおけるノウハウはサーバサイドの方が圧倒的に多く、 NW機器向けのノウハウは少ないのが現状です。  今回の発表でPrometheusでNW機器を監視される人が増えて、 より活発にノウハウ共有をしあうようになれれば幸いです。  よりハッピーになれる運用を目指していきましょう!

Slide 19

Slide 19 text

19 BIGLOBE Inc. ご清聴ありがとうございました