Docker 实践(六):容器监控

前言

这两天研究了一下容器监控的问题,配置的过程中网上基本上找不到成型的教程文章,所以这篇文章记录一下,希望能给有需要的人带来帮助。

监控方案

监控方案我选择了 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=" \
  -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。

  • 模板 选项卡中选择第二步中导入的模板,添加更新。

  • 监控 > 最新数据 中查看监控数据。

参考

  • How To Install Zabbix on Ubuntu & Configure it to Monitor Multiple VPS Servers

  • monitoringartist/zabbix-3.0-xxl

  • monitoringartist/zabbix-agent-xxl-limited

  • zabbix-docker-monitoring

  • 如何选择Docker监控方案

你可能感兴趣的:(docker)