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容器之间的通信,如果容器访问外网就不行了
把配置文件的参数去掉之后就恢复正常了

参考链接:

https://blog.csdn.net/yang00322/article/details/77895301

https://blog.csdn.net/qq_33633013/article/details/83503804