Docker-composeでElastic Stackを構築する

# Elastic Stack
今回は`Beats`で様々なログを収集。`elasticsearch`に格納。`kibana`で可視化する環境までを`docker-compose`で構築します。

docker-composeで構築するモチベーションとしては

- `docker`を使って簡単にデプロイ
- `docker-compose`だと構築設定をファイルで保存できる

なお、docker使わないで構築するならばElastic Stackは[Elastic Stack製品ページ](https://www.elastic.co/jp/products/)からダウンロードして使うことができます。

本記事では手順のみ示します。設定ファイルの内容はドキュメントを読んで理解してください。

また、この記事で記している設定はあくまでも、お試し用です。本番運用の際は様々な観点からチューニングする必要があります。

### 構築環境

構築に使用した環境は以下の通り

 - CentOS Linux release 7.4
 - Docker version 18.03.1-ce, build 9ee9f40
 - docker-compose version 1.22.0, build f46880fe

### 構成図

雑ですが、構築するElastic Stackの構成図です。各サーバーに`MetricBeat`を設置し、`10.0.0.1`サーバーにログを集約。`kibana`を通してダッシュボードを閲覧します。

![kousei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235984/93a08f43-e8c8-6ae4-2d9c-af48ce45de6b.png)


## Elastic Stack構築手順

### dockerとdocker-composeをインストール
- `docker`と`docker-compose`をインストール（インストール方法は省略）

### `elasticsearch`と`kibana`をdockerを構築
- 以下のように`docker-compose.yml`を用意
    - 注）dockerボリュームを使ってデータを永続化している
- 上記`docker-compose.yml`を置いたディレクトリで`docker-compose up -d`を実行

```yml:docker-compose.yml
version: '2'
volumes:
  elastic:
    driver: 'local' 

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.1.1
    expose:
      - 9200
    ports:
      - "9200:9200"
      - "9300:9300"
    tty: true
    environment:
      discovery.type: single-node
    volumes:
      - elastic:/usr/share/elasticsearch/data

  kibana:
    image: docker.elastic.co/kibana/kibana:7.1.1
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    environment:
      ELASTICSEARCH_URL: http://elasticsearch:9200
```
### `Metricbeat`をdockerで構築

 - `Metricbeat`コンテナを`docker pull docker.elastic.co/beats/metricbeat:7.0.1`で取得
 - `Metricbeat`コンテナを使ってkibanaとelasticsearchをセットアップ（kibanaにダッシュボードを作成等行う)

```bash
docker run \
docker.elastic.co/beats/metricbeat:7.1.1 \
setup -E setup.kibana.host=10.0.0.1:5601\
-E output.elasticsearch.hosts=["10.0.0.1:9200"]
```

 - `Metricbeat`を設定する　[Running Metricbeat on Docker](https://www.elastic.co/guide/en/beats/metricbeat/current/running-on-docker.html)

    - とりあえず動かしたいときは`curl -L -O https://raw.githubusercontent.com/elastic/beats/7.0/deploy/docker/metricbeat.docker.yml`で設定ファイルを入手

    - `Metricbeat`コンテナを動かすために以下のような`docker-compose.yml`を用意

```yml:docker-compose.yml
version: '3'
services:
    metricbeat:
        image: docker.elastic.co/beats/metricbeat:7.1.1
        user: root
        volumes:
            - /proc:/hostfs/proc:ro
            - /sys/fs/cgroup:/hostfs/sys/fs/cgroup:ro
            - /:/hostfs:ro
            - /var/run/docker.sock:/var/run/docker.sock
            - ./metricbeat.docker.yml:/usr/share/metricbeat/metricbeat.yml:ro
        environment:
            - ELASTICSEARCH_HOST=10.0.0.1:9200
            - KIBANA_HOST=10.0.0.1:5601
        network_mode: "host"
        command: -system.hostfs=/hostfs
```

 - `metricbeat.docker.yml`の所有者を`root`にする(`chown root:root metricbeat.docker.yml`)
   
 - `Metricbeat`を`docker-compose up -d`でコンテナを起動

###  metricbeat.docker.ymlの設定例

以下のmetricbeat.docker.ymlはシステムと`docker`コンテナの情報を収集する設定になっている

- [System module](https://www.elastic.co/guide/en/beats/metricbeat/current/metricbeat-module-system.html)
- [Docker module](https://www.elastic.co/guide/en/beats/metricbeat/current/metricbeat-module-docker.html)

```yml:metricbeat.docker.yml
metricbeat.config:
  modules:
    path: ${path.config}/modules.d/*.yml
    # Reload module configs as they change:
    reload.enabled: true

metricbeat.autodiscover:
  providers:
    - type: docker
      hints.enabled: true

metricbeat.modules:
- module: docker
  metricsets:
    - "container"
    - "cpu"
    - "diskio"
    - "healthcheck"
    - "info"
    #- "image"
    - "memory"
    - "network"
  hosts: ["unix:///var/run/docker.sock"]
  period: 10s
  enabled: true

- module: system
  metricsets:
    - cpu             # CPU usage
    - load            # CPU load averages
    - memory          # Memory usage
    - network         # Network IO
    - process         # Per process metrics
    - process_summary # Process summary
    - uptime          # System Uptime
    - socket_summary  # Socket summary
    - core           # Per CPU core usage
    - diskio         # Disk IO
    - filesystem     # File system usage for each mountpoint
    - fsstat         # File system summary metrics
    - raid           # Raid
    - socket         # Sockets and connection info (linux only)
  enabled: true
  period: 10s
  processes: ['.*']

  # Configure the metric types that are included by these metricsets.
  process.include_top_n:
    by_cpu: 5      # include top 5 processes by CPU
    by_memory: 5   # include top 5 processes by memory: 
  cpu.metrics:  ["percentages"]  # The other available options are normalized_percentages and ticks.
  core.metrics: ["percentages"]  # The other available option is ticks.

processors:
  - add_cloud_metadata: ~

output.elasticsearch:
  hosts: '10.0.0.1:9200'

```

### 参考
- [Running Metricbeat on Docker](https://www.elastic.co/guide/en/beats/metricbeat/current/running-on-docker.html)

## ダッシュボードを確認
- 左のバナーからダッシュボードを選択。
- `metricbeat.docker.ymlの設定例`ですと`[Metricbeat System] Overview ECS`と`[Metricbeat Docker] Overview ECS`のダッシュボードが見れます。

![kibana.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235984/d18a8ca6-deca-7b62-c5be-6325518d1555.png)

このように簡単に情報収集、そしてダッシュボードも見ることができます。
さらに情報を収集したい項目がありましたら、elasticsearchはドキュメントも充実しているので、以下を参考にしてください。

- [Elastic Stack and Product Documentation](https://www.elastic.co/guide/index.html)