CoreOSをZabbixAgentで監視する

![coreos-zabbix.png](https://qiita-image-store.s3.amazonaws.com/0/47801/03a07f0f-56df-b824-db93-6e9fb8e9efe4.png)

# CoreOSをZabbixAgentで監視する

2日目はBSmileが担当させて頂きます。
[ike_daiさんからバトン] (http://qiita.com/ike_dai/items/aa592f02a47d023911ed#%E3%81%BE%E3%81%A8%E3%82%81)受け取りましたが、しょっぱなから飛ばし過ぎじゃないですか(汗)

さて、先日の[ZabbixConferenceJapan2015](http://www.zabbix.com/conf_japan_2015_agenda.php)にて、 `ZabbixにおけるDocker監視の魅力とは` という内容で登壇させて頂きました。
改めて登壇の機会を与えてくださった皆様へ感謝致します。

その中で、DockerホストをZabbixで監視するのは「AgentをDockerホストへインストールするのが良い」
と言いましたが、「お前それCoreOSでも同じこと言えんの？」という意見もあると思いますし、その通りだと思います。
そこで今回はCoreOSをZabbixAgentで監視する方法という事で紹介させて頂きます。
※実際はCoreOSに限らず、DockerインストールしたOSであれば大丈夫だと思います(未検証)


また、「何でCoreOSはDockerホストにインストールしないの？」と疑問に感じられる方もいらっしゃると思いますので軽く解説を交えながら進めて行きます。

**何でもいいから早く設定方法教えろ**という方は[CoreOSへZabbixAgentをインストール](http://qiita.com/_BSmile_/items/5fe13bb6305de8f98ccd#coreos%E3%81%B8zabbixagent%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)までお進み下さい。

# そもそもCoreOSって何ですか？ 

Chrome OSと同じGentoo LinuxをベースとしたOSとなっています。

## 特徴

  - コンパクトに作成されたOSのコア。yumやapt-get等のパッケージ管理ツールを持っていない
  - OSで使用する/usr領域を「AとB」2つ用意しており、待機側の更新を行い切替、問題があれば切り戻しといったインフラエンジニア泣かせのドキドキが軽減される
  - コンテナありき。「パッケージ管理ツールを持たない」と言ったが、必要な物はコンテナで動かすスタイル。Dockerとrkt(旧rocket)を用意。

  - クラスタ(etcd)と分散管理システム(fleet)をサポート
  - 異なるホスト間でもflannelを使用してネットワーク通信が可能

が挙げられており、全ては **セキュリティー、一貫性、信頼性**の為に作成されています。
1年近く前の話ですが、**Playstationのアプリケーション開発にもCoreOSが使用されている**ようです。

冒頭に言った **「お前それCoreOSでも同じこと言えんの？」** は **必要な物はコンテナで動かすスタイル**に則った物となります。
![zabbix-container.png](https://qiita-image-store.s3.amazonaws.com/0/47801/a74d0e94-9e83-6f90-302b-ea741700630d.png)

## CoreOSについての内容おすすめ

詳しくは 下記参考にされると良いです。
[CoreOS 入門](http://qiita.com/mopemope/items/fa9424b094aae3eac580)
[CoreOS + flannel で複数ホスト間コンテナ通信をする](http://qiita.com/dtan4/items/8f9cf40aabd2e6c9a494)

では、実際にCoreOS上でZabbixAgentコンテナを立ち上げてみましょう。

# ZabbixAgentコンテナをつくる

## 事前に

### 投稿用に作成した環境

* ZabbixServer
    * OS (Ubuntu trusty)
    * ZabbixServer (2.2.11)

* CoreOS
    * CoreOS alpha (877.1.0)
    * Docker Server version (1.9.1)
    * Zabbix Agent (2.2.7)

ZabbixServerは別に立てた外部サーバとなっています。

## CoreOSへZabbixAgentをインストール

例のごとく[Zabbix share](https://share.zabbix.com/)にzabbix-agent用コンテナが無いか確認しましたが、ありませんでした。

続いて、[Docker Hub](https://hub.docker.com/)に無いか確認です。
[bhuisgen/docker-zabbix-coreos](https://hub.docker.com/r/bhuisgen/docker-zabbix-coreos/)というzabbix-agentコンテナがあり、こちらを使用しての監視とします。

### [任意]ZabbixServerへ自動登録の設定を行う

1. [設定] - [アクション] を選択し、イベントソースを [自動登録]とし、[アクションの作成]
![Screenshot 2015-12-01 15:32:12.png](https://qiita-image-store.s3.amazonaws.com/0/47801/8d63b49b-d6fa-aac5-dd01-15671ea4d518.png)

2. [アクションタブ]でアクション名を入力し、[アクションの実行条件タブ]を選択
![Screenshot 2015-12-01 15:33:14.png](https://qiita-image-store.s3.amazonaws.com/0/47801/d0db02ac-8587-a301-8518-718e93dcb1a9.png)

3. アクションの実行条件に[Host metadata内にcoreosが含まれている]を登録し[アクションの実行内容タブ]へ
![Screenshot 2015-12-01 15:35:01.png](https://qiita-image-store.s3.amazonaws.com/0/47801/4d48bb3b-1a6f-f220-331a-2511efd81098.png)


4. アクションの実行内容に[ホストの追加][ホストグループに追加][テンプレートとのリンクを作成]を登録し[保存]を行う
![Screenshot 2015-12-01 15:37:36.png](https://qiita-image-store.s3.amazonaws.com/0/47801/1505d65f-0554-6d45-0c39-e52dd3a134d9.png)


### コンテナの作成・起動

コンテナ起動時に渡す引数として、**ZabbixServerのIPアドレス**、ディスカバリで使用する**HostMetadata**が必須となり、**ホスト名**は任意で登録します。

| オプション | 内容 |
|----------|-----|
| -d | バックエンドで実行 |
| -p | コンテナのネットワークポートをDockerホストのフロントへ出す |
| -u | ユーザ名(0指定の場合はUID 0のroot) |
| --cpu-shares | CPU使用優先度(1024はデフォルト値なので記述不要) |
| -m | メモリ使用量 |
| --memory-swap | -mで設定したメモリ使用量+swapの値(-1は無効) |
| --net | ネットワークモードの設定(hostはDockerホストのネットワークスタットを使用) |
| -v | dockerホストのディレクトリをコンテナにマウント |
| --name | コンテナ名を指定 |


* コンテナ作成コマンド

``` bash
$ docker run -d -p 10050:10050 -u 0 --cpu-shares 1024 -m 64M \
--memory-swap=-1 --net="host" \
-v /proc:/coreos/proc:ro -v /sys:/sys:ro -v /dev:/coreos/dev:ro \
-v /var/run/docker.sock:/var/run/docker.sock \
--name zabbix-coreos bhuisgen/docker-zabbix-coreos \
[ZabbixServer IPアドレス] [zabbix_agentd.confで使用されるHostMetadata] [(オプション)zabbix_agentd.confで使用されるHostname]
```

ZabbixServerでHostMetadataをもとに監視ホストが自動登録されるか、自分でホスト登録を行う事で
Dockerホストの監視が行えるようになります。
![Screenshot 2015-12-01 16:16:26.png](https://qiita-image-store.s3.amazonaws.com/0/47801/88975840-ecbe-7f53-c873-cf400919f6f1.png)

## コンテナ監視モジュールは使える？

[zabconf2015_jp](http://www.zabbix.com/img/zabconf2015_jp/presentations/04_zabconf2015_watanabe.pdf)でお話させて頂いたコンテナ監視モジュールは使用出来るのか？
結論としては**使用可能です**。

コンテナデータ収集をする際、使用するZabbix-Docker-MonitoringはUNIXソケット接続となり
ソケットの場所が`/var/run/docker.sock`と固定化されている為
コンテナ起動時の`-v`オプションで `-v /var/run/docker.sock:/var/run/docker.sock`と
しておかなければいけません。

また、`cgroup`もコンテナ上の同じ位置にマウントするよう `-v /sys:/sys:ro`を忘れずに指定してください。


以下手順です。

`1.` Zabbixサーバ へTemplate emplateの登録

https://github.com/monitoringartist/Zabbix-Docker-Monitoring/tree/master/template から
以下、2つをダウンロード
続いてZabbixServer-WEBの設定からインポート

- Zabbix-Template-App-Docker-active.xml (Passive check)
- Zabbix-Template-App-Docker.xml (Active check)

`2.` ZabbixAgentが動作しているCoreOS上で、ZabbixAgentコンテナのターミナル起動

```bash
docker exec -ti zabbix-coreos /bin/bash
```

コンテナ内部でライブラリをダウンロードし、zabbix-agentにて読込設定を加える

```bash
$curl -k -o /usr/lib/modules-load.d/zabbix_module_docker.so -O https://drone.io/github.com/jangaraj/Zabbix-Docker-Monitoring/files/zabbix24/src/modules/zabbix_module_docker/zabbix_module_docker.so
$cat <<EOF > /etc/zabbix/zabbix_agentd.conf.d/docker-module.conf
LoadModulePath=/usr/lib/modules-load.d/
LoadModule=zabbix_module_docker.so
AllowRoot=1
EOF
$supervisorctl restart zabbix-agent
```

ZabbixServer-WEB上でホストへdockerテンプレートを登録していれば
しばらくすると、コンテナのデータ収集が始まることでしょう。
![Screenshot 2015-12-01 17:52:58.png](https://qiita-image-store.s3.amazonaws.com/0/47801/3e122c6a-e5f1-097c-e321-a2de93f30ca0.png)

上記設定を行ったZabbixAgentコンテナをイメージ化して管理しておくと、なお良いですね。

# まとめ

**結局何が出来たのか?**というと

- DockerにZabbixAgentコンテナを立ち上げてDockerホスト監視が出来るよ！
- Zabbix-Docker-Monitoringを使用することでDockerホスト上のコンテナ監視も可能だよ！
- CoreOSとして話しているけど、RHEL/Ubuntu上のDockerホストでもいけると思うよ！

これらが出来るようになりました。

また、この「コンテナ上でのHost監視」を行うことでDockerホストに対する監視設定をかなり簡略化できたと思います。
CoreOSに限らず、Docker Engineが載っている様々なサーバで実行可能ですので是非利用してみて下さい。

そして、3日目は **usiusi360** さんです。
うまく引き継げたかわかりませんが宜しくお願いします！