docker-composeを使ってElasticsearchとKibanaを立ち上げてみる

あけましておめでとうございます。僕の中では2019年はまだ9月くらいなんですが、世間はもう2020年に突入しているらしいですね。

半年ほど前にElasticsearchとKibanaを自宅のUbuntuマシンに入れてみたのですが、

  • 当時のマシンは何年も前のメモリ2GB(しかもDDR2)マシン(サーバ用途なので割と間に合ってた)
  • Elasticsearch/Kibanaを起動したら動かない置物と化す

ということでインストールだけして放置する事態が続いていました。

以前のエントリで述べた通りこのマシンがぶっ壊れ、新たなマシンを調達したことでメモリが8GBに増えたので再び動かしてみることに。

ゆくゆくは運用しているアプリケーションのログをリアルタイムで収集して可視化するところまで持っていきます。一応メトリックのモニタリングしたいなあとは思いつつもなかなか手を出さない状況が続いていたんですよね。

今回はとりあえずログを記録する部分を構成していきます。

つかうもの

ElasticsearchとKibana

Elastic StackはElastic社が提供するElasticsearch, Kibana, Beats, Logstashをまとめたプロダクト群を指します。

ElasticsearchはElastic社が提供するApache Luceneベースの分散型検索エンジンで、構造化データと非構造化データの両方に対応し、柔軟なクエリを実行したりスケーリングすることで大規模なデータ処理を行うことができます。

KibanaはElasticsearch上のデータを管理・可視化するツールで、Elasticsearchが備えるクエリ機能によってさまざまな角度からデータを見ることができます。

Docker

DockerはOSレベルで仮想化した環境をコンテナ単位で提供するソフトウェアです。
特定のサービスを実際のマシン上ではなく、コンテナ単位で実行することでシステム環境への変更を局所化し、1台のサーバで複数のサービスを分離して実行できます。
あるコンテナでの動作に問題が生じた場合、そのコンテナのみを削除することでそのほかの環境に影響を及ぼさずに済むといった利点があります。

ElasticsearchやKibanaを直接サーバに入れていると壊したりしたときに面倒そうなので、一度削除してから改めてDockerコンテナで動かすことにしました。docker-composeで複数のコンテナを1発立ち上げできるし気軽に壊せていいと思います。

環境構築

Ubuntu 18.04.2 LTS上に立てていきます。

Docker

Dockerの公式ドキュメントに沿ってコマンドを叩けばOK。

しかしそのまま利用しようとすると権限がないと怒られます。

 $ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.37/containers/json: dial unix /var/run/docker.sock: connect: permission denied

使うたびにsudoするのも煩雑ですが、自分をdockerグループに追加すれば解決します。

 $ sudo gpasswd -a user docker 

1度ログアウトしてからシェルを開きなおせば実行可能に。

docker-compose

公式ドキュメントでLinuxのタブを見ながら進めればOKです。
一応最新のバージョンをGitHubで確認したうえで必要に応じてURLのバージョン部分を変更します。

コンテナを立ち上げる

早速Elasticsearchの公式ドキュメントを見ながら以下のような感じにdocker-compose.ymlを記述。

version: '3'
services:
  es:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.5.1
    ports:
      - 9200:9200
    environment:
      - discovery.type=single-node
      - node.master=true
      - node.data=true
      - xpack.security.enabled=false
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms2048m -Xmx2048m"
    volumes:
      - esdata:/usr/share/elasticsearch/data
    ulimits:
      memlock:
        soft: -1
        hard: -1
    logging:
      driver: 'json-file'
      options:
        max-size: '10m'
        max-file: '3'
  kibana:
    image: docker.elastic.co/kibana/kibana:7.5.1
    ports:
      - 5601:5601
    environment:
      ELASTICSEARCH_HOSTS: http://es:9200

volumes:
  esdata:
    driver: local

Kibanaの設定においてElasticsearchのホストは設定でつけたサービス名(es)として指定します。
あくまでもElasticsearchが動いているのはesコンテナであるため、ここでlocalhostと指定するとKibanaのコンテナ自身を指すので注意が必要です。
またElasticsearchは基本的に複数のノードで1クラスタを構成しますが、個人のテスト用途なのでdiscovery.type=single-nodeの指定が入っています。

また、メモリはswapさせないほうがいい(公式曰く「Swapping Is the Death of Performance」)のでbootstrap.memory_lock=trueを指定しています。
http://localhost:9200/_nodes/process?prettyでmlockallがtrueになればOK。

docker-compose up -dで立ち上げた後、しばらく待ってからホストの9200番ポートにアクセスしてみると起動していることが確認できます。

{
  "name" : "35cd35ec72c0",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "0xeGot0JTn-icxJ5RPVigw",
  "version" : {
    "number" : "7.5.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "3ae9ac9a93c95bd0cdc054951cf95d88e1e18d96",
    "build_date" : "2019-12-16T22:57:37.835892Z",
    "build_snapshot" : false,
    "lucene_version" : "8.3.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

同様に5601番ポートをブラウザで開くとダッシュボードが出現しますが、準備ができていないとKibana server is not ready yetとだけ表示されます。
KibanaコンテナのログでNo living connectionsと出力される間は待っておく必要があります。

Welcome to Kibana

特にインデックスが作成された後に起動するとマスター選出とシャードの配置を待ってからでないとKibanaが動き出さないっぽいです。思ってたより時間がかかる印象(single-nodeなのに)。

/_cat/shards?h=index,shard,prirep,state,unassigned.reasonを叩くとstateがUNASSIGNED、resasonがCLUSTER_RECOVEREDとなっているシャードが出ている間は一服したほうが良さげ。
ただし、single-nodeではレプリカは必ずUNASSIGNEDになるのでcurl http://localhost:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason | awk '$3=="p"' | lessで確認したほうが楽そう。

ElasticsearchとKibanaの起動が確認できたので、次回はElasticsearchにログを投入してみます。

Leave a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です