cAdvisor, InfluxDB, GrafanaでDockerコンテナのリソース監視

  • 72
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

1台のDockerホスト上のコンテナのリソース監視はcAdvisorが一般的になっているような気がします。
それでは複数台のDockerホスト上のコンテナのリソース監視はどうするのかなと調べてみると、以下のような方法があるようです。

  • cAdvisorで直接InfluxDBに保存し、Grafanaで可視化
  • HeapsterでcAdvisorから情報を収集してInfluxDBに保存し、Grafanaで可視化
  • cAdvisorからfluentでInfluxDBに保存し、Grafanaで可視化

この記事では一つ目の方法を試してみようと思います。
とりあえず今出てきた登場人物の簡単な紹介とリンク紹介を。

なお、この記事はだいたい3月中旬に書いた内容です。

cAdvisor

InfluxDB

Grafana

Heapster

  • Kubernetesクラスタ内のコンテナのリソースモニタリングツール。
  • Kubernetesのモニタリングツールとして作られたが、CoreOSでも動作、対象ホストを設定すればクラスタリングツールなしでも動作する。
  • cAdvisorを各サーバーに入れ、Heapsterが各cAdvisorからデータを取得し、InfluxDBに保存、Grafanaで可視化する。という仕組み
  • メリット
    • Kubernetesクラスタ内の全てのminionを自動で発見
    • pod ID、コンテナ名、pod IP、ホスト名、ラベルを統計情報と一緒に保存
    • クラスタリングツールを使わない場合、あまりメリットがない。
  • 公式サイト
  • 解説記事

環境構築手順

では、表題の「cAdvisor、InfluxDB、GrafanaでDockerコンテナのリソース監視」をする環境を構築していきましょう。

cAdvisorとInfluxDBとGrafanaでDockerリソースの可視化を行うDockerコンテナ群をFigでデプロイしたPaaS上にてGo言語でRedisを叩くの手順を参考に、Figは使わずに複数サーバーに対して構築していきます。(でも、今見るとページが開かなくなっている。。。)

以下のような構成を作っていきます。

image

CentOS 7のインスタンスを作成

CentOS 7 (x86_64) with Updates HVM on AWS Marketplaceを3つ作成。

  1. influxDB, Grafana
  2. Dockerホスト、cAdvisor(2台)

としましょう。
全部同じセキュリティーグループにしておきます。(別にしなくてもいいです。)

SSHログインはcentosユーザです。

$ ssh -i <SSHキー> centos@<IPアドレス>

全サーバーのパッケージを最新にし、wgetをインストールしておきます。

$ sudo yum -y update
$ sudo yum -y install wget

influxDB、Grafanaサーバーのセットアップ

InfluxDBインストール

InfluxDB Documentationの通りインストールします。

$ wget http://s3.amazonaws.com/influxdb/influxdb-latest-1.x86_64.rpm
$ sudo rpm -ivh influxdb-latest-1.x86_64.rpm

InfluxDBを起動し、OS起動時に起動するように設定。

$ sudo service influxdb start
$ sudo chkconfig influxdb on

セキュリティグループで8083と8086を開けます。

管理Web UIにアクセスして動くことを確認します。

http://<IPアドレス>:8083/ にアクセスすると以下の画面が表示されます。

スクリーンショット 2015-03-12 16.15.45.png

ユーザ、パスワードにroot/rootを入力し、ホスト名はサーバーのIPアドレス、ポートに8086を入力し、「Connect」を押します。

スクリーンショット 2015-03-12 16.16.02.png

サンプルデータベースを作ってみます。Database Nameにtestと入力し、「Create Database」をクリックします。
後でGrafanaの設定情報を入れるgrafanaデータベースとcAdvisorのデータを入れるcadvisorデータベースも作成しておいてください。

スクリーンショット 2015-03-12 16.29.26.png

WebUIからもデータを入れられるのですが、一件ずつしか入れられないので、REST APIでデータを入れてみます。

$ curl -X POST 'http://localhost:8086/db/test/series?u=root&p=root' -d \
'[{"name": "nikkei_average", "columns": ["time", "price"], "points": [[1419778800000, 17729.84], [1419519600000, 17818.96], [1418083200000, 17450.77]]}]'

testデータベースの「Explore Data »」からデータベースのRead/Writeをする画面に行き、select * from nikkei_averageというQueryを実行すると以下のようにデータを見ることができます。

スクリーンショット 2015-03-12 16.38.42.png

Grafanaインストール

Install & Configure - Grafana Documentationを参考にインストール。

$ wget http://grafanarel.s3.amazonaws.com/grafana-1.9.1.tar.gz
$ tar zxvf grafana-1.9.1.tar.gz
$ sudo mv grafana-1.9.1 /opt/
$ cd /opt/grafana-1.9.1
$ cp config.sample.js config.js

influxdbの設定サンプルを参考にconfig.jsを以下のように設定します。
とりあえず先ほど作成したtestデータベースに接続してみます。
cadvisorは後でcAdvisorが収集したデータを入れるデータベースです。まだありませんが、先に設定しておきます。
grafanaデータベースはGrafanaのダッシュボードの設定情報を保存するデータベースです。
<IPアドレス>にはこのサーバーのIPアドレスを指定します。

      datasources: {
        test: {
          type: 'influxdb',
          url: "http://<IPアドレス>:8086/db/test",
          username: 'root',
          password: 'root',
        },
        cadvisor: {
          type: 'influxdb',
          url: "http://<IPアドレス>:8086/db/cadvisor",
          username: 'root',
          password: 'root',
        },
        grafana: {
          type: 'influxdb',
          url: "http://<IPアドレス>:8086/db/grafana",
          username: 'root',
          password: 'root',
          grafanaDB: true
        },
      },

Webサーバーが入っていないので、Apacheをインストールします。

$ sudo yum -y install httpd
$ sudo vim /etc/httpd/conf.d/grafana.conf

grafana.confは以下のように設定しました。

alias /grafana /opt/grafana-1.9.1
<Directory /opt/grafana-1.9.1>
  Require all granted
</Directory>

Webサーバープロセスからのアクセス許可設定。

$ sudo restorecon -R /opt/grafana-1.9.1/

セキュリティーグループで80も開けます。
Apacheを起動します。自動起動も設定します。

$ sudo systemctl start httpd
$ sudo systemctl enable httpd.service

http://<IPアドレス>/grafana/にアクセスすると以下のように表示されます。

スクリーンショット 2015-03-12 17.35.10.png

グラフをEditし、日付範囲を2014/12/01-2014/12/31にして、条件を以下のように設定すると以下のようにInfluxDBのデータを見ることができます。

スクリーンショット 2015-03-12 18.17.13.png

Dockerホストサーバーをセットアップ(2台)

監視対象の2台のサーバーです。DockerとcAdvisorを入れます。

Dockerをインストール

$ sudo yum install -y docker
$ sudo systemctl start docker
$ sudo systemctl enable docker

cAdvisorをDockerコンテナとして起動。

$ sudo docker run \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --detach=true \
  --privileged\
  --name=cadvisor_with_influxdb \
  google/cadvisor:latest \
  --log_dir=/ \
  --storage_driver=influxdb \
  --storage_driver_host=<InfluxDBサーバーのIP>:8086\
  --storage_driver_user=root \
  --storage_driver_password=root \
  --storage_driver_secure=False

cAdvisorの動作確認。http://<cAdvisorサーバーのIP>:8080にアクセス。2台とも確認。

スクリーンショット 2015-03-13 9.10.14.png

適当にDockerコンテナを立ち上げる。

$ sudo docker run --name redis -d redis
$ sudo docker run --name nginx -d -p 50080:80 dockerfile/nginx

InfluxDBで確認

InfluxDBのダッシュボードでInfluxDBに入っていることを確認します。

list seriesでseries名を確認します。

スクリーンショット 2015-03-13 9.40.07.png

statsというseriesがあることがわかったので、select * from stats limit 10と中身を確認します。

スクリーンショット 2015-03-13 10.00.08.png

スクリーンショット 2015-03-13 10.00.32.png

stats seriesに入っているデータは以下のカラムで構成されています。

カラム 説明
time UNIX時間(ミリ秒)
sequence_number シーケンス番号(InfluxDBによる自動採番)
machine マシンID(/etc/machine-id, /var/lib/dbus/machine-id 起動時に設定も可能)
container_name コンテナ名
memory_working_set ワーキングセットメモリサイズ(バイト)
memory_usage メモリ使用量(バイト)
cpu_cumulative_usage 累計CPU使用時間(ナノ秒)
fs_device デバイス名
fs_usage ディスク使用量(バイト)
fs_limit ディスクサイズ(バイト)
rx_bytes ネットワークの受信バイト数
rx_errors ネットワークの受信エラー数
tx_bytes ネットワークの送信バイト数
tx_errors ネットワークの送信エラー数

参考

Grafanaで確認

ちょこちょこと設定するとこんな風に表示できます。
HeapsterのGrafanaのダッシュボード設定のサンプル(heapster/grafana/kubernetes-dashboard.json)を真似ると楽です。

スクリーンショット 2015-03-19 22.49.13.png

なかなかきれいに表示できました。

左上のグラフは以下の設定です。cadvisor_with_influxdbというコンテナのCPU使用率を表しています。
derivative関数は単位時間あたりの値の変化量つまり変化率を求めます。

select container_name, derivative(cpu_cumulative_usage) from "stats" where $timeFilter and machine = 'c563336a339b' and container_name = 'cadvisor_with_influxdb' group by time($interval) order asc

右上のグラフは以下の設定です。cadvisor_with_influxdbというコンテナのメモリ使用量を表しています。

select mean(memory_usage) from "stats" where $timeFilter and machine = 'c563336a339b' and container_name = 'cadvisor_with_influxdb' group by time($interval) order asc
select mean(memory_working_set) from "stats" where $timeFilter and machine = 'c563336a339b' and container_name = 'cadvisor_with_influxdb' group by time($interval) order asc

下の2つのグラフのように全コンテナのグラフを一度に表示する場合は、where句からcontainer_nameの条件を外し、group byでcontainer_nameを指定します。

終わりに

cAdvisor, InfluxDB, Grafanaを使うと簡単に複数台のDockerホスト上のコンテナの監視ができました。
ただ、cAdvisor APIで取れる全てのデータが入るわけではないとか、メタデータ的なものを追加できないとかちょっとデフォルトじゃ不満足な場合はfluentで入れるのがいいのかなあと思います。こんなfluentプラグイン(Woorank/fluent-plugin-cadvisor)もあるようですし。