Edited at

Ubuntu18へのElasticStackインストール


概要

久々にElasticsearch達をインストールしたら思わずハマったので、記録に残します。

以下の想定となっています。


  • OS


    • Ubuntu18



  • ElasticStack


    • Elasticsearch 6.3.2

    • Kibana 6.3.2

    • Logstash 1:6.3.2-1


      • リポジトリを足して入れる。アップデートしやすい、はず?






エグゼクティブサマリ(?)


  • Javaを入れる場合、openjdk-8-jdk を使う事


    • openjdk-11-jdkやdefault-jdk(中身はopendjk-11)を利用すると、 logstashのインストール に失敗します。



  • JAVA_HOME、なくても動くっぽい

  • リポジトリ追加する方法の方が、安全だしアップデートしやすそう


インストール


Javaのインストール

まずはJavaを入れる必要がある。


  • openjdk-11-jdk を入れると、Elasticsearch, Kibana までは問題ないが、logstashを入れる際に /etc/logstash/..にアクセス権がない のようなエラーメッセージで、 apt-get install ができない。

openjdk-11の中身は10.0.1系のようだが、少なくとも「リポジトリを使ったlogstashのインストール」では問題が出るようだ。tar.gz版は試していませんので、問題ない可能性もあります。

サポートマトリックスを見ると、Logstashはopenjdk9以降には対応していないですね。Jun Ohtaniさん、指摘をありがとうございます!

なので、openjdk8を使いましょう!(これが言いたくてこの記事書いた)


install-Java

$ sudo apt-get install openjdk-8-jdk

$ java -version


Elasticsearchのインストール

apt-get install でエラーが出る場合は、Javaを入れていないはず。


install-elasticsearch

$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

$ sudo apt-get install apt-transport-https
$ echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
$ sudo apt-get update && sudo apt-get install elasticsearch
$ sudo vi /etc/elasticsearch/elasticsearch.yml
# add configuration
network.host:0.0.0.0
$ sudo systemctl start elasticsearch
$ systemctl status elasticsearch
$ sudo systemctl enable elasticsearch

一応稼働確認として curl "http://localhost:9200/" でアクセスができることを確認。

IPv6が有効な場合、503が返ってアクセスできていないことがある。その際は、IPv6無効とか、調整が必要。


ipv6Disable

$ sudo vi /etc/sysctl.conf

# add configuration
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
$ sudo sysctl -p
(うまく行かないようなら、reboot)


Kibanaのインストール

これは特にエラーは出ないはず。インストール直後のタイミングによっては503が返るので、その場合はealsticsearchがきちんと動いていることを確認する。


install-kibana

$ sudo apt-get install kibana

$ sudo vi /etc/kibana/kibana.yml
server.host: "0.0.0.0"
$ sudo systemctl start kibana
$ systemctl status kibana
$ sudo systemctl enable kibana

確認は、http://localhost:5601/などへのアクセス。


Logstashのインストール

インストール時にエラーが出る場合、openjdk-8-jdkを使っているか(openjdk-11やdefault-jdkを使っていない事)を確認する。

パッケージでjavaを入れると JAVA_HOME環境変数 が無いが、動く。


install-logstash

$ sudo apt-get install logstash

$ sudo systemctl start logstash
$ systemctl status logstash
$ sudo systemctl enable logstash


syslogを受ける場合

syslogを受信する場合は logstashが 514/UDP のポートにbindされる必要が有る。

しかしながら、非rootが特権ポートにプログラムをbindすることができないため、起動後に 514/UDP のbindが失敗する。

[YYYY-MM-DDTHH:MM:SS,NNN][INFO ][logstash.inputs.udp      ] Starting UDP listener {:address=>"0.0.0.0:514"}

[YYYY-MM-DDTHH:MM:SS,NNN][ERROR][logstash.inputs.udp ] UDP listener died {:exception=>#<SocketError: bind: name or service not known>, :backtrace=>["org/jruby/ext/socket/RubyUDPSocket.java:200:in `bind'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-udp-3.3.4/lib/logstash/inputs/udp.rb:116:in `udp_listener'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-udp-3.3.4/lib/logstash/inputs/udp.rb:68:in `run'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:409:in `inputworker'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:403:in `block in start_input'"]}
[YYYY-MM-DDTHH:MM:SS,NNN][WARN ][logstash.runner ] SIGTERM received. Shutting down.

回避策は2つ有り、1. rootでlogstashを動かす、2. iptablesで別ポート(5514/UDP等)に転送してしまう。


  • logstashをrootで動かす


    • パッケージの場合、Ubuntuなどの場合は/etc/systemd/system/logstash.service などに起動ユーザが「logstash」とされている。その為、これを User=root などとして、root起動に変更する

    • logstashがroot権限で動くので、一義的なリスクは増加する可能性あり



  • iptables


    • スマートじゃないよね。




終わりに

今後のJavaはどうなるかよくわからないが、現時点ではopenjdk-8 を使うのが安全。

Logstashがopenjdk-11で動くなら移行してもいいかもしれない。

また、たまたま私の環境とタイミングでopenjdk-11では動かなかっただけかもしれないので、まずはjdk11でトライしてみるのが良いかもしれないです。



  • apt-get remove openjdk-11-jdk openjdk-11-jre ; apt autoremove で消しされる。その後 $ java がエラーになれば、消え去ったはず(ゴミファイルは気にしない)。