前言
这两天研究了一下容器监控的问题,配置的过程中网上基本上找不到成型的教程文章,所以这篇文章记录一下,希望能给有需要的人带来帮助。
监控方案
监控方案我选择了 Zabbix,要实现对每个容器信息的监控,需要 zabbix-docker-monitoring 插件。
配置服务端
Zabbix 是 C/S 架构,服务端最好能配置在一台独立的宿主机上。
服务端 docker-compose 文件:
version: '2'
services:
zabbix:
image: monitoringartist/zabbix-xxl
ports:
- 8080:80
- 10051:10051
volumes:
- /etc/localtime:/etc/localtime:ro
depends_on:
- zabbix.db
environment:
ZS_DBHost: zabbix.db
ZS_DBUser: zabbix
ZS_DBPassword: zabbix_password
zabbix.db:
image: monitoringartist/zabbix-db-mariadb
volumes:
- /backups:/backups
- /etc/localtime:/etc/localtime:ro
volumes_from:
- zabbix-db-storage
environment:
MARIADB_USER: zabbix
MARIADB_PASS: zabbix_password
zabbix-db-storage:
image: busybox:latest
volumes:
- /var/lib/mysql
容器方式运行 Zabbix-agent
可以无需在宿主机安装 Zabbix-agent,直接运行官方的容器即可。
运行 Zabbix-agent 容器:
docker run \
--name=zabbix-agent-xxl \
-h $(hostname) \
-p 10050:10050 \
-v /:/rootfs \
-v /var/run:/var/run \
-e "ZA_Server=<ZABBIX SERVER IP/DNS NAME>" \
-d monitoringartist/zabbix-agent-xxl-limited:latest
配置容器
修改
ZA_Server
,直接改成服务器 ip。
如果想覆盖容器中 agent 的配置变量,可以在 run 的时候使用 -e ZA_Variable=value
的方法,但是对 AllowRoot, LoadModulePath, LoadModule, LogType 的配置无法覆盖,其中 AllowRoot 的默认值就是 1,参看 Github Issue。
宿主机直接运行 Zabbix-agent
容器的方式运行 zabbix-agent
不支持 docker.xnet
数据的监控,想要监控 docker.xnet
数据,得直接在宿主机上运行 zabbix-agent
,并加载 zabbix_module_docker.so
,参看 Github Issue。
1. 添加 zabbix 用户和组
groupadd zabbix
useradd -g zabbix zabbix
2. 编译安装 zabbix-agent
apt-get install -y wget autoconf automake gcc subversion make pkg-config
cd ~
mkdir zabbix32
cd zabbix32
svn co svn://svn.zabbix.com/branches/3.2 .
./bootstrap.sh
./configure --enable-agent
make install
3. 编译 zabbix_module_docker.so
:
cd ~/zabbix32
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
cp zabbix_module_docker.so /usr/local/lib/zabbix/agent/
4. 启动 zabbix_agentd
使用 systemd 管理进程,关于 systemd 可参考 阮一峰的网络日志 ,创建 /lib/systemd/system/zabbix-agentd.service
文件:
[Unit]
Description=Zabbix Agent
After=syslog.target
After=network.target
[Service]
Environment="CONFFILE=/usr/local/etc/zabbix_agentd.conf"
Type=forking
Restart=on-failure
PIDFile=/tmp/zabbix_agentd.pid
KillMode=control-group
ExecStart=/usr/local/sbin/zabbix_agentd -c $CONFFILE
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s
[Install]
WantedBy=multi-user.target
执行下面命令告知 systemctl 如何启动 zabbix-agentd
sudo systemctl enable zabbix-agentd.service
5. 配置加载项
修改 zabbix-agentd 配置文件 /usr/local/etc/zabbix_agentd.conf
中的下面几个参数:
Server=Zabbix-Server-IP
ServerActive=Zabbix-Server-IP
Hostname=Current-Host-Name
Timeout=30
LoadModulePath=/usr/local/lib/zabbix/agent
LoadModule=zabbix_module_docker.so
运行下面命令启动 zabbix-agentd
systemctl start zabbix-agentd.service
6. 启动失败分析
如果启动失败,查看
/tmp/zabbix_agentd.log
文件,如不存在,可手动创建,所属用户为zabbix:zabbix
。-
报错:
zabbix_agentd [xxxxx]: cannot attach to existing shared memory: [13] Permission denied cannot allocate shared memory for collector
可能是
zabbix_module_docker.so
编译错误,重新编译一次即可。
设置监控
1. 登录管理系统
浏览器访问 http://ZabbixServerIP:Port
,可以看到 zabbix 服务器 web 管理界面,默认登录帐号是 Admin/zabbix
(注意 Admin 首字母大写)。
为了方便操作,可将系统语言设置为中文。
2. 导入模板
在
配置 > 模板
里面导入监控模板:zabbix-template-app-docker.xml。
注:模板里有一些已经配置好的监控方案,可以参考取舍。
3. 创建主机群组
在
配置 > 主机群组
里创建主机群组,命名为Docker Servers
。
4. 创建主机
在
配置 > 主机
里面创建一个主机。群组选择
Docker Servers
。agent代理程序的接口
填写要监控的 agent ip。模板
选项卡中选择第二步中导入的模板,添加更新。在
监控 > 最新数据
中查看监控数据。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。