konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

Xi IoT に Elasticsearch と Kibana を導入してみる

Xi IoT のデータ可視化に nats -> sqlite3 -> Flaskで何か作ってみようと思ったのですが、nats の扱いが思った以上メンドウ(流行ってない)な上、社内のイケメンに Elasticserch + Kibana の方がモテるっすて言われたので、こっちチャレンジすることに決めました

f:id:konchangakita:20200622003534p:plain

Elasticsearch 名前聞いたことあるけど、なんだか小難しそうなイメージがありました

とりあえずこんなイメージを持ちながら導入方法を検討です
f:id:konchangakita:20200623124808p:plain


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
f:id:konchangakita:20200622233735p:plain
「インストール」をクリックしていってもインストール方法はすぐには出てこない(´・ω・`)

とはいえ、一からインストールつもりはないので「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 でのテストは成功のようなので Kubernetesyaml に落とし込みます
公式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 に登録してみます
f:id:konchangakita:20200623002531p:plain

Kibana にアクセス

Kibana の Web画面に接続できたら成功です
http://<Service Domain IP>:5601
f:id:konchangakita:20200621204720p:plain

Try our sample data をクリックするとサンプルデータで遊べます
f:id:konchangakita:20200623003038p:plain

Sample flight data で表示される画面です
f:id:konchangakita:20200623003236p:plain
f:id:konchangakita:20200623003305p:plain

いきなりここまで見れるなんてわくわくしますね

Kibana から Elasticsearch へデータを POST

さきほどの curl コマンドで Erasticsearch へ送信したデータも Kibana の Dev tool からもっとちょっと簡単に扱えます

ここでコマンド(なんていうの?)を発行して、結果を参照できます
f:id:konchangakita:20200623112807p:plain


Xi IoT データパイプラインからのデータの送り方などに続く!