docker容器创建zabbix服务以及自动发现\自动注册\ 监控docker容器
version: '2'
services:
zabbix-mysql:
container_name: zabbix-mysql
image: mysql:5.7
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix
MYSQL_DATABASE: zabbix
command:
--character-set-server=utf8
--collation-server=utf8_bin
volumes:
- /etc/localtime:/etc/localtime:ro
- /home/zhangm/zabbix/mysql-data:/var/lib/mysql
networks:
- zabbix
zabbix-server:
container_name: zabbix-server
image: zabbix/zabbix-server-mysql:centos-trunk
ports:
- "10051:10051"
restart: always
environment:
DB_SERVER_HOST: zabbix-mysql
MYSQL_USER: zabbix
MYSQL_DATABASE: zabbix
MYSQL_PASSWORD: zabbix
volumes:
- /etc/localtime:/etc/localtime:ro
- /home/zhangm/zabbix/alertscripts:/usr/lib/zabbix/alertscripts
- /home/zhangm/zabbix/externalscripts:/usr/lib/zabbix/externalscripts
depends_on:
- zabbix-mysql
links:
- zabbix-mysql
networks:
#固定ip地址
zabbix:
ipv4_address: 172.22.0.2
zabbix-nginx:
container_name: zabbix-nginx
image: zabbix/zabbix-web-nginx-mysql
restart: always
ports:
- "80:80"
depends_on:
- zabbix-mysql
- zabbix-server
links:
- zabbix-mysql
environment:
DB_SERVER_HOST: zabbix-mysql
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix
MYSQL_DATABASE: zabbix
ZBX_SERVER_HOST: zabbix-server
PHP_TZ: Asia/Shanghai
networks:
- zabbix
networks:
zabbix:
driver: bridge
#自定义网络信息
ipam:
config:
- subnet: 172.22.0.0/16
gateway: 172.22.0.1
启动docker-agent客户端
#需要注意的是ZBX_HOST_NAME名称一定要与创建主机的“主机名称”一样
docker run --name zabbix-agent --network zabbix -e ZBX_HOST_NAME=agentd -e ZBX_SERVER_HOST=zabbix-server -d zabbix/zabbix-agent
遇到问题:
docker-compose up -d
服务启动以后,访问http://ip
可能会出现错误界面:
The frontend does not match Zabbix database. Current database version (mandatory/optional): 4020000/4020000. Required mandatory version: 4000000. Contact your system administrator.解决办法:
进入mysql容器修改一下数据的版本信息
执行:update dbversion set mandatory=“提示信息建议的版本号”;
flush privileges;
刷新页面就ok了
创建钉钉机器人报警
参考链接:https://blog.51cto.com/m51cto/2051945
下载Python报警脚本
git clone https://github.com/donxan/zabbix.git按照我们的实际情况修改一下
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import json
import sys
import os
headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "https://oapi.dingtalk.com/robot/send?access_token=780bb40a417db03bc174a55f98a49429614e0aab6fabd6b277178c657754f146"
def msg(text):
json_text= {
"msgtype": "text",
"text": {
"content": text
},
"at": {
"atMobiles": [
"18610376377"
],
"isAtAll": False
}
}
print requests.post(api_url,json.dumps(json_text),headers=headers).content
if __name__ == '__main__':
text = sys.argv[1]
msg(text)
执行Python脚本的时候会报错提示缺少requests扩展,所以需要在原有的镜像的基础上添加一些扩展
进入容器
docker exec -it zabbix-server bash
#安装epel源
yum install -y epel-release
#安装Python-pip
yum install -y python-pip
#更新pip版本
pip install --upgrade pip
#安装requests扩展
pip install requests
#查看安装的扩展
pip list
重建zabbix-server镜像的dockerfil
#dockerfile
FROM zabbix/zabbix-server-mysql:centos-trunk
MAINTAINER ZABBIX
#安装python requests扩展
RUN yum install -y epel-release
RUN install -y python-pip \
&& pip install --upgrade pip\
&& pip install requests
自动发现/自动注册参考:
https://blog.csdn.net/scott_bing/article/details/78808312
监控docker容器状态
宿主机安装zabbix-agent(yum安装)
Zabbix监控系统提供两种监控Linux主机的方法,一种是启用主机上的SNMP协议,另一种是在主机上安装Zabbix Agent服务,介绍Linux系统下Zabbix Agent的安装与使用。
#添加Repository
使用yum方式安装Zabbix Agent,在安装前首先添加对应的yum repository
rpm包下载地址:http://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/
CentOS/RHEL 7:
rpm -Uvh http://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm
# 安装Zabbix Agent
yum install zabbix-agent
# 编辑Zabbix Agent 配置文件
vim /etc/zabbix/zabbix_agentd.conf
Server=[zabbix server ip]
ServerActive=[zabbix server ip]
Hostname=[ Hostname of client system ]
# 重启Zabbix Agent
service zabbix-agent restart
# 添加开机启动
chkconfig zabbix-agent on
下边开始正式开始设置
zabbix配置设置
zabbix_server.conf
##脚本路径 AlertScriptsPath=/usr/lib/zabbix/alertscripts
zabbix_agentd.conf
##允许使用用户自定义参数 UnsafeUserParameters=1 ##导入该文件下的配置 Include=/etc/zabbix/zabbix_agentd.d/*.conf
自定义监控脚本
##自动发现docker容器的脚本,以下操作是在zabbix_agent端进行的 ##脚本放在一般放在这里/etc/zabbix/script (新建了一个script的目录) docker_discovery.py #!/usr/bin/python import os import simplejson as json t=os.popen("""sudo docker ps |grep -v 'CONTAINER ID'|awk {'print $NF'} """) container_name = [] for container in t.readlines(): r = os.path.basename(container.strip()) container_name += [{'{#CONTAINERNAME}':r}] print json.dumps({'data':container_name},sort_keys=True,indent=4,separators=(',',':')) ##运行python脚本 [root@zhangm alertscripts]# python docker_discovery.py { "data":[ { "{#CONTAINERNAME}":"zabbix-nginx" }, { "{#CONTAINERNAME}":"zabbix-mysql" } ] }
获取容器监控项的脚本
#docker_monitor.py 输入容器名称以及监控项 #!/usr/bin/python import docker import sys import subprocess import os def check_container_stats(container_name,collect_item): #docker_client = docker_client.containers.get(container_name) container_collect=docker_client.containers.get(container_name).stats(stream=True) old_result=eval(container_collect.next()) new_result=eval(container_collect.next()) result container_collect.close() if collect_item == 'cpu_total_usage': result=new_result['cpu_stats']['cpu_usage']['total_usage'] - old_result['cpu_stats']['cpu_usage']['total_usage'] elif collect_item == 'cpu_system_usage': result=new_result['cpu_stats']['system_cpu_usage'] - old_result['cpu_stats']['system_cpu_usage'] elif collect_item == 'cpu_percent': cpu_total_usage=new_result['cpu_stats']['cpu_usage']['total_usage'] - old_result['cpu_stats']['cpu_usage']['total_usage'] cpu_system_uasge=new_result['cpu_stats']['system_cpu_usage'] - old_result['cpu_stats']['system_cpu_usage'] cpu_num=len(old_result['cpu_stats']['cpu_usage']['percpu_usage']) result=round((float(cpu_total_usage)/float(cpu_system_uasge))*cpu_num*100.0,2) elif collect_item == 'mem_usage': result=new_result['memory_stats']['usage'] elif collect_item == 'mem_limit': result=new_result['memory_stats']['limit'] elif collect_item == 'network_rx_bytes': result=new_result['networks']['eth0']['rx_bytes'] elif collect_item == 'network_tx_bytes': result=new_result['networks']['eth0']['tx_bytes'] elif collect_item == 'mem_percent': mem_usage=new_result['memory_stats']['usage'] mem_limit=new_result['memory_stats']['limit'] result=round(float(mem_usage)/float(mem_limit)*100.0,2) return result if __name__ == "__main__": docker_client = docker.DockerClient(base_url='unix://var/run/docker.sock', version='1.13.1') container_name=sys.argv[1] collect_item=sys.argv[2] print collect_item print check_container_stats(container_name,collect_item) 运行结果: [root@zhangm alertscripts]# python docker_monitor.py zabbix-server mem_usage 63594496
执行脚本可能会遇到的问题
##如果运行报错,显示xxx模块未装,则使用pip安装即可。 yum install python-pip -y #安装pip pip install XXX pip install simplejson #安装simplejson模块 ##修改脚本的权限和所属用户以及组 chmod 755 docker_discovery.py chmod 755 docker_monitor.py chown zabbix:zabbix /etx/zabbix/script -R ##在server执行脚本时可能会遇到权限的问题 ##赋予zabbix权限,编辑/etc/sudoers 添加如下内容 zabbix ALL=(root) NOPASSWD: ALL #可能权限比较大 或者 zabbix ALL=(root) NOPASSWD:/usr/bin/docker,/usr/bin/python,/etc/zabbix/script/docker_discovery.py #这种写法比较具体 ##添加配置文件,配置文件放在/etc/zabbix/zabbix_agentd.d/里面,如下 cat docker_discovery.conf UserParameter=docker_discovery,python /data/docker/zabbix/alertscripts/docker_discovery.py UserParameter=docker_status[*],sudo /usr/bin/python /data/docker/zabbix/alertscripts/docker_monitor.py $1 $2
在server端测试脚本
#默认情况下zabbix-server镜像里是没有安装zabbix_get的。可以使用apt-get来安装,在server端执行 yum install zabbix-get #下边开始测试脚本: [root@1f44da0e86ca zabbix]# zabbix_get -s 192.168.1.40 -k docker_discovery python: can't open file '/data/docker/zabbix/alertscripts/docker_discovery.py': [Errno 13] Permission denied #执行完报错 拒绝访问 #需要关闭宿主机的selinux,我这里测试用临时关闭一下,机器重启以后会恢复开启的状态 [root@zhangm zabbix_agentd.d]# setenforce 0 [root@zhangm zabbix_agentd.d]# sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: permissive Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 31 #关闭selinux以后重新执行 [root@1f44da0e86ca zabbix]# zabbix_get -s 192.168.1.40 -k docker_discovery { "data":[ { "{#CONTAINERNAME}":"zabbix-nginx" }, { "{#CONTAINERNAME}":"zabbix-server" }, { "{#CONTAINERNAME}":"zabbix-mysql" } ] }
zabbix界面添加模板以及监控项
Configuration-Templates-create-template
新建applications
创建自动发现规则(discovery rules)
{#CONTAINERNAME}为docker_discovery获取的参数
保存完即可,下边讲一下添加监控项
添加的监控项要在自动发现规则下边的监控项设置里面新增
CPU_PERCENT
创建Graph
创建完以后就可以看效果了
问题总结:
之前创建的docker容器都是在防火墙关闭的情况创建的
docker-compose启动好项目以后,发现zabbix-server容器使用的镜像缺少一个python的扩展(requests),进入容器尝试安装相关扩展,发现在容器里不能访问外网
起初怀疑是server的镜像有问题,然后测试了其他的容器发现都是同样的问题,此时怀疑是不是docker的问题(因为之前是可以连通的)
尝试创建一个测试容器,容器网络使用host
docker run -it --name centos --net=host centos:latest
进入容器之后发现可以ping通外网,说明docker服务没问题。
此时突然想到做过这样的操作
# 创建zabbix服务的时候防火墙的是开启的
创建好zabbix的项目后发现之前创建的容器都不能启动了,错误信息显示iptables的的问题,加载iptables失败
#坑就在这里
修改/etc/sysconfig/docker里的OPTIONS增加--iptables=false,重启docker服务,之前的容器可以正常启动
因为之前没有仔细查看相关原因,容器启动之后就没在意。
加入这个参数之后不会影响docker容器之间的通信,如果容器访问外网就不行了
把配置文件的参数去掉之后就恢复正常了参考链接: