Arista + Openconfigbeat で試す OpenConfig gNMI ベース Telemetry
はじめに
やること
個人でもサクッと入手できる実装が整ってきている感じなので、軽く試してみます。
これまでは gRPC server 側に追加パッケージが必要かつ個人アカウントでは取得できない、とか gRPC client の実装が大変(& 個人で実装している特定 NOS 向け野良とか、メーカが出している自社 NOS 専用のはあったけど)とかで手を出しにくかったんですが、今やそんなこともなさそーだという。
以下やること概要
- OpenConfig の Telemety 動作を試す
gNMI (gRPC Network Management Interface)
ベースで動かす- gRPC client (collector) 側
- Arista の Openconfigbeat という OpenConfig 準拠(っぽい)ものを使う
- Elastic の Beats というフレームワークで実装されているので、Elasticsearch / Kibana との連携が楽
- gRPC server に subscribe して streaming push を受け取り、Elasticsearch にデータを叩き込む
- Arista の Openconfigbeat という OpenConfig 準拠(っぽい)ものを使う
- gRPC server 側
- Arista vEOS
- OpenConfig gNMI ベースで動かすのが手っ取り早そう & openconfigbeat のテストにはきっと EOS を使っているに違いない(Inteoperability でハマりにくそう)と推測したから
- Arista vEOS
- データ保持・視覚
- Elasticsearch + Kibana
- Beats ベースな openconfigbeat と組み合わせて使うのに、一番手っ取り早かったから
- Elasticsearch + Kibana
参考資料
- OpenConfig
- GitHub / openconfig/reference / gRPC Network Management Interface (gNMI)
- gNMI の仕様
- 3.5 Subscribing to Telemetry Updates
- 今回取り扱う「gRPC client (collector) が gRPC server (NW装置) に Subscribe 要求することで、以降 NW 装置からの update Push を受ける」動きの詳細が定義されている
- ちなみに
openconfig.proto
はdeprecated - and has been replaced with the gRPC Network Management Interface.
という扱いになっている
- GitHub / openconfig/public
YANG
データモデル
- GitHub / openconfig/reference / gRPC Network Management Interface (gNMI)
- Arista
- ARISTA EOS Central / OpenConfig 4.20.2.1F Release Notes
- (v)EOS 側の OpenConfig 情報全般
- (v)EOS を gRPC server として動かすための設定方法
- 準じている OpenConfig の仕様/バージョン
- 対応している YANG モデルの Path 一覧
- (v)EOS 側の OpenConfig 情報全般
- Github / aristanetworks/openconfigbeat
- 今回使う Openconfig client 実装
- 単に Arista の人が作っているというだけで、実装としては OpenConfig 準拠で 非 ARISTA な gRPC server も取り扱えそう
- Elastic の Beats というプラットフォームで実装されているので、サクッと Elasticsearch に叩き込むところまでやってくれる
- Elastic 公式 / Beats
- GitHub / elastic/beats
- Elastic 公式 / Community Beats
- Beats の各種コミュニティが並んでおり、openconfigbeat もここに並んでいる
- Elastic 公式ブログ / 09 OCTOBER 2016 / Brewing in Beats: New community Beat for network devices
- 冒頭に
New community beat: Openconfigbeat
としてサラリと紹介されている
- 冒頭に
- ARISTA EOS Central / OpenConfig 4.20.2.1F Release Notes
環境情報
Arista EOS 側
いつも通りの vEOS-lab
vEOS01#show ver Arista vEOS Hardware version: Serial number: System MAC address: 0c00.da26.7071 Software image version: 4.20.1F Architecture: i386 Internal build version: 4.20.1F-6820520.4201F Internal build ID: 790a11e8-5aaf-4be7-a11a-e61795d05b91 Uptime: 21 minutes Total memory: 2017260 kB Free memory: 1232576 kB
Openconfigbeat 側
$ cat /etc/os-release NAME="Ubuntu" VERSION="18.04 LTS (Bionic Beaver)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 18.04 LTS" VERSION_ID="18.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=bionic UBUNTU_CODENAME=bionic $ uname -a Linux ocb 4.15.0-23-generic #25-Ubuntu SMP Wed May 23 18:02:16 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Openconfigbeat をビルドするのに go と glide が必要です(が GitHub にビルド済のファイルもあるし、Docker でも動くようなので、動かし方によっては必要ない)
$ go version go version go1.10.1 linux/amd64 $ glide --version glide version 0.13.1-3
とってきた Openconfigbeat は以下
$ git show commit 32d071a8bdaf7f7f2b3aa8e504d171c888a14113 (HEAD -> master, origin/master, origin/HEAD) Author: Giuseppe Valente <gvalente@arista.com> Date: Wed Mar 14 12:21:13 2018 -0700 docker: download latest release Change-Id: I3015b84b6f438bba8ddb884e2f332fad4f5e16e1
Elasticsearch + Kibana 環境
Elasticsearch と Kibana は docker でテキトーに動かします。母艦のサーバとしては、Openconfigbeat と相乗りです。
$ docker --version Docker version 18.03.1-ce, build 9ee9f40 $ docker-compose --version docker-compose version 1.21.2, build a133471
Elasticsearch も Kibana も 6.2.4
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 99fc3355e3b6 docker.elastic.co/kibana/kibana:6.2.4 "/bin/bash /usr/loca…" 4 days ago Up 4 days 0.0.0.0:5601->5601/tcp kibana 69663eaabc79 docker.elastic.co/elasticsearch/elasticsearch:6.2.4 "/usr/local/bin/dock…" 4 days ago Up 4 days 0.0.0.0:9200->9200/tcp, 9300/tcp elasticsearch $ curl -XGET 'http://localhost:9200' { "name" : "r5cOGL4", "cluster_name" : "docker-cluster", "cluster_uuid" : "wMLRO2rxT0aUX2WrcybkSw", "version" : { "number" : "6.2.4", "build_hash" : "ccec39f", "build_date" : "2018-04-12T20:37:28.497551Z", "build_snapshot" : false, "lucene_version" : "7.2.1", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" }
動かす
Elasticsearch + Kibana 環境 構築
今回は openconfigbeat と同じサーバ上で virtualenv で動かしている docker-compose を使って立ち上げました。以下が使った docker-compose.yml
version: '3' services: elasticsearch: container_name: elasticsearch image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4 environment: - cluster.name=docker-cluster - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - esdata1:/usr/share/elasticsearch/data ports: - 9200:9200 kibana: container_name: kibana image: docker.elastic.co/kibana/kibana:6.2.4 ports: - 5601:5601 environment: SERVER_NAME: ocb ELASTICSEARCH_URL: http://<母艦のIPアドレス>:9200 volumes: esdata1: driver: local
vEOS 側
ARISTA EOS Central / OpenConfig 4.20.2.1F Release Notes を参考に gNMI ベースで動かす設定を入れるだけです。
vEOS01(config)#management api gnmi vEOS01(config-mgmt-api-gnmi)#transport grpc ? WORD transport name vEOS01(config-mgmt-api-gnmi)#transport grpc TEST-vEOS01 vEOS01#bash [kotetsu@vEOS01 ~]$ [kotetsu@vEOS01 ~]$ ss -natu | grep 6030 tcp LISTEN 0 1024 :::6030 :::*
これで Openconfigbeat (gRPC client)からの Subscribe 要求を受ける server 動作をしている筈。
なお、Openconfigbeat 側からの user / password 認証を受けられるように、アカウントは作っておきます(ssh とかして設定している時点で、それは済んでいる筈...)。
ちなみに、プロセスやらログやらを眺めていると vEOS 上で動く server 実装も Go みたいです。今まで vEOS 上で動くもろもろって Python ばかりだった気がしますが。
Openconfigbeat 側
ビルド環境準備
前述の通り GitHub にビルド済のファイルもあるし、Docker でも動くようなので、動かし方によっては必要ないですが。今回はビルドからやっていきます。
まずは Openconfigbeat をビルドするための requirements に入っている go と glide をば。以下を参考にパパッと。
$ sudo apt install -y software-properties-common $ sudo add-apt-repository ppa:gophers/archive $ sudo apt install -y golang-1.10-go $ echo "export PATH=$PATH:/usr/lib/go-1.10/bin/" | sudo tee /etc/profile.d/golang.sh $ sudo apt install -y golang-glide
本筋ではないですが、久々に glide を使ったら前述の glide README に以下の表記が...。
The Go community now has the dep project to manage dependencies. Please consider trying to migrate from Glide to dep. If there is an issue preventing you from migrating please file an issue with dep so the problem can be corrected. Glide will continue to be supported for some time but is considered to be in a state of support rather than active feature development.
設定作成~ビルド
まずは GitHub から clone してきて
$ mkdir -p /home/kotetsu/go/src/github.com/aristanetwork $ cd /home/kotetsu/go/src/github.com/aristanetworks/ $ git clone https://github.com/aristanetworks/openconfigbeat.git $ cd openconfigbeat/
<git clone してきた dir>/_meta/beat.yml
が設定ファイルなので、必要な情報を書き換えます。
$ more ~/go/src/github.com/aristanetworks/openconfigbeat/_meta/beat.yml ################### Openconfigbeat Configuration Example ######################### ############################# Openconfigbeat ###################################### openconfigbeat: # The addresses of the OpenConfig devices to connect to. addresses: ["10.0.0.171"] # The OpenConfig paths to subscribe to. paths: ["/"] # The default port to connect to if none is configured. default_port: 6030 # The username on the device. username: "kotetsu" # The password for the user on the device. password: "kotetsu"
上の例だと、以下の感じ。
openconfigbeat
- gRPC server の情報
addresses
- vEOS の IP アドレスを配列で書き連ねる
paths
- suvscribe するツリーの指定
/
にしておけば、とれるもんは全部送ってもらえるようになる筈
default_port
- vEOS 側で設定変更していないデフォルトなら
6030
- vEOS 側で設定変更していないデフォルトなら
username
とpassword
- vEOS のアカウント情報
また <git clone してきた dir>/openconfigbeat.yml
にデフォルト値っぽいのが定義されているので そこに定義されている output.elasticsearch: hosts: ["localhost:9200"]
は明示的に指定しておりません。(今回は Kibana も Openconfigbeat とサーバ相乗りしているので)
何も指定せずに <git clone してきた dir>/
で make
すればビルドされて openconfigbeat
というファイルが出来ます。
$ make $ file openconfigbeat openconfigbeat: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=33438dfebfda1d7a42d3a0ad3db140fbf8b47ff8, stripped $ chmod go-w openconfigbeat.yml
Usage
$ ~/go/src/github.com/aristanetworks/openconfigbeat/openconfigbeat -h Usage: openconfigbeat [flags] openconfigbeat [command] Available Commands: export Export current config or index template help Help about any command keystore Manage secrets keystore run Run openconfigbeat setup Setup index template, dashboards and ML jobs test Test config version Show current version info Flags: -E, --E setting=value Configuration overwrite -N, --N Disable actual publishing for testing -c, --c string Configuration file, relative to path.config (default "openconfigbeat.yml") --cpuprofile string Write cpu profile to file -d, --d string Enable certain debug selectors -e, --e Log to stderr and disable syslog/file output -h, --help help for openconfigbeat --httpprof string Start pprof http server --memprofile string Write memory profile to this file --path.config string Configuration path --path.data string Data path --path.home string Home path --path.logs string Logs path --plugin pluginList Load additional plugins --setup Load the sample Kibana dashboards --strict.perms Strict permission checking on config files (default true) -v, --v Log at INFO level Use "openconfigbeat [command] --help" for more information about a command.
以下で設定確認
$ ~/go/src/github.com/aristanetworks/openconfigbeat/openconfigbeat export config openconfigbeat: addresses: - localhost default_port: 6042 paths: - / output: elasticsearch: hosts: - localhost:9200 path: config: /home/kotetsu/go/src/github.com/aristanetworks/openconfigbeat data: /home/kotetsu/go/src/github.com/aristanetworks/openconfigbeat/data home: /home/kotetsu/go/src/github.com/aristanetworks/openconfigbeat logs: /home/kotetsu/go/src/github.com/aristanetworks/openconfigbeat/logs setup: kibana: null
起動
先ほどビルドしたものを実行して、起動します。以下のようにやれば、フォアグラウンド動作・stdout に PUSH されてきた情報など垂れ流されます。
$ ./openconfigbeat -e -d openconfigbeat.go
様子を見る
ここからは Kibana で様子を見ていきます。
設定空っぽの Kibana の WebUI にアクセスすると「はよ Index 作れ」と促されるので、言われるがままに Openconfigbeat が投げ込んでくるやつ用の Index Pattern を作っておきます。
そうすると、Discover
のところでデータがズラズラと出てくるので
ポチポチと様子見用の search とか Visualize とか Dashboard を作りました。今回は「vEOS の特定物理インターフェースを流れる in-octets と in-unicast-pkts (累計)」を。
何で累計かというと、Kibana で Timelion とか使って bps なり pps の算出設定をするのが面倒くさかったからです。(個人的に、その手の設定は Grafana の方がなんぼか楽)
で、平常時は LLDP と BGP KeepAlive くらいしか流れていない当該物理インターフェースに、13s 程度だけトラフィックを流してみると
16:06:02 - 16:06:15
くらいの間だけ、vEOS 側がインターフェースカウンタの上昇に合わせて 1s 間隔程度で push してきてくれている様子が見て取れました。(グラフの丸部分の間隔がその時だけ狭まっている)
おしまい
ダラダラと所感を。
- gNMI と YANG に準拠してくれている(っぽい) OpenConfigbeat ならば、それに準拠している NOS ならば一元的に collector 動作してくれそうな匂いを感じとった
- 何せ vEOS しか試せていないので...
- Elastic の Beats というフレームワークは(自分で実装したわけじゃないけど)、fluentd プラグインと同じように使えそう
- Ruby より Go が良いとか、fluentd のバージョン対応どうしようとか、そういう開発者には良いのかも
- Telemetry でよく言われる「バーストトラフィック検知」は Openconfig ベースなものでも実現できそうな気がする
2018/07/22
時点の感触としては、データモデルが YANG 準拠な分、メーカ独自に自分たちの NOS 向けに作りこんでいる仕組みには取得できる情報観点では及ばなさそう- 一例として、以前試した 「Nexus9000v で Telemetry」 だと Cisco 独自のデータモデルを使っているので、結構細かい情報も取れていた
- 目的がハッキリしているならば、現時点でもそれなりに使えそうな感はある