Fluentd / Elasticsearch / kibanaのインストール (単純に覚え書き)

## やりたいこと / やること

- インターネットの疎通が無いUbuntuにFluentd, Elasticsearch, Kibanaをインストールする
- 簡単な動作確認をする
- 実際の運用・利用を想定した設定はここでは扱わない

Kibanaを設定したいサーバからは、インターネットへの接続がないという制約があり、他のPCから公式サイトのパッケージをダウンロード、対象サーバに転送してからパッケージ追加という流れを想定しています。

インターネットへの疎通がある場合は、apt-getで追加できると思いますが、最低限のパッケージで追加できるかどうかを確認するため手を動かしてみましたので、そのメモです。

## 事前の注意

Elasticsearch, Kibana を稼働させる場合、デフォルトだとメモリに関しての前提条件があります。（メモリの設定を低く抑えることができるとは思いますが...）

以下のような条件があります。

- メモリを2GB以上割り当てること
- Javaのランタイムを追加すること
 - JDKでなくJREでも可能
- ブラウザを通してKibanaの画面を参照する場合、デフォルトだとポートを解放する必要があるので注意
- Kibanaは port: 5601 でリクエストを受け取るのでポートを解放する必要あり
- Elasticsearchのport: 9200 もポートを解放する必要あり
 - KibanaのバックエンドのElasticsearchがWeb APIでKibanaにデータを返すため

## 必要なパッケージの確認手順

VirtualBox / Vagrantを使って検証します。

- 同じ構成の仮想マシンを用意
- 片方だけインターネットに接続可能な状態とし、apt-getではなく公式サイトからのパッケージ追加で構成を変更、確認
- もう片方のインターネット接続なしの仮想マシンでセットアップできることを確認する

### 参考：VagrantのMulti-Machine 設定を利用

それぞれ別のフォルダにVagrantfileを用意して、それぞれのディレクトリからvagrant sshすると面倒です。
公式サイトでは、[Multi-Machine](https://www.vagrantup.com/docs/multi-machine/) 環境として、このようなケースの設定方法が提示されていますので、そちらに従って実施します。

```rb
Vagrant.configure("2") do |config|
  config.vm.define :base do |base|
    base.vm.box = "ubuntu/xenial64"
    base.vm.network "private_network", ip: "192.168.50.4"
  end

  config.vm.define :sample do |sample|
    sample.vm.box = "ubuntu/xenial64"
    sample.vm.network "private_network", ip: "192.168.50.5"
  end
end
```

## ネットワークの疎通がない環境を作る

無理やりですが、デフォルトルートを削除することで、インターネットへの疎通を切ります。

### 1. route調整前

```
macos $ vagrant ssh sample
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-104-generic x86_64)

ubuntu@ubuntu-xenial:~$ /sbin/route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.0.2.2        0.0.0.0         UG    0      0        0 enp0s3
10.0.2.0        *               255.255.255.0   U     0      0        0 enp0s3
192.168.50.0    *               255.255.255.0   U     0      0        0 enp0s8

ubuntu@ubuntu-xenial:~$ ping -c 1 google.com
PING google.com (172.217.31.174) 56(84) bytes of data.
64 bytes from nrt12s22-in-f14.1e100.net (172.217.31.174): icmp_seq=1 ttl=63 time=31.3 ms

--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 31.350/31.350/31.350/0.000 ms
```

### 2. route調整後

pingが通らないことを確認。


```
ubuntu@ubuntu-xenial:~$ sudo /sbin/route del default

ubuntu@ubuntu-xenial:~$ ping -c 1 google.com
connect: Network is unreachable

$ /sbin/route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.2.0        *               255.255.255.0   U     0      0        0 enp0s3
192.168.33.0    *               255.255.255.0   U     0      0        0 enp0s8

```

インターネットへの疎通はなくなりますが、ホストOS側からのssh接続やファイル共有は可能。
今回はVagrantの機能を利用し、ゲストOS側の /vagrant/package/ というディレクトリにパッケージ一式を共有させます。

```
$ tree -L 2 .
.
├── Vagrantfile
├── package
│   ├── elasticsearch-6.1.1.deb
│   ├── jre-8u151-linux-x64.tar.gz
│   ├── kibana-6.1.1-amd64.deb
│   └── td-agent_3.1.1-0_amd64.deb
└── ubuntu-xenial-16.04-cloudimg-console.log

2 directories, 7 files
```

必要なパッケージとダウンロード方法は以下に続きます。

## 前提条件

### Javaの取得

Elasticsearchを利用するためには、Javaのランタイムが必要になります。
すでにJavaのランタイム、JDKが入っているのでしたら、この作業は不要です。
今回は、ネットワークの疎通が無いことを前提として、OracleからJREを取得し、設定を行っています。


#### 取得元

- OpenJDKまたはOracleのサイトからJDK (JRE)を取得、JAVA_HOMEを設定、パスも通すこと
- http://www.oracle.com/technetwork/jp/java/javase/downloads/jre8-downloads-2133155.html
- jre-8u151-linux-x64.tar.gz を利用

取得したパッケージは、ファイル共有もしくはscpで対象ホストに転送します。

#### 展開と配置

ホストに配置したら、展開します。
また、環境変数 JAVA_HOMEも設定します。
（Javaのコンパイルがいる場合はJDKになりますが、今回はJREのみにしています）

```
$ sudo mkdir /usr/java
$ sudo tar xvzf jre-8u151-linux-x64.tar.gz -C /usr/java

$ JAVA_HOME=/usr/java/jre1.8.0_151/
$ sudo update-alternatives --install /usr/bin/java java ${JAVA_HOME%*/}/bin/java 20000

$ java -version
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

$ ls -la /usr/bin/java
lrwxrwxrwx 1 root root 22 Dec 31 12:14 /usr/bin/java -> /etc/alternatives/java

```

/etc/profileにも設定しておきます。

```
export JAVA_HOME=/usr/java/jre1.8.0_151/
export PATH=$PATH:$JAVA_HOME/bin/

```


## fluentdのインストール

ひきつづき、パッケージの転送もしくはファイル共有で対応します。

#### 取得元

- https://docs.fluentd.org/v0.12/articles/install-by-deb (リポジトリを追加する場合)
- https://www.fluentd.org/download (パッケージで入れる場合)

今回は、ゲストOSがインターネットへの疎通が無いことが前提なので、以下のパッケージをダウンロードして転送して追加します。

- https://td-agent-package-browser.herokuapp.com/3/ubuntu/xenial/pool/contrib/t/td-agent

#### 展開と配置

ホストに配置したら、同様に展開します。

```
$ pwd
/vagrant/package

$ sudo dpkg -i elasticsearch-6.1.1.deb
Selecting previously unselected package elasticsearch.
(Reading database ... 67155 files and directories currently installed.)

... [中略] ...

Processing triggers for ureadahead (0.100.0-19) ...

```

#### systemdを有効にする

サービスの設定確認。追加段階ではdisabled。

```
$ sudo systemctl status td-agent
● td-agent.service - td-agent: Fluentd based data collector for Treasure Data
   Loaded: loaded (/lib/systemd/system/td-agent.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: https://docs.treasuredata.com/articles/td-agent
```

サービスを有効化、起動します。enabledの次に、startを実行。

```
$ sudo systemctl enable td-agent
Synchronizing state of td-agent.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable td-agent

... [中略] ...

$ sudo systemctl start td-agent
$ sudo systemctl status td-agent
● td-agent.service - td-agent: Fluentd based data collector for Treasure Data
   Loaded: loaded (/lib/systemd/system/td-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2017-12-31 12:32:32 UTC; 1s ago
     Docs: https://docs.treasuredata.com/articles/td-agent
  Process: 2257 ExecStart=/opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/


Dec 31 12:32:32 ubuntu-xenial systemd[1]: Starting td-agent: Fluentd based data collector for Treasure Data...
Dec 31 12:32:32 ubuntu-xenial systemd[1]: Started td-agent: Fluentd based data collector for Treasure Data.

```

ログは /var/log/td-agent/td-agent.log に生成されますので、起動後に確認してみてください。

## Elasticsearchのインストール


#### 取得元

- https://www.elastic.co/guide/en/elasticsearch/reference/current/deb.html
- https://www.elastic.co/downloads/elasticsearch

今回は、elasticsearch-6.1.1.deb を利用します。（環境に合わせて調整）

#### 展開と配置

こちらも同様に展開します。

```
$ sudo dpkg -i elasticsearch-6.1.1.deb
Selecting previously unselected package elasticsearch.

... [中略] ...

Processing triggers for ureadahead (0.100.0-19) ...
```

#### systemdを有効にする

サービスの設定確認。追加段階ではdisabled。

```
$ sudo systemctl status elasticsearch
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: http://www.elastic.co
```

サービスを有効化、起動します。enabledの次に、startを実行。

```
$ sudo systemctl enable elasticsearch
Synchronizing state of elasticsearch.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable elasticsearch
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.

$ sudo systemctl start elasticsearch
```

起動後、statusを確認します。
ここで status failed になって起動に失敗していたら、メモリが不足している可能性があります。
または、Javaのバイナリ、JAVA_HOMEが適切に設定されていない可能性があります。


```
$ sudo systemctl status elasticsearch
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: enabled)

... [中略] ...

      CPU: 5.219s
   CGroup: /system.slice/elasticsearch.service
           └─2437 /usr/bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -server -Xss1m -Djava.awt.head

Dec 31 12:47:40 ubuntu-xenial systemd[1]: Started Elasticsearch.

```


#### Elasticsearchの動作確認

正常に起動すると、Elasticsearchはデフォルトで port: 9200でListenします。

#### localhostからの確認

```
$ curl http://127.0.0.1:9200
{
  "name" : "9bMYH5X",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "ed92f8eBSxacJUhS9qG0yg",
  "version" : {
    "number" : "6.1.1",
    "build_hash" : "bd92e7f",
    "build_date" : "2017-12-17T20:23:25.338Z",
    "build_snapshot" : false,
    "lucene_version" : "7.1.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

```

curlやwgetで 127.0.0.1:9200 にHTTPリクエストを出すと、上記のようなjsonが返ります。
ただし、実際はlocalhost内ではなく他のサーバからのリクエストを受け付けるため、割り当てられたIPアドレスでアクセスできないといけません。

```
$ curl http://192.168.33.21:9200
curl: (7) Failed to connect to 192.168.33.21 port 9200: Connection refused

$ netstat -na|grep LISTEN |grep 9200
tcp6       0      0 127.0.0.1:9200          :::*                    LISTEN
tcp6       0      0 ::1:9200                :::*                    LISTEN
```

設定を調整します。

- /etc/elasticsearch/elasticsearch.yml の network.hostをコメントイン
- 値を0.0.0.0 （もしくはIPに応じた適切な値）に調整
- 設定後にサービスを再開


```
$ sudo vi /etc/elasticsearch/elasticsearch.yml

# network.hostはデフォルトでlocalhostのみなので、bind addressを適切に調整 (とりあえずワイルドカード）
network.host: 0.0.0.0

$ sudo systemctl stop elasticsearch
$ sudo systemctl start elasticsearch

$ netstat -na|grep LISTEN |grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN


$ curl http://192.168.33.21:9200
{
  "name" : "9bMYH5X",
  "cluster_name" : "elasticsearch"
  ... 中略 ...
  },
  "tagline" : "You Know, for Search"
}

```

作業しているUbuntuでファイアウォールやiptablesでのアクセス制御がかかっていなければ、別サーバや別マシンのブラウザから、9200番にリクエストを送ると、同様なJSONデータが返ります。

#### うまく起動していない時

curl http://127.0.0.1:9200 の結果が返ってこない、systemdでのstatusがfailedになっている場合、まずはメモリの不足が考えられます。
/var/log/elasticsearch/ を確認し、メモリが割り当てできないといったエラーが出ていたら、メモリの調整をします。

```
$ sudo vi /etc/elasticsearch/jvm.options

# デフォルトで2GBなので、メモリが潤沢でない場合は、実際のサイズに合わせて調整をしてください。

-Xms1g
-Xmx1g

# 調整後、サービスを再起動させます

$ sudo systemctl stop elasticsearch
$ sudo systemctl start elasticsearch
```


参考： http://www.karakaram.com/elasticsearch-memory-usage-reduce


## Kibanaのインストール

#### 取得元

- https://www.elastic.co/downloads/kibana
- https://artifacts.elastic.co/downloads/kibana/kibana-6.1.1-amd64.deb

#### 展開と配置

こちらも同様に展開します。

```
$ sudo dpkg -i kibana-6.1.1-amd64.deb
Selecting previously unselected package kibana.

... [中略] ...

Processing triggers for systemd (229-4ubuntu21) ...
Processing triggers for ureadahead (0.100.0-19) ...
```

#### systemdを有効にする

こちらもfluentd, elasticsearch同様に起動します。

```
$ sudo systemctl daemon-reload
$ sudo systemctl enable kibana.service
$ sudo systemctl start kibana.service

$ sudo systemctl status kibana.service
● kibana.service - Kibana
   Loaded: loaded (/etc/systemd/system/kibana.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2017-12-25 07:34:00 UTC; 1min 16s ago
 Main PID: 10328 (node)
    Tasks: 10
   Memory: 116.5M
      CPU: 5.150s
   CGroup: /system.slice/kibana.service
           └─10328 /usr/share/kibana/bin/../node/bin/node --no-warnings /usr/share/kibana/bin/../src/cli -c

```

#### 動作確認

正常に起動すると、Kibanaはデフォルトで port: 5601でListenします。

```
$ curl localhost:5601
<script>var hashRoute = '/app/kibana';
var defaultRoute = '/app/kibana';

var hash = window.location.hash;
if (hash.length) {
  window.location = hashRoute + hash;
} else {
  window.location = defaultRoute;

```

ですが、Kibanaもそのままでは外部からアクセスができません。

```
$ curl 192.168.33.21:5601
curl: (7) Failed to connect to 192.168.33.21 port 5601: Connection refused
```

Elasticearchと同様に、設定を調整します。

- $ sudo vi /etc/kibana/kibana.yml の network.hostをコメントイン
- 値を　"0.0.0.0" （もしくはIPに応じた適切な値）に調整
- 設定後にサービスを再開

```
#server.host: "localhost"
server.host: "0.0.0.0"
```

上記設定は、 server.host: 0.0.0.0 ではなく、 server.host: "0.0.0.0" として下さい！
うまくいくと、割り当てられたIPでのアクセスが可能になります。

```js
$ curl 192.168.33.21:5601
<script>var hashRoute = '/app/kibana';
var defaultRoute = '/app/kibana';

var hash = window.location.hash;
if (hash.length) {
  window.location = hashRoute + hash;
} else {
  window.location = defaultRoute;
}</script>
```
## Kibanaの画面の確認

192.168.33.21:5601 でブラウザからアクセスしてみます。
以下のような画面になればOKです。

![start-kibana.png](https://qiita-image-store.s3.amazonaws.com/0/27976/2bff9d79-5210-44cc-c7c8-0370fe7f60ee.png)

以上、簡単なメモでした。