zabbix生产实践

背景:目前项目上k8s集群的监控采用标准的prometheus+altermanager+hook(hook是我这边收集处理告警的程序后续如果想写的话专门写一篇来介绍)但宿主机的各项指标监控prometheus覆盖不完全,针对windows、mac等各类平台的监控目前还是开源的zabbix比较完善

服务端部署

本篇文章是基于github作者jangaraj的项目进行部署的,上一个版本的xxl持续使用了很久,效果不错,本次是基于新的项目docbix-xxl进行部署的
项目地址
server端的部署很简单,docker-compose文件如下:

version: '3.1'
services:
  zabbixdb:
    image: monitoringartist/zabbix-db-mariadb:latest
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /xxx/mysqldata:/var/lib/mysql
      - /xxx/mysqlconf/myconf.cnf:/etc/my.cnf.d/myconf.cnf
    environment:
      - MARIADB_USER=zabbix
      - MARIADB_PASS=xxxxxx
  zabbixserver:
    image: monitoringartist/dockbix-xxl:latest
    depends_on:
      - zabbixdb
    ports:
      - "1180:80"
      - "10051:10051"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /xx/internalter:/usr/local/share/zabbix/alertscripts
      - /xx/externalter:/usr/local/share/zabbix/externalscripts
      - /xx/zabbix_server.conf:/usr/local/etc/zabbix_server.conf
    environment:
      - ZS_DBHost=zabbixdb
      - ZS_DBUser=zabbix
      - ZS_DBPassword=xxxxxxxxx
      - XXL_zapix=true
      - XXL_grapher=true

基于官方的文档做了一些调整

  1. 修改docbix,增加了python的requests库主要用于python脚本发送告警
    [测试过程中貌似docbix的python已经装好了requests,这里为了后续方便添加,还是额外增加一下]

  2. 数据持久化
    /xxx/mysqldata:/var/lib/mysql将mysql的数据落地到宿主机

  3. 增加自定义脚本
    /xx/internalter:/usr/local/share/zabbix/alertscripts宿主机的告警脚本就能在前端-管理-告警媒介类型中直接添加后,让zabbix调用

  4. 增加配置文件解决报错
    报错: Aborted connection 111 to db: 'zabbix' user: 'zabbix' host: 'xx.5.5.5' (Got an error reading communication packets)
    解决办法是先挂载mysql的配置文件和zabbix的配置文件,然后启动docker-compose up -d
    启动后,zabbix的配置被初始化覆盖掉了,重新将配置写入/xx/zabbix_server.conf文件中,然后docker-compose restart zabbixdb即可

    • /xx/zabbix_server.conf:/usr/local/etc/zabbix_server.conf
    • /xxx/mysqlconf/myconf.cnf:/etc/my.cnf.d/myconf.cnf

其中dockerfile如下:

FROM monitoringartist/dockbix-xxl:latest
RUN yum install -y python-pip && \
    pip install  requests

mysql的conf如下:

open_files_limit = 4800
max_connections = 500
innodb_log_buffer_size = 32M
innodb_log_file_size = 2047M
innodb_buffer_pool_instances = 18
innodb_buffer_pool_size=18G
max_allowed_packet = 1024M
join_buffer_size = 1M
log_warnings = 2
log_error_verbosity = 3
slow_query_log
query_cache_size = 0
query_cache_type = 0
skip-name-resolve=1

zabbix_server.conf:

User=zabbix
SSLKeyLocation=xxx/ssl/keys
SSLCertLocation=/xxx/ssl/certs
SNMPTrapperFile=/xxps.tmp
PidFile=/xx.pid
LogType=console
LoadModulePath=/usr/lib/zabbix/modules
JavaGatewayPort=10052
JavaGateway=127.0.0.1
ExternalScripts=/xxs
DBUser=zabbix
DBPort=3306
DBPassword=xxx
DBName=zabbix
DBHost=zabbixdb
AlertScriptsPath=/usr/local/share/zabbix/alertscripts
---  以上部分是每次启动zabbix时自动生成、覆盖的 ---
LogFileSize=4
DebugLevel=5
StartPollers=102
StartPreprocessors=72
StartPollersUnreachable=14
StartTrappers=64
StartEscalators=2
StartAlerters=4
MaxHousekeeperDelete=8400
CacheSize=72M
StartDBSyncers=24
HistoryCacheSize=64M
HistoryIndexCacheSize=32M
TrendCacheSize=42M
ValueCacheSize=64M
Timeout=30
TrapperTimeout=300

客户端

客户端如果使用默认只需要1.2.5步骤即可 客户端用ansible批量分发到机器的

  1. 通过rpm包安装client.zabbix-agent-3.2.0-1.el7.x86_64.rpm
  2. 将配置文件覆盖/etc/zabbix/zabbix_agentd.conf
  3. 加载自定义监控键值
  4. 创建目录,放入自定义键值依赖的脚本以及zabbix-client的启动脚本等(需要有执行权限)
  5. 启动zabbix-client

agent-conf,如果是像我批量推送,配置文件中ListenIP获取各机器的对应ip即可

PidFile=xxx/xx/zabbix.pid
LogFile=xxx/xxx/agent.log
LogFileSize=0
Server=xxx
ServerActive=xxx
HostnameItem=system.hostname
Include=/etc/zabbix/zabbix_agentd.d/*.conf
ListenIP=xxx
StartAgents=5
  • 自定义监控键值userparameter.conf,放入到Include的路径中,这里放入/etc/zabbix/zabbix_agentd.d/下
    UserParameter=tcp[*],/scripts/tcp_status_ss.sh $1

  • 自定义脚本,4步骤生成/scripts目录后放入脚本
    本脚本基于ss,监控各服务器连接状态监测脚本

#!/bin/bash
function SYNRECV {
/usr/sbin/ss -s | grep 'synrecv' | awk '{print $2}'
}
function ESTAB {
/usr/sbin/ss -s | grep 'estab' | awk '{print $2}'
}
function FINWAIT1 {
/usr/sbin/ss -o |  grep 'FIN-WAIT-1'|wc -l
}
function FINWAIT2 {
/usr/sbin/ss -ant| grep 'FIN-WAIT-2' | wc -l
}
function TIMEWAIT {
/usr/sbin/ss -ant | grep 'TIME-WAIT' | wc -l
}
function LASTACK {
/usr/sbin/ss -ant | grep 'LAST-ACK' | wc -l
}
function LISTEN {
/usr/sbin/ss -ant | grep 'LISTEN' | wc -l
}
$1
  • zabbix启停脚本
#!/bin/sh
. /etc/rc.d/init.d/functions
if [ -x /usr/sbin/zabbix_agentd ]; then
    exec=zabbix_agentd
else
    exit 5
fi

prog=${exec##*/}
conf=/xxx/zabbix_agentd.conf                                          #这里填写对应的zabbix配置文件全路径
pidfile=$(grep -e "^PidFile=.*$" $conf | cut -d= -f2 | tr -d '\r')    #这里从配置文件中取pid文件
timeout=10

if [ -f /etc/sysconfig/zabbix-agent ]; then
    . /etc/sysconfig/zabbix-agent
fi

lockfile=/var/lock/subsys/zabbix-agent

start()
{
    echo -n $"Starting Zabbix agent: "
    daemon $exec -c $conf
    rv=$?
    echo
    [ $rv -eq 0 ] && touch $lockfile
    return $rv
}

stop()
{
    echo -n $"Shutting down Zabbix agent: "
    killproc -p $pidfile -d $timeout $prog
    rv=$?
    echo
    [ $rv -eq 0 ] && rm -f $lockfile
    return $rv
}

restart()
{
    stop
    start
}

case "$1" in
    start|stop|restart)
        $1
        ;;
    force-reload)
        restart
        ;;
    status)
        status -p $pidfile $prog
        ;;
    try-restart|condrestart)
        if status $prog >/dev/null ; then
            restart
        fi
        ;;
    reload)
        action $"Service ${0##*/} does not support the reload action: " /bin/false
        exit 3
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|try-restart|force-reload}"
        exit 2
        ;;
esac

前端

zabbix启动后暴露的端口是10050
在nginx层将域名请求转发到10050,即可通过域名登录,默认账号Admin密码zabbix
前端主要做几件事情:

  1. 自动发现-ip范围-检查(端口范围10050,键值system.uname)
  2. 配置-动作,右上角事件源选择自动注册-创建动作,将主机自动注册到对应的监控模板上
  3. 管理-报警媒介类型,这里添加告警脚本即对应服务端部署中/xx/internalter:/usr/local/share/zabbix/alertscripts下的脚本名
  4. 自定义监控键值(可选择主机添加或模板添加),这里键值对应的是client端的userparameter.conf,创建监控项-键值tcp[xxx]这里xxx是传参到/scripts/tcp_status_ss.sh

文章没有添加截图,欢迎大家交流,另外github那个问题周末找时间给作者提个issue看是否可以直接处理掉~

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦