Xi IoT に Elasticsearch と Kibana を導入してみる
Xi IoT のデータ可視化に nats -> sqlite3 -> Flaskで何か作ってみようと思ったのですが、nats の扱いが思った以上メンドウ(流行ってない)な上、社内のイケメンに Elasticserch + Kibana の方がモテるっすて言われたので、こっちチャレンジすることに決めました
Elasticsearch 名前聞いたことあるけど、なんだか小難しそうなイメージがありました
とりあえずこんなイメージを持ちながら導入方法を検討です
Xi IoT + Elastic シリーズ
・Xi IoT に Elasticsearch と Kibana を導入してみる(←イマココ)
・【Xi IoT】Elastic Beats で データシッピング その1 Xi IoT上で動かす
・【Xi IoT】Elastic Beats で データシッピング その2 Kafka連携
・【Xi IoT】Elastic Beats で データシッピング その3 ingestノードでデータ整形
==各バージョン===
Xi IoT 1.18
Elastic 7.8(Elasticsearch/Kibana)
=====================
まずお手軽に設置方法を探そうと公式サイト訪れてみるも、なんだかいろんな製品があるようで、迷子です
www.elastic.co
「インストール」をクリックしていってもインストール方法はすぐには出てこない(´・ω・`)
とはいえ、一からインストールつもりはないので「Docker elasticserch」あたりでググってみるとそれっぽいものが
公式サイトの Install Elasticserch with Docker
Dockerhub の Elasticserch公式コンテナ
(Elastic Cloud on Kubernetes というのもひっかかりますが、これはなんなのかよく分かってない)
Xi IoTやるようになってから、とりあえずなんでもDocker image探すことにも慣れてきました
kubernetes 初心者としては、Docker コンテナイメージがあればKubernetes でも簡単に動かせるんじゃない?、と安易に試してみます
Elasticsearch を Docker でデプロイ
まずはコンテナイメージをゲット
docker pull elasticsearch:7.8.0
"Starting a single node cluster with Docker"という記述があるので、Elasticsearch は普通クラスタで動くもんなんだと知りましたが、お試しではシングルノードで動かせるようなので、とりあえずシングルで
$ docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag
はじめての elasticserch コマンド
9200でポートあけてあるので、とりあえずcurl 投入して状況を確認
$ curl http://localhost:9200/ { "name" : "2f83510e860b", "cluster_name" : "docker-cluster", "cluster_uuid" : "ewIfcmlGSqOLERH8A2t7sQ", "version" : { "number" : "7.8.0", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "757314695644ea9a1dc2fecd26d1a43856725e65", "build_date" : "2020-06-14T19:35:50.234439Z", "build_snapshot" : false, "lucene_version" : "8.5.1", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
返事が返ってくるのでうまくいってるようです
初めてのポスト [ "message" : "test test" ]をしてみます、indexとtype(DBでいうところの Database と Table)は、なければ勝手に作ってくれます
$ curl -H "Content-Type: application/json" -XPOST 'localhost:9201/test_index/_doc/1?pretty' -d '{"message": "test test"}' { "_index" : "test_index", "_type" : "_doc", "_id" : "1", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 0, "_primary_term" : 1 }
Type の中身を確認
ちゃんと message に test って入ってます
$ curl -XGET 'localhost:9201/test_index/_doc/1?pretty' { "_index" : "test_index", "_type" : "_doc", "_id" : "1", "_version" : 2, "_seq_no" : 1, "_primary_term" : 1, "found" : true, "_source" : { "message" : "test test" } }
Index もついでに確認
$ curl -XGET 'localhost:9201/_cat/indices' yellow open test_index 7EM8thblQTS58DOhdsOv4w 1 1 1 0 6.9kb 6.9kb
Docker でのテストは成功のようなので Kubernetes の yaml に落とし込みます
公式の docker-compose.ymlを参考にデータを貯め込んでいく用の PV もつけておきます
apiVersion: v1 kind: Service metadata: name: elasticsearch spec: selector: app: elasticsearch ports: - name: rest port: 9200 - name: inter-node port: 9300 --- apiVersion: "apps/v1" kind: "StatefulSet" metadata: name: elasticsearch spec: serviceName: elasticsearch selector: matchLabels: app: elasticsearch replicas: 1 template: metadata: name: elasticsearch labels: app: elasticsearch spec: terminationGracePeriodSeconds: 10 containers: - name: elasticsearch image: elasticsearch:7.8.0 ports: - containerPort: 9200 env: - name: "discovery.type" value: "single-node" volumeMounts: - name: es-data1 mountPath: /usr/share/elasticsearch/data volumeClaimTemplates: - metadata: name: es-data1 spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 2Gi
kibana も一緒に kubernetes へ
Kibana Docker でググってみると Docker でのデプロイ方法がかかれているので、参考の Kubernetes yaml を書いてみます
Install Kibana with Docker
https://hub.docker.com/_/kibana
statefulset なのはなんとなく(ダメなのかな)
apiVersion: v1 kind: Service metadata: name: kibana spec: selector: app: kibana ports: - name: http port: 5601 --- apiVersion: "apps/v1" kind: "StatefulSet" metadata: name: kibana spec: serviceName: kibana selector: matchLabels: app: kibana replicas: 1 template: metadata: name: kibana labels: app: kibana spec: terminationGracePeriodSeconds: 10 containers: - name: kibana image: kibana:7.8.0 ports: - containerPort: 5601
Xi IoT の Kubernetes Apps で動かす
Elastisearch と Kibana 両方合わせた yaml がこちら
Xi IoT 上のWebにアクセスするためのいつものお作法(socat を入れておきます)
あとは Kubernetes Apps に登録してみます
Kibana にアクセス
Kibana の Web画面に接続できたら成功です
http://<Service Domain IP>:5601
Try our sample data をクリックするとサンプルデータで遊べます
Sample flight data で表示される画面です
いきなりここまで見れるなんてわくわくしますね
Kibana から Elasticsearch へデータを POST
さきほどの curl コマンドで Erasticsearch へ送信したデータも Kibana の Dev tool からもっとちょっと簡単に扱えます
ここでコマンド(なんていうの?)を発行して、結果を参照できます
Xi IoT データパイプラインからのデータの送り方などに続く!