kakkotetsu

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 にデータを叩き込む
    • gRPC server 側
      • Arista vEOS
        • OpenConfig gNMI ベースで動かすのが手っ取り早そう & openconfigbeat のテストにはきっと EOS を使っているに違いない(Inteoperability でハマりにくそう)と推測したから
    • データ保持・視覚
      • Elasticsearch + Kibana
        • Beats ベースな openconfigbeat と組み合わせて使うのに、一番手っ取り早かったから

参考資料

環境情報

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
    • usernamepassword
      • 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 を作っておきます。

f:id:kakkotetsu:20180722220910p:plain

そうすると、Discover のところでデータがズラズラと出てくるので

f:id:kakkotetsu:20180722220853p:plain

ポチポチと様子見用の search とか Visualize とか Dashboard を作りました。今回は「vEOS の特定物理インターフェースを流れる in-octets と in-unicast-pkts (累計)」を。
何で累計かというと、Kibana で Timelion とか使って bps なり pps の算出設定をするのが面倒くさかったからです。(個人的に、その手の設定は Grafana の方がなんぼか楽)

で、平常時は LLDP と BGP KeepAlive くらいしか流れていない当該物理インターフェースに、13s 程度だけトラフィックを流してみると

f:id:kakkotetsu:20180722220928p:plain

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 独自のデータモデルを使っているので、結構細かい情報も取れていた
  • 目的がハッキリしているならば、現時点でもそれなりに使えそうな感はある
    • 例えば「SNMP Get や API での監視で 1-5 min 間隔なインターフェースカウンタや細かいデータ(NOS や HW に応じた監視項目や設定に応じた table 情報)を取得し、xflow で通信内容の傾向をつかめるようにはなっている」「が、バーストトラフィックの検知ができていないからそこを何とかしたい」というような場合、こういうのがピッタリと嵌りそう
    • 逆に、何もかもこの仕組みで賄おうとするのは(当面は)夢見すぎ感ある