・grafanaの設定
grafanaはユーザーがブラウザ経由で蓄積されたメトリクスを確認するために使用するので、外部から接続できるようにホストのポートと接続する必要があります。docker-compose.ymlのservicesに以下の設定を追加します。
grafana:
container_name: grafana
image: grafana/grafana
volumes:
- ./grafana/data:/var/lib/grafana
- ./grafana/plugins:/var/lib/grafana/plugins
links:
- elasticsearch
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=secret
networks:
- default
portsで3000番ポートをホストと接続しています。docker runで-pオプションで指定していた内容です。こうすれば、コンテナ外からもホストマシンの3000番ポートにアクセスすることでgrafanaにアクセスできます。これまではElasticsearchも9200番ポートを公開していましたが、コンテナ間で通信を行うだけなので、defaultネットワーク内で通信すればいいため、削除しています。動作確認のために外部からアクセスする必要があれば、同様にportsで指定します。
・logstashの設定
続いてlogstashの設定をします。docker-compose.ymlのservicesに以下の設定を追加します。
logstash:
container_name: logstash
build:
context: ./logstash
dockerfile: Dockerfile
links:
- elasticsearch
volumes:
- /etc/condor:/etc/condor
- ./logstash/pipeline:/usr/share/logstash/pipeline
- ./logstash/log:/opt/probes/log
networks:
- default
これまでとちがうのは、使用するイメージの指定をするためにimagesを指定する代わりに、buildになっているところです。これにより、logstash/Dockerfileを用いて新たなイメージを作成するようにしています。また、logstashの設定ファイルはイメージにもたせるのではなく、volumesを使用してマウントしています。
logstash/Dockerfileの内容は以下の通りです。
$ cat logstash/Dockerfile
FROM docker.elastic.co/logstash/logstash:6.6.0
USER root
RUN yum -y install curl git
RUN curl -O https://bootstrap.pypa.io/get-pip.py
RUN python get-pip.py
RUN rm get-pip.py
RUN pip install virtualenv
RUN pip install htcondor==8.7.10
RUN cd /opt && git clone https://github.com/fifemon/probes
RUN cd /opt/probes && virtualenv --system-site-packages venv
RUN /opt/probes/venv/bin/pip install supervisor influxdb
$
FROMで、ベースにするイメージを指定します。今回はdocker.elastic.co/logstash/logstash:6.6.0です。RUNは、イメージを作成するときに実行するコマンドです。RUNを読み飛ばせば、通常のコマンドと同じであることがわかります。
オリジナルイメージにはcurl、git、pipといったツールが含まれていなかったのでインストールしています。
RUN yum -y install curl git
RUN curl -O https://bootstrap.pypa.io/get-pip.py
RUN python get-pip.py
RUN rm get-pip.py
必要なツールがインストールできたら、さらにvirtualenv、htcondorをインストールします。
RUN pip install virtualenv
RUN pip install htcondor==8.7.10
続いてprobeを使用するためのvirtualenvの作成を行います。
RUN cd /opt && git clone https://github.com/fifemon/probes
RUN cd /opt/probes && virtualenv --system-site-packages venv
RUN /opt/probes/venv/bin/pip install supervisor influxdb
以上で、logstashでhtcondorモジュールを使用して、htcondorの情報を取得することのできるイメージが作成できます。
・supervisordを使用したコンテナ
続いて、probesのもうひとつの機能、supervisordを使用してメトリクスを取得するためのコンテナを作成します。docker-compose.ymlのservicesに以下の設定を追加します。
probes:
container_name: probes
build:
context: ./probes
dockerfile: Dockerfile
container_name: probes
volumes:
- ./probes/log:/opt/probes/log
networks:
- default
ここはもう何も説明の必要はないです。続いてDockerfileを見てみます。
$ cat probes/Dockerfile
FROM python:2.7
USER root
RUN pip install virtualenv
RUN pip install htcondor==8.7.10
RUN cd /opt && git clone https://github.com/fifemon/probes
RUN cd /opt/probes && virtualenv --system-site-packages venv
RUN /opt/probes/venv/bin/pip install supervisor influxdb
COPY etc/awsmonitor.cfg /etc/
COPY etc/condor-probe.cfg /etc/
COPY etc/supervisord.conf /etc/
CMD . /opt/probes/venv/bin/activate && exec supervisord
$
probesがPython3で動作しなかったので、python2.7環境をベースにイメージを作成します。このDockerfileの中で、いくつか新しいコマンドが使用されています。
COPYは、イメージ作成時にホストからファイルをコピーします。今回はファイルコピーをしましたが、volumesでマウントしてもいいかなとも思います。
CMDは、コンテナ実行時に実行されるコマンドです。ここでは、virtualenv環境の上でsupervisordを実行するようにしています。ただ、supervisordはデフォルトではデーモンとして実行されてしまうため、そのままではコンテナ実行時に起動されても即座に処理が返ってきて、そのままコンテナが終了してしまいます。それを避けるためにsupervisord.confでデーモンとして動作しないように設定をします。
$ cat probes/etc/supervisord.conf
## Supervisor
[supervisord]
logfile = /opt/probes/log/supervisord.log
childlogdir = /opt/probes/log
nodaemon = true # <== ここでsupervisord実行時にデーモン化しないようにしている
(以下略)
$
また、設定ファイル中で指定するパスもコンテナ化した環境に合わせて適切なものに変更しています。
最終的なディレクトリ構成は以下のようになります。
$ tree .
.
├── docker-compose.yml
├── Elasticsearch
│ ├── config
│ │ └── elasticsearch.yml
│ ├── data
│ └── logs
├── grafana
│ ├── conf
│ ├── data
│ └── plugins
├── logstash
│ ├── Dockerfile
│ ├── log
│ └── pipeline
│ └── logstash-fifemon.conf
└── probes
├── Dockerfile
├── etc
│ ├── awsmonitor.cfg
│ ├── condor-probe.cfg
│ └── supervisord.conf
└── log
14 directories, 8 files
$
また、docker-compose.ymlは以下のようになりました。
$ cat docker-compose.yml
version: '3.3'
services:
elasticsearch:
container_name: es01
image: docker.elastic.co/elasticsearch/elasticsearch:6.6.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
volumes:
- ./Elasticsearch/data:/usr/share/elasticsearch/data
- ./Elasticsearch/logs:/usr/share/elasticsearch/logs
- ./Elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
networks:
- default
logstash:
container_name: logstash
build:
context: ./logstash
dockerfile: Dockerfile
links:
- elasticsearch
volumes:
- /etc/condor:/etc/condor
- ./logstash/pipeline:/usr/share/logstash/pipeline
- ./logstash/log:/opt/probes/log
networks:
- default
graphite:
container_name: graphite
image: graphiteapp/graphite-statsd
links:
- elasticsearch
networks:
- default
grafana:
container_name: grafana
image: grafana/grafana
volumes:
- ./grafana/data:/var/lib/grafana
- ./grafana/plugins:/var/lib/grafana/plugins
links:
- elasticsearch
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=secret
networks:
- default
probes:
container_name: probes
build:
context: ./probes
dockerfile: Dockerfile
container_name: probes
volumes:
- ./probes/log:/opt/probes/log
networks:
- default
networks:
default:
$
・fifemon起動
準備ができたので fifemonを起動します。Docker Composeで管理しているので、コマンドひとつで環境が立ち上がります。
$ sudo docker-compose up -d
Creating grafana ... done
Creating probes ...
Creating es01 ...
Creating graphite ...
Creating grafana ...
ここからさらにGrafana上でData Sourceの設定やダッシュボードの登録という作業は残っていますが、それは前回までで紹介済みなので省略します。
紙面の関係で細かい部分はかなり省略してしまったため、実際に手を動かしてみると「アレアレッ??」と思うところが出てきてしまうかもしれません。今回はクラウド環境を活用するために必要な知識の導入ということで、fifemon構築のための細かいお話というより、DockerfileやDocker Composeを用いたシステム構築ってこんな感じでやるんだなということを知っていただければと思います。
次回予告
次回は、クラウド環境構築のための前準備の続きとして、社内環境をクラウド環境とシームレスに統合するための準備についてご説明していきます。
第14回の公開は、2019年7月を予定しております。
プロフィール