Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Elastic Stackで簡単!Dockerコンテナ監視ダッシュボード作成

こんにちは、CI/CDツールなどを活用し、DevOps推進活動などに携わっている横山です。
本記事は、Docker Advent Calendar 2018 - Qiita20日目です。

はじめに

Elastic Stackを使うと、簡単にDockerコンテナの監視ダッシュボードが作成できるので、今回はその紹介をしたいと思います。

きっかけとしては、「開発環境で立ち上げている複数コンテナの問題調査を楽にしたい」というのがあります。最近、開発環境に複数のコンテナを立ち上げて開発メンバーに提供していますが、開発メンバーから「重たいので環境を確認してほしい」といった声が上がってきます。その際、どのサーバのどのコンテナに問題が発生しているのか確認したいですが、その都度サーバに入って、docker statsなどのコマンドで確認するのはやや面倒です。

そこで、コンテナの監視ダッシュボードを作って、一か所で確認できるようにしようと考え、Elastic Stackを使うことにしました。

今回の記事では、以下のダッシュボードを作ります。
f:id:acro-engineer:20181220080124p:plain:w700

概要

内容としては、以下の流れで説明します。

  1. 監視対象のコンテナを起動
  2. Elasticsearch、Kibanaをコンテナで起動
  3. Metricbeatのインストール、設定
  4. Kibanaダッシュボードの確認

構成は以下のようになります。
f:id:acro-engineer:20181220103953p:plain:w500

環境、バージョン情報

※今回は、全て同一サーバ上で動かします。

OS CentOS 7.5
Elastic Stack 6.5.3
Docker 18.09
Docker Compose 1.23.1

Docker、Docker Composeはインストールしている前提とします。
Dockerのインストール方法については、
Docker入門(第二回)~Dockerセットアップ、コンテナ起動~ | さくらのナレッジ
を参照してください。

手順

監視対象コンテナを起動

今回は、監視対象として、RedmineのDockerコンテナを起動します。

任意のディレクトリにdocker-compose_redmine.ymlを作成します。

version: '3.1'

services:

  redmine:
    image: redmine
    restart: always
    ports:
      - 3000:3000
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: example

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: redmine

Redmineのコンテナを起動します。

$ docker-compose -f docker-compose_redmine.yml up -d
Creating network "redmine_default" with the default driver
Creating redmine_db_1_79a9b94cfd42      ... done
Creating redmine_redmine_1_195c7e2fd8c7 ... done

$ docker-compose -f docker-compose_redmine.yml ps
             Name                           Command               State           Ports         
------------------------------------------------------------------------------------------------
redmine_db_1_36b65927def4        docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp   
redmine_redmine_1_870966ab277a   /docker-entrypoint.sh rail ...   Up      0.0.0.0:3000->3000/tcp
$

Elasticsearch、Kibanaのコンテナを起動

Elasticsearch、Kibanaについても公式のDockerイメージを利用して起動します。

任意のディレクトリに以下のようなdocker-compose_elk.ymlを作成します。

version: '2.2'

services:

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.5.3
    container_name: elasticsearch
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
    networks:
      - esnet

  kibana:
    image: docker.elastic.co/kibana/kibana:6.5.3
    ports:
      - 5601:5601
    networks:
      - esnet

networks:
  esnet:

Elasticsearch起動のために「vm.max_map_count」を確認し、設定します。
まず、現状の値を確認します。

$ sudo sysctl -a | grep vm.max_map_count
・・・
vm.max_map_count = 65530

値が「262144」になっていない場合は、以下のコマンドで変更します。
(永続化する場合は、/etc/sysctl.confに設定します。)

$ sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144

Elasticsearch、Kibanaのコンテナを起動します。

$ docker-compose -f docker-compose_elk.yml up -d
Creating network "elk_esnet" with the default driver
Creating elk_kibana_1_730c2b554976 ... done
Creating elasticsearch             ... done
 
$ docker-compose -f docker-compose_elk.yml ps
          Name                         Command               State                Ports              
-----------------------------------------------------------------------------------------------------
elasticsearch               /usr/local/bin/docker-entr ...   Up      0.0.0.0:9200->9200/tcp, 9300/tcp
elk_kibana_1_d87486e7e64b   /usr/local/bin/kibana-docker     Up      0.0.0.0:5601->5601/tcp          
$ 

Metricbeatのインストール、設定

監視対象のコンテナ情報を取得するために、Metricbeatをインストールします。

$ curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-6.5.3-x86_64.rpm
$ sudo rpm -vi metricbeat-6.5.3-x86_64.rpm

補足になりますが、Elasticsearch、Kibanaと、
Metricbeatを別サーバで動かすときは、以下の接続先(localhostの部分)の設定を変更します。

$ sudo vi /etc/metricbeat/metricbeat.yml

setup.kibana:
  host: "localhost:5601"

output.elasticsearch:
  hosts: ["localhost:9200"]

MetricbeatのDockerコンテナ用のモジュールを有効にします。

$ sudo metricbeat modules enable docker
Enabled docker
$ sudo vi /etc/metricbeat/modules.d/docker.yml

コメントアウトを外し、以下のように設定します。
(記述していない部分はデフォルトのままです。)
- module: docker
  metricsets:
    - container
    - cpu
    - diskio
    - healthcheck
    - info
    - memory
    - network

ElasticsearchのIndex Templateを適用します。

$ sudo metricbeat setup --template -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["localhost:9200"]'
Loaded index template

Kibanaのダッシュボード定義を作成します。
(テンプレートがあるのはうれしいですね。)

$ sudo metricbeat setup --dashboards
Loading dashboards (Kibana must be running and reachable)
Loaded dashboards

Metricbeatを起動し、確認します。

$ sudo systemctl start metricbeat
$ sudo systemctl status metricbeat

これで、一通りの設定が完了です。
それでは、Kibanaの画面で確認してみましょう。

Kibanaダッシュボード画面

ブラウザで以下のURLにアクセスし、Kibanaの画面を開きます。
 http://<KibanaサーバのIPアドレス>:5601

Kibanaのトップページ左のメニューから「Dashboard」をクリックします。
f:id:acro-engineer:20181220075940p:plain:w750

ダッシュボード一覧が表示されるので「[Metricbeat Docker] Overview」をクリックします。
f:id:acro-engineer:20181220080026p:plain:w500

以下のようなダッシュボードが表示されます。
f:id:acro-engineer:20181220080042p:plain:w750

監視対象用に起動しているRedmineコンテナ(redmine_redmine_1_dda7715e7770)やMySQLコンテナ(redmine_db_1_e54eba45c028)の監視ができています。
また、今回はElasticsearch、Kibanaもコンテナで起動しているので、それらも合わせて監視されています。

上図の赤丸部分で、MySQLコンテナのメモリ使用量が増えていることがパッと見てわかります。

このように、複数のコンテナが動いている環境で問題調査をする際に、このようなダッシュボードで切り分けが楽になりました。


余談ですが、ダッシュボードの一覧で、「[Metricbeat System] Host overview」を選択すると、ホスト側の状態も確認できます。
f:id:acro-engineer:20181220080057p:plain

まとめ

今回は、Elasticsearch、 Kibana、MetricbeatでDockerコンテナの監視を行ってみました。
MetricbeatのモジュールやKibanaダッシュボードのテンプレートなどが用意されているので、簡単に監視ダッシュボードが作れるのは良いですね。
ダッシュボードのカスタマイズなどもして、より使い勝手の良いダッシュボードにもしてみたいと思います。

それでは。

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
顧客のビジネスをインフラから加速するエンジニア募集! - Acroquest Technology株式会社のインフラエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com