raspberry piでfluentd + elasticsearch + kibana

raspberry pi上でdockerを動かして、fluentdとelasticsearchとkibanaを動かす方法

raspberry pi上でdockerをうごかす

hyperiotを使ってpi上でdockerコンテナを動かせるようにする。コンテナイメージはdocker hubでいっぱい公開されてるけど、pi上で動くものはそんなに多くない。rpiとかhypriotとかで探すといい具合。

hypriotイメージの書き込み

下記からイメージをダウンロードして、SDカードに書き込み。windowsならDDwinかなにかで書き込みを。

Downloads · Docker Pirates ARMed with explosive stuff

初期設定

SDカードに書き込んだら、そのままSDカードのルートディレクトリにあるdevice-init.yamlファイルを編集する。

ホスト名と、wifiを使う場合はSSID/パスワードを書き込み。家庭内でDDNSDHCPが動いていれば、ここで設定したホスト名が登録されるはず。

# hostname for your HypriotOS device
hostname: ホスト名

# optional wireless network settings
wifi:
  interfaces:
     wlan0:
       ssid: "SSID"
       password: "パスワード"

起動

作ったSDカードをraspberry piにセットして起動。hypriotのデフォルトのユーザー名とパスワードはpirate/hypriot。ホスト名でSSHするかHDMIをつなげて起動してIPアドレスを調べてもいい。

これでdockerが動く環境ができたので適当にdocker runしてみて動けばOK。

Elasticsearchを動かす

pi2上で動かす場合はメモリサイズをちょっと制限しておいたほうがいい感じ。

## 事前準備

dataディレクトリを作成する。

sudo mkdir /elasticsearch
sudo chown pirate /elasticsearch

esのコンテナを一度実行。これで/elasticsearch内に必要なファイルができる。

docker run -d -e ES_HEAP_SIZE=128m -p 9200:9200 -p 9300:9300 -v /elasticsearch:/data docker pull rpidockers/elasticsearch:1.7.1
docker ps
docker stop <<上記で確認したコンテナのID>>

設定ファイルの修正

/elasticsearch/config/elasticsearch.ymlをよしなに設定。

例えば

#bootstrap.mlockall: true

を有効化

bootstrap.mlockall: true

esの起動

ES_HEAP_SIZEを小さめにするために環境変数として指定。

docker run -d -e ES_HEAP_SIZE=128m -p 9200:9200 -p 9300:9300 -v /elasticsearch:/data rpidockers/elasticsearch:1.7.1

esの起動

dockerのお作法に基づき、環境変数を渡す形で

docker run -d -e ES_NETWORK_PUBLISH_HOST=192.168.11.202 -e ES_CLUSTER_NAME=tamurake -e ES_HEAP_SIZE=128m -p 9200:9200 -p 9300:9300 -v /elasticsearch:/data rpidockers/elasticsearch:1.7.1

ちなみに2台目以降はunicastでクラスタに入るために、ES_UNICAST_HOSTSを追加してあげる

docker run -d -e ES_NETWORK_PUBLISH_HOST=192.168.11.214 -e ES_CLUSTER_NAME=tamurake -e ES_UNICAST_HOSTS=[\"192.168.11.202\"] -e ES_HEAP_SIZE=128m -p 9200:9200 -p 9300:9300 -v /elasticsearch:/data rpidockers/elasticsearch:1.7.1

kibanaを動かす

上で起動したESを指定してkibanaを起動する

docker run -d -p 5601:5601 -e ELASTICSEARCH=<<接続するESのIPアドレス>>:9200 rpidockers/kibana

fluentdを起動する

elasticsearchとmqtt、SNMPとdriveを入れたfluentdのコンテナを作ったので、それを使う。

事前準備

configファイルを作成する。/fluentd/fluent.conf こんな感じ?

<source>
  type mqtt
  host <<mqttサーバ>>
  port <<mqttサーバのポート>>
  topic '/sensor/+'
  username <<mqttサーバのユーザー名>>
  password <<mqttサーバのパスワード>>
  format json
</source>

<match .sensor.sensor>
  type elasticsearch
  host <<esサーバ>>
  port 9200
  logstash_format true
  logstash_prefix sensor
</match>

<source>
  type snmp
  tag snmp.apart.nas.eth0.in
  nodes name, value
  host <<エージェント>>
  community <<community名>>
  mib ifHCInOctets.2
  method_type get
  polling_time 10
  polling_type async_run
</source>

<filter snmp.**>
  type record_transformer
  <record>
    obj ${tag}
  </record>
</filter>

<match snmp.**>
  type derive
  add_tag_prefix derive
  key1 value *8
  min 0
</match>

<match derive.snmp.**>
  type elasticsearch
  host <<esサーバ>>
  port 9200
  logstash_format true
  logstash_prefix snmp
</match>

fluentdの起動

docker run -d -v /fluentd:/fluentd/etc gorakuru/rpi-fluentd-mqtt-elasticsearch

kibanaで可視化

あとはesにたまったデータをkibanaで自由に表示してください!

f:id:gorakuru:20170107220641p:plain

参考にしたページ