はじめに
申し訳ないのですがこれは2020/05/20時点の私の技術力だとうまくいかなかったことを恥を忍んで報告する記事です。目的は私のこの徒労がほかの人のためになるかもしれないからです。この手順から何かすればうまくdocker監視できるかもしれないので、もしできた人はコメントください。
一応Zabbix5.0をubuntu18.04とvagrantとdocker-composeで一から環境をセットアップして動かすことはできたのでとりあえずそこまでやりたい人はこの記事を参考にしていただければ幸いです。
(2020/05/26追記)agent2を直接aptでインストールして設定を行うことで監視することができるようになりました。これは監視対象ならどれでも当てはまります。なのでagent2はapt、serverとかはDocker、みたいにインストールしていいなら監視可能です。ちょっと理想の形とは違いますがこれでもよい方は以下の追記も含めてご確認ください。
zabbix5.0
zabbix5.0はこの5月にリリースされました。
Zabbix 5.0LTSの新機能 https://www.zabbix.com/jp/whats_new_5_0
特にDockerも監視できるというZabbix agent2が使用できるのがDocker使いには魅力的かと思います。
これの前にZabbix5.0とZabbix agent2をCentOS7のDockerで試したけどダメでした
私も興味があったので自分なりにCentOS7で試してみました。
しかしCentOS7だと、docker-composeによるzabbi5とZabbix agent2で自分のDocker監視はできませんでした。正確に言うとDocker関連のアイテムのみ取得できませんでした。
早い話が、現時点では監視対象がRHEL8系だとDockerを監視することがそもそもできない構造になっています。
順を追って書きますと、まず公式のdocker-compose.ymlにはagent2を使用できるように記述されていませんでした。これは正直盲点でした。まさかDockerで動くのにdocker-compose.ymlに存在すらしないとは思わず......
そこで後述する方法でagent2を書いてもDockerのアイテムは取得できません。ほかのテンプレートを登録するとそれらはごく普通に値を取得できていたのではじめは自分の設定の問題かなあと考えておりました。
しかし調べてみると、Zabbix agent2はCentOS7をサポートしてませんでした。RHEL8系からでした。
(2020/05/28追記)以下の古いリビジョンの記事の通り、確かにサポートの記述はありませんでした。
https://www.zabbix.com/documentation/current/manual/concepts/agent2?rev=1590122706
しかし2020/05/26に以下のようにCentOS7とかCentOS6とかがサポートされました。なおwinはまだのようです。
zabbix Agent 2 https://www.zabbix.com/documentation/current/manual/concepts/agent2
よって、以下の記事の情報をベースにCentOS7でもZabbix5.0とAgent2でDocker監視できます。今までの苦労は。まあこれこそが最新バージョンの検証をやるということなのでしょう......いい勉強になりました......
(追記ここまで)
しかし、現在DockerはCentOS8をサポートしていません。
Docker公式 CentOSでのDockerインストール https://docs.docker.com/engine/install/centos/
試しに私も無理やり入れて動かしてみましたがimageのpullすらできませんでした。どうもRHEL系はpodmanというdocker互換のものがいるらしいです。これがzabbixのDocker監視機能で引っかかるかはまったくわかりません。多分ダメだと思いますが。
......
とこんなわけで、現時点では監視対象がRHEL8系とかでないとDockerを監視することがそもそもできない構造になっています。
これらはただ表面のWhats Newとか読んでるだけだと気づけない落とし穴です。まんまと私ははまりました......
でもこのままDockerが監視できるのかどうかわからないのもどうかと思いますので、zabbix公式ページにおいて言及されているubuntu18.04にDockerをインストールし、docker-compose.ymlを編集して実際に動作させてみました。
ですがタイトル通りダメでした。
(2020/05/26追記)冒頭に書いた通りagent2を直接aptでインストールして設定を行うことで監視することができるようにはなってます。Dockerでは片付いてないですけども......
実際zabbixがどんなことができるかを調べるためにはdocker-composeで試したほうが早いとは思います。ただ今回のように自分のできなさにすぐたどり着いてしまうのがつらいですが......
では本題です。今回は
- VagrantでUbuntu18.04を実行する
- Dockerとdocker-composeをインストールする
- 公式のzabbix用docker-composeをpullして動かす
- zabbix-agent2 imageをdocker-composeで動かす
- Dockerを監視項目に追加して結果を確認する
という感じでやっていきます。
VagrantでUbuntu18.04を実行する
Docker for Desktopはかなり便利ですが少し特殊な挙動をしてコンテナの外の話になると途端に扱いづらくなります。たとえばDockerホストそのものにLinuxのコマンドを実行したいときなどは方法がほぼありません。
そこでVirtualboxとVagrantを使います。vagrantでOSインストールとか設定とかの手間を省きたいためです。
これらを事前にインストールしておきます。Hyper-Vを使っている場合だとVirtualboxを使えない場合があるので共存できるかできないかは適宜調査をお願いします。
virtualbox https://www.virtualbox.org/
vagrant https://www.vagrantup.com/
準備が完了したらCLIの所定のディレクトリでディレクトリを用意し、そのディレクトリに入ってからvagrant initします。
$ mkdir ubuntu18
$ cd ubuntu18
$ vagrant init
作成されたvagrantfileを以下のようにします。これでubuntu18.04がインストールされ、zabbix完成後はwebブラウザで192.168.33.10にアクセスすればzabbixのweb画面を見ることができます。
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-18.04"
config.vm.network "private_network", ip: "192.168.33.10"
end
完了したらvagrant upでubuntuのインストールと起動を行います。だいぶ時間がかかります。
$ vagrant up
完了したらvagrant sshでubuntu内に入り、root権限に移行します。
$ vagrant ssh
$ sudo su -
#
Dockerとdocker-composeをインストールする
楽をするため、今回はdockerの公式が用意しているというshスクリプトを使います。これもしばらく待つとdockerのバージョンが表示され完了します。
参考:最も簡単なDockerの公式セットアップ方法(CentOS/Ubuntu) https://qiita.com/zembutsu/items/bedb18e1061303e217b8
参考:Zabbix 5.0 を Docker Compose で起動する手順 https://qiita.com/zembutsu/items/d98099bf68399c56c236
# curl -fsSL get.docker.com -o get-docker.sh
# sudo sh ./get-docker.sh
実行結果は以下のようになります。
# Executing docker install script, commit:
[中略]
+ sh -c docker version
Client: Docker Engine - Community
Version: 19.03.9
API version: 1.40
Go version: go1.13.10
Git commit: 9d988398e7
Built: Fri May 15 00:25:18 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.9
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 9d988398e7
Built: Fri May 15 00:23:50 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
If you would like to use Docker as a non-root user, you should
now consider
adding your user to the "docker" group with something like:
sudo usermod -aG docker your-user
Remember that you will have to log out and back in for this to
take effect!
WARNING: Adding a user to the "docker" group will grant the ability to run
containers which can be used to obtain root privileges on the
docker host.
Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
for more information.
次にdocker-composeをcurlでインストールします。
# sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
実行権限を付与しておきます。
# sudo chmod +x /usr/local/bin/docker-compose
docker-comoposeのバージョンを確認します。1.25.5となっていればよいです。
docker-compose --version
# docker-compose version 1.25.5, build 8a1c60f6
公式のzabbix用docker-composeをpullして動かす
では本題のzabbix公式docker-composeのファイル群をpullします。
github zabbix-docker https://github.com/zabbix/zabbix-docker
# git clone https://github.com/zabbix/zabbix-docker.git
cloneしてできたディレクトリに移動してdocker-compose.yamlを指定して起動します。今回はalpine版postgresDBのものを実行します。latestにしているのはzabbix公式がpushしているイメージをそのまま使えるようにするためです。
# cd zabbix-docker
# docker-compose -f docker-compose_v3_alpine_pgsql_latest.yaml up -d
docker-compose psでコンテナが全部起動しているか確認します。db_dataはexit0してますがこれで問題ないそうです。
# docker-compose -f docker-compose_v3_alpine_pgsql_latest.yaml ps
WARNING: Some services (zabbix-agent, zabbix-java-gateway, zabbix-proxy-mysql, zabbix-proxy-sqlite3, zabbix-server, zabbix-snmptraps, zabbix-web-apache-pgsql, zabbix-web-nginx-pgsql) use the 'deploy' key, which will be ignored. Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm.
Name Command State Ports
---------------------------------------------------------------
zabbix-docker_ sh Exit 0
db_data_mysql_
1
zabbix-docker_ sh Exit 0
db_data_pgsql_
1
zabbix- docker- Up
docker_mysql- entrypoint.sh
server_1 mysql ...
zabbix-docker_ docker- Up
postgres- entrypoint.sh
server_1 postgres
zabbix- /sbin/tini -- Up
docker_zabbix- /usr/bin/doc
agent_1 ...
zabbix- docker- Up
docker_zabbix- entrypoint.sh
java-gateway_1 /usr/ ...
zabbix- /sbin/tini -- Up 0.0.0.0:10071-
docker_zabbix- /usr/bin/doc >10051/tcp
proxy-mysql_1 ...
zabbix- /sbin/tini -- Up 0.0.0.0:10061-
docker_zabbix- /usr/bin/doc >10051/tcp
proxy- ...
sqlite3_1
zabbix- /sbin/tini -- Up 0.0.0.0:10051-
docker_zabbix- /usr/bin/doc >10051/tcp
server_1 ...
zabbix- /usr/bin/super Up 0.0.0.0:162->1
docker_zabbix- visord -c /e 162/udp
snmptraps_1 ...
zabbix- docker- Up (healthy) 0.0.0.0:80->80
docker_zabbix- entrypoint.sh 80/tcp, 0.0.0.
web-apache- /usr/ ... 0:443->8443/tc
pgsql_1 p
zabbix- docker- Up (healthy) 0.0.0.0:8081->
docker_zabbix- entrypoint.sh 8080/tcp, 0.0.
web-nginx- 0.0:8443->8443
pgsql_1 /tcp
root@vagrant:~/zabbix-docker#
webブラウザにアクセスしてみます。
http://192.168.33.10/
web画面が表示できたようです。以下の初期パスワードでログインします。
Username:Admin
Password:zabbix
完了すると以下の画面にたどり着きます。
Zabbix agent is not available (for 3m)とかでているのでこれだけ解消します。
左側のリボンでConfigrationを押して、hostsを選択します。
Zabbix serverのリンクをクリックします。
DNS nameをzabbix-agentと入力し、Connect toをDNSでボタンを押しておきます。終わったらUpdateボタンを押します。
終わったら2分くらい放置した後で左側リボンのMonitoringのLatest dataを押します。するとデータが入ってきていることが確認できます。これでzabbix agentから情報を取得できるようになりました。
top画面からもエラーは消えました。これで大丈夫です。
とはいえ後述するtemplateの追加でdockerを追加してもこんな感じで何も情報が入ってきません。だからagent2を用意する必要があります。
確認ができたのでいったんコンテナをdownします。downするときもこんな感じでファイル指定がいります。少々面倒ですね。
# docker-compose -f docker-compose_v3_alpine_pgsql_latest.yaml down
docker-compose up -dで動かせるようにする
upとかdownとかのコマンドが大変面倒なことになっているので先ほど使用したファイルをコピーしてそれの名前をdocker-compose.yamlにします。これでだいぶ使いやすくなります。
# cp docker-compose_v3_alpine_pgsql_latest.yaml docker-compose.yaml
ちゃんとファイルがいることが確認できます。
# ls | grep docker-compose.yaml
docker-compose.yaml
(2020/05/26追記)zabbix agent2のVMへの直接インストール
ここでubuntu18.04に直接zabbix agent2をインストールします。これにより自分のDockerの状態を監視することができます。
以下の記事を参考にさせていただきました。Twitterで困ってるときにお助けいただいた方の記事です。ありがとうございました。なんとかできました。
参考:Zabbixエージェント2を使用したDockerの監視 https://qiita.com/atanaka7/items/15a553b78b013ab537c1
zabbixリポジトリを登録します。
# wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+bionic_all.deb
# dpkg -i zabbix-release_5.0-1+bionic_all.deb
# apt update
zabbix agent2をインストール。
# apt install zabbix-agent2
ここで私がコンテナで実現できなかった、dockerグループにユーザーzabbixの追加を行います。後述する手順もdocker-composeでうまく置き換えることができればうまくいくと思いますが現状はまだ思いついていません。docker.sockをvolumesに記述するやり方はやってみたもののうまくはいかなかったです。
# gpasswd -a zabbix docker
zabbix agent2を起動(コマンド的には再起動?)します。
# systemctl restart zabbix-agent2
このあとdocker-compose.yamlのagentの部分をこんな感じでまとめてコメントアウトしておきます。
# zabbix-agent:
# image: zabbix/zabbix-agent:alpine-5.0-latest
# ports:
# - "10050:10050"
[中略]
# labels:
# com.zabbix.description: "Zabbix agent"
# com.zabbix.company: "Zabbix LLC"
# com.zabbix.component: "zabbix-agentd"
# com.zabbix.os: "alpine"
これで準備が整いました。zabbixコンテナを起動します。
# docker-compose up -d
起動できたらConfigration -> Hosts -> Zabbix serverと選択し、以下のように設定します。Agentの値はvagrantで指定したipアドレスです。
Agent:192.168.33.10
Connect to: IP
Port:10050
その後Templateタブを押してLink new templateから「Template App Docker」を選んでupdateボタンを押します。
これで二分後くらいに以下のようなエラーがHostsのページのAvailabilityで赤いZBXを押すと出ると思います。
Received empty response from Zabbix Agent at [192.168.33.10]. Assuming that agent dropped connection because of access permissions.
本来は攻撃をはじくためのものかと思いますが今回はこれを通すようにしてしまいます。もっといい方法があってほしいですが。
ここでzabbix agent2のログをみてみます。するとzabbix server側のエラーに呼応するようなエラーが出力されています。
# tail /var/log/zabbix/zabbix_agent2.log
[中略]
2020/05/26 10:14:04.228621 cannot accept incoming connection for peer: 172.16.238.3
zabbix_agent2.confを編集します。
# vi /etc/zabbix/zabbix_agent2.conf
これでServerの設定を172.16.238.3に編集します。
Server=172.16.238.3
[中略]
ServerActive=172.16.238.3
zabbix agent2を起動(コマンド的には再起動?)します。
# systemctl restart zabbix-agent2
そしてしばらくするとzabbix側で監視ができるようになったのか、Availabilityで赤いZBXが緑色のZBXに変わっています。
ただし、Docker.pingしか取得ができません。そういうときは一度zabbix serverを再起動してください。
具体的には以下のコマンドになります。
# docker-compose down
# docker-compose up -d
これで待つことでこんな感じで値を取得できるようになります。
かなり情報が細かく取得できるのでDockerをフル活用している人にはかなり便利だと思います。
たとえばDocker使ってると稀に起きるimageでいっぱいになる!とかもチェックできるようになっています。しかもグラフで。
実際にこれがどんなふうに警告が出て、実際に予防できるかどうかはちょっといろいろやってみないとすぐにはわかりませんがこれで道筋は開けたようです。
(追記:できませんでした、agentをdockerでやりたい人以外はやらなくていいです)zabbix-agent2 imageをdocker-composeで動かす
出来上がったdocker-compose.yamlに追記します。
vimでもいいと思いますが私はvscodeのremote developmentを使って直に編集できるようにしています。
追記することは非常に単純で、zabbix-agentの部分をコピペします。
そのあとzabbix-agentの情報のimage:部分をzabbix/zabbix-agent2:alpine-5.0-latest、つまりdocker imageのzabbix agent2に変え、最後にpostsのホスト側を10050から10060にするだけです。
zabbix-agent2:
image: zabbix/zabbix-agent2:alpine-5.0-latest
ports:
- "10060:10050"
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ./zbx_env/etc/zabbix/zabbix_agentd.d:/etc/zabbix/zabbix_agentd.d:ro
- ./zbx_env/var/lib/zabbix/modules:/var/lib/zabbix/modules:ro
- ./zbx_env/var/lib/zabbix/enc:/var/lib/zabbix/enc:ro
- ./zbx_env/var/lib/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys:ro
links:
- zabbix-server:zabbix-server
deploy:
resources:
limits:
cpus: '0.2'
memory: 128M
reservations:
cpus: '0.1'
memory: 64M
mode: global
env_file:
- .env_agent
privileged: true
pid: "host"
networks:
zbx_net_backend:
aliases:
- zabbix-agent
- zabbix-agent-passive
- zabbix-agent-alpine
stop_grace_period: 5s
labels:
com.zabbix.description: "Zabbix agent"
com.zabbix.company: "Zabbix LLC"
com.zabbix.component: "zabbix-agentd"
com.zabbix.os: "alpine"
そのあとでagent1にあたるものは全部コメントアウトしておいてください。とはいえ一度agent1とagent2をコンテナで動かしていても結果に変化はありませんでした。
# zabbix-agent:
# image: zabbix/zabbix-agent:alpine-5.0-latest
# ports:
# - "10050:10050"
[中略]
# labels:
# com.zabbix.description: "Zabbix agent"
# com.zabbix.company: "Zabbix LLC"
# com.zabbix.component: "zabbix-agentd"
# com.zabbix.os: "alpine"
終わったらdocker-compose up -dをします。
# docker-compose up -d
Dockerを監視項目に追加して結果を確認する
ここからがうまくいかなかった話です。
再びconfigrationのhostsに移動し、create hostをクリックします。
hostnameは適当でよいです。DNS nameをzabbix-agent2と入力し、Connect toをDNSでボタンを押しておきます。
さらにtemplateタブを押して移動してLink new templates
行のselectを押し、Applications → Dockerと選びます。
終わったらUpdateボタンを押します。
そうすればうまくいくと思ったのですが、結局ダメでした。こんな感じで待てど暮らせどデータが入ってきません。
topの画面でもこんな感じで表示されます。
にもかかわらずagent2のstatusはenabledになっています。zabbix初心者なのでこんな事象ははじめてで皆目見当がつかないです。
ここからいくらか粘ったのですがどこから情報をあさればいいのかもわからず結局終了しました。つらい。
おわりに
本当はdocker-composeだけで全部できましたって記事にしたかったのですが結局うまくいきませんでした。zabbix-agent2直インストールはDockerをせっかく使っているのに少しもったいない状態です。
冒頭でも書きましたが一応Zabbix5を一から環境セットアップしてagent2そのものを動かすことはできていますし、Dockerの監視がどんな感じが知りたいという方はぜひこの記事でお試しください。
この手順から何かすればうまくdocker-compose.ymlだけでdocker監視できるかもしれないので、もしできた人がいたらコメントください。
私のこの徒労がほかの人のためになることを願ってます......