背景:目前项目上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
基于官方的文档做了一些调整
-
修改docbix,增加了python的requests库主要用于python脚本发送告警
[测试过程中貌似docbix的python已经装好了requests,这里为了后续方便添加,还是额外增加一下] -
数据持久化
/xxx/mysqldata:/var/lib/mysql
将mysql的数据落地到宿主机 -
增加自定义脚本
/xx/internalter:/usr/local/share/zabbix/alertscripts
宿主机的告警脚本就能在前端-管理-告警媒介类型中直接添加后,让zabbix调用 -
增加配置文件解决报错
报错: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批量分发到机器的
- 通过rpm包安装client.zabbix-agent-3.2.0-1.el7.x86_64.rpm
- 将配置文件覆盖/etc/zabbix/zabbix_agentd.conf
- 加载自定义监控键值
- 创建目录,放入自定义键值依赖的脚本以及zabbix-client的启动脚本等(需要有执行权限)
- 启动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
前端主要做几件事情:
- 自动发现-ip范围-检查(端口范围10050,键值system.uname)
- 配置-动作,右上角事件源选择自动注册-创建动作,将主机自动注册到对应的监控模板上
- 管理-报警媒介类型,这里添加告警脚本即对应服务端部署中
/xx/internalter:/usr/local/share/zabbix/alertscripts
下的脚本名 - 自定义监控键值(可选择主机添加或模板添加),这里键值对应的是client端的userparameter.conf,创建监控项-键值tcp[xxx]这里xxx是传参到
/scripts/tcp_status_ss.sh
文章没有添加截图,欢迎大家交流,另外github那个问题周末找时间给作者提个issue看是否可以直接处理掉~