čtvrtek 2. března 2017

Jak monitorovat Docker Zabbixem


 V poslední době se pracově intenzívně zabývám projektem Docker. V práci mám aktuálně instalovaných 6 serverů s docker-engine. Dva na seznamovaní a čtyři jsou aktuálně nachystané pro jeden větší projekt.

V rámci instalace serveru s CentOS 7.3 pomocí Kickstart se provádí post-install kroky jako přidáni repo docker a nastavení proxy.

yum install -y yum-utils
yum-config-manager --add-repo https://docs.docker.com/engine/installation/linux/repo_files/centos/docker.repo
 

systemctl enable docker.service

vi /etc/yum.conf
proxy=http://192.168.10.42:8080
 

mkdir -p /etc/systemd/system/docker.service.d/
vi /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://192.168.10.42:3128/"


Když máme funkční Docker prostředí, přichází logicky na řadu monitoring :-) Existuje celá řada různých Zabbix šablon viz např. tento seznam. Já si vybral takovou velmi pěkně propracovanou a hlavně rychlou. Na konferenci Zabbix jsem poznal monitoringartist přesněji řečeno Jan Garaj se kterým jsem byl již v minulosti v kontaktu ohledně Zabbix překladů.

Jeho řešení monitorování Dockeru je zajímavé tím, že využívá zabbix agent modul. Moduly Zabbix zavedl od verze 2.2. Jedná se o možnost doplnit funkcionalitu zabbix agenta o vlastni klíče. Běžně se tato funkcionalita provádí skrze UserParameter, kde si definujeme klíč a k němu script, který získá požadovanou hodnotu. Ale toto je velmi pomalé a neefektivní. Pokud použijeme agent modul, který je psaný v jazyce C, je rychlost získání hodnot až 10x vyžší.

Na GitHubu je velmi podrobný postup, jak si modul zkompilovat. Honza má i předkompilované verze pro Zabbix 3.0 a 3.2 a to pro mnoho různých Linux distribucí.

Já šel cestou vlastní kompilace. Modul jsem si zkompiloval pro Zabbix 3.0:

yum install -y wget autoconf automake gcc svn

svn export svn://svn.zabbix.com/branches/3.0 zabbix
cd zabbix
./bootstrap.sh
./configure --enable-agent
mkdir src/modules/zabbix_module_docker
cd src/modules/zabbix_module_docker
wget https://raw.githubusercontent.com/monitoringartist/zabbix-docker-monitoring/master/src/modules/zabbix_module_docker/zabbix_module_docker.c
wget https://raw.githubusercontent.com/monitoringartist/zabbix-docker-monitoring/master/src/modules/zabbix_module_docker/Makefile
make
gcc -fPIC -shared -o zabbix_module_docker.so zabbix_module_docker.c -I../../../include -I../../../src/libs/zbxsysinfo
cp zabbix_module_docker.so /usr/local/lib/ 


Dále je potřeba umožnit Zabbixu číst Docker socket. Můžeme upravit konfiguraci Zabbix agenta a udělit oprávnění roota nebo přidat zabbix do skupiny docker. Zabbix agent může ziskat vyšši opravnění v podobě AllowRoot=1.

usermod -aG docker zabbix

nebo
 
vi /etc/zabbix/zabbix_agentd.conf
...
AllowRoot=1 

...
LoadModulePath=/usr/local/lib
LoadModule=zabbix_module_docker.so

 
Po restartu agenta se v logu objěví uspěšné nahrání modulu.

systemctl restart zabbix-agent.service

tail -f /var/log/zabbix/zabbix_agentd.log
...
51284:20170301:132041.853 loaded modules: zabbix_module_docker.so


Tento postup je pro toho kdo má svůj Zabbix server, který neběží v Dockeru. Dá se využít Honzova uceleného řešení Zabbix XXL, které logicky má již vše nastavené monitorování Dockeru.

Velké díky Honzovi za jeho zabbix modul zabbix_module_docker.c