LoginSignup
9
7

More than 3 years have passed since last update.

Zabbix5.0とZabbix agent2をubuntu18.04とvagrantとdocker-composeで動かしてみたけど自分のDockerをまだ監視できない

Last updated at Posted at 2020-05-20

はじめに

申し訳ないのですがこれは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使いには魅力的かと思います。

5 What's new in Zabbix 5.0.0 https://www.zabbix.com/documentation/current/manual/introduction/whatsnew500#zabbix_agent_2

これの前に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/

1login.png

web画面が表示できたようです。以下の初期パスワードでログインします。

Username:Admin
Password:zabbix

完了すると以下の画面にたどり着きます。

2top.png

Zabbix agent is not available (for 3m)とかでているのでこれだけ解消します。

左側のリボンでConfigrationを押して、hostsを選択します。

2secehost.png

Zabbix serverのリンクをクリックします。

4hosts.png

DNS nameをzabbix-agentと入力し、Connect toをDNSでボタンを押しておきます。終わったらUpdateボタンを押します。

5dnssettingchange.png

終わったら2分くらい放置した後で左側リボンのMonitoringのLatest dataを押します。するとデータが入ってきていることが確認できます。これでzabbix agentから情報を取得できるようになりました。

6latestdata.png

top画面からもエラーは消えました。これで大丈夫です。

7topafter.png

とはいえ後述するtemplateの追加でdockerを追加してもこんな感じで何も情報が入ってきません。だからagent2を用意する必要があります。

8agent1docker.png

確認ができたのでいったんコンテナを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

公式の手順:https://www.zabbix.com/jp/download?zabbix=5.0&os_distribution=ubuntu&os_version=18.04_bionic&db=postgresql&ws=nginx

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に変わっています。

16avalable.png

ただし、Docker.pingしか取得ができません。そういうときは一度zabbix serverを再起動してください。

具体的には以下のコマンドになります。

# docker-compose down
# docker-compose up -d

これで待つことでこんな感じで値を取得できるようになります。

17latestdata.png

かなり情報が細かく取得できるのでDockerをフル活用している人にはかなり便利だと思います。

18latestdata2.png

たとえばDocker使ってると稀に起きるimageでいっぱいになる!とかもチェックできるようになっています。しかもグラフで。

19graph.png

実際にこれがどんなふうに警告が出て、実際に予防できるかどうかはちょっといろいろやってみないとすぐにはわかりませんがこれで道筋は開けたようです。

(追記:できませんでした、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をクリックします。

9createhost.png

hostnameは適当でよいです。DNS nameをzabbix-agent2と入力し、Connect toをDNSでボタンを押しておきます。

10hostadd.png

さらにtemplateタブを押して移動してLink new templates
行のselectを押し、Applications → Dockerと選びます。

11templateadd.png

終わったらUpdateボタンを押します。

そうすればうまくいくと思ったのですが、結局ダメでした。こんな感じで待てど暮らせどデータが入ってきません。

12dockernothing.png

topの画面でもこんな感じで表示されます。

13topareat.png

にもかかわらずagent2のstatusはenabledになっています。zabbix初心者なのでこんな事象ははじめてで皆目見当がつかないです。

14confighosts.png

ここからいくらか粘ったのですがどこから情報をあさればいいのかもわからず結局終了しました。つらい。

おわりに

本当はdocker-composeだけで全部できましたって記事にしたかったのですが結局うまくいきませんでした。zabbix-agent2直インストールはDockerをせっかく使っているのに少しもったいない状態です。

冒頭でも書きましたが一応Zabbix5を一から環境セットアップしてagent2そのものを動かすことはできていますし、Dockerの監視がどんな感じが知りたいという方はぜひこの記事でお試しください。

この手順から何かすればうまくdocker-compose.ymlだけでdocker監視できるかもしれないので、もしできた人がいたらコメントください。

私のこの徒労がほかの人のためになることを願ってます......

9
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7