简单的说明
背景
在开发测试容器云环境中,常常出现节点磁盘占满,IO过高,节点连接数过多的情况,一般是节点出现里问题如故障/离线,节点使用人员采取去处理,极大影响了开发测试效率。鉴于此讨论了监控届知名的zabbix部署的可行性。
目的
- 每一个版本的开发迭代,需要重置虚拟机,需要部署简单快捷
- zabbix组件(包含依赖包)避免影响现有软件运行依赖版本,非侵占
- 自定义告警规则及通知方式
解决方法
- 现有的zabbix部署方式有三种:源码部署,package部署,容器部署。为满足目的1&2点,这里采用docker安装,极大减少了工作量及部署过程中的各种异常
- zabbix可以通过脚本方式自定义告警规则
- zabbix常见的告警媒介有:电子邮件,短信,脚本等。其中脚本方式极大提高了通知方式的灵活性,例如微信通知,webhook通知等
实施
部署
Zabbix 系统由以下各种独立的模组组成。
- Zabbix Server:核心组件,负责获取agent数据,触发报警并发送告警给用户
- Web Frontend:web展示
- Database Storage:与server及web frontend交互,存储配置及监控数据
- Zabbix Agent:部署在被监控的对象上,收集本地信息并发送到server
- Zabbix Proxy (非必要):从一个或多个agent获取监控数据再发送消息给zabbix server,减轻了单zabbix server的工作负载
在本地监控主机数量不多的情况下,我们采用不含proxy的简易方式部署docker集群(部署方式)
- zabbix-appliance部署链接
docker run --name some-zabbix-appliance -p 80:80 -p 10051:10051 -d zabbix/zabbix-appliance:tag
zabbix appliance内置MySQL数据库,zabbix web
- zabbix-agent
使用k8s编排以daemonset部署到集群每个节点
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
daemonset: zabbix-agent
name: zabbix-agent
spec:
selector:
matchLabels:
daemonset: zabbix-agent
template:
metadata:
labels:
daemonset: zabbix-agent
spec:
containers:
- name: zabbix-agent
env:
- name: ZBX_HOSTNAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: ZBX_SERVER_HOST
value: "192.168.131.29" # server地址
image: zabbix/zabbix-agent:alpine-4.0.10
imagePullPolicy: IfNotPresent
ports:
- containerPort: 10050 #使用hostport方式暴露地址
hostPort: 10050
resources:
limits:
cpu: 100m
memory: 300Mi
requests:
cpu: 100m
memory: 100Mi
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
serviceAccountName: psp-privileged # serviceAccount保证pod对宿主机的有访问权限
zabbix web登陆账户/密码默认为Admin/zabbix
zabbix配置
添加告警媒介
这里我们使用里脚本类型的告警媒介,好处是自定义告警方式,脚本使用比较灵活,可以定制化自身需求。
- 上传脚本
登陆zabbix server,zabbix默认会从路径(/usr/lib/zabbix/alertscripts/)读取脚本文件; 同时我们必须未该脚本赋予可执行权限
cd /usr/lib/zabbix/alertscripts/
chmod +x zabbix_webhook.py
脚本样例:
#!/usr/bin/python
import json
import urllib2
import sys
import re
# 指定alarmWebsite,供定位使用
alarmWebsite = "https://alert-system.com/alerts/1234"
webhook = “https://hooks.slack.com/services/****”
notifications = {"Not classified": ":go:",
"Information": ":conga_parrot:",
"Warning": ":doge:",
"Average": ":trollface:",
"High": ":ghost:",
"Disaster": ":smjy:"}
def get_data(subject, message, alarmLevle):
data = {"username": "Zabbix %s Info" %alarmLevle,
"text": "%s\n%s\n<%s|Click here> for details!" %(subject, message, alarmWebsite),
"icon_emoji": notifications[alarmLevle]}
return data
if __name__ == '__main__':
alarmSubject = sys.argv[1] #{ALERT.SUBJECT}
alarmMessage = sys.argv[2] #{ALERT.MESSAGE}
pattern = re.compile(r'Severity: (.*?)\s')
alarmLevle = pattern.findall(alarmMessage)[0].strip()
message = get_data(alarmSubject, alarmMessage, alarmLevle)
req = urllib2.Request(webhook)
req.add_header('Content-Type', 'application/json')
response = urllib2.urlopen(req, json.dumps(message))
- 创建报警媒介
在"管理"-->"报警媒介类型"-->"创建媒体类型"中,填入我们的脚本信息。目前脚本信参数支持三种
参数 | 描述 |
---|---|
{ALERT.MESSAGE} | 'Default message' value from action configuration. |
{ALERT.SENDTO} | 'Send to' value from user media configuration. |
{ALERT.SUBJECT} | 'Default subject' value from action configuration. |
除上述三个“宏”,zabbix还支持其他“宏”参数,请查看zabbix官方在线帮助手册(zaabbix宏列表)
-
测试脚本
通过zabbix脚本测试功能,自动触发告警,查看脚本是否可执行
-
关联用户
如果想让某个zabbix用户接收到从告警媒介发送过来的报警信息,那么需要把用户和对应的告警媒介关联起来
在"管理"-->"用户"中,以Admin为例
在报警媒介中添加新的报警媒介,根据需求个性化配置告警信息
点击“添加”后,确认无误后点击“更新”。此时如果有报警发生,报警通过告警媒介发送到admin用户。
-
启用告警通知
在"配置"-->"动作"中,启用默认的告警动作,或者新建动作
-
(可选)告警内容定制
步骤5中的告警时系统默认的,如果想定制化告警通知信息,可以编辑告警信息/告警恢复信息/告警更新信息等模版
相关参数可以通过zaabbix宏列表获取
添加主机
通过与被监控主机上的zabbix agent建立通信,将主角纳入监控范围。
-
在"配置"-->"主机"中,添加主机信息
-
填入相关信息,群组可以使用新创建的或者使用现有系统预置分组。agent代理程序的接口就是主机IP+agent开放端口(默认10050)
-
添加模版,这里选择里基本的linux监控模版,也可以自定义其他监控模版
-
添加监控模版,最后添加主机完成
-
当可用性ZBX绿色时表示添加成功
讨论
自动发现
当环境中有很多主机时,配置主机自动发现代替手动添加主机,极大减轻工作量。该方式时zabbix server主动发起,定时扫描网络中指定范围的IP设备,如果某一设备上有zabbix agent服务,那么该IP设备就会加入到监控范围内
-
创建自动发现规则
在"配置"-->"自动发现"中,选择Local network或创建自动发现规则。依次:
填写监控IP地址范围,监控间隔,检查规则(这里选择zabbix,键值system.uname)
-
查看自动发现主机
发现主机成功后,在"监控中"-->"自动发现"中会出现发现到的主机
一般在zabbix部署时,批量添加主机时使用主机发现功能,添加完毕后可以关闭该功能。
与prometheus区别
zabbix是一个功能丰富,开箱即用的传统监控软件。软件部署快捷,简单,但是不满足需要特殊定制化的场景。
Prometheus不能开箱即用,需要配合使用其他软件,如Alert Manager。Prometheus具有很强的灵活性和扩展性,可以满足不同场景的特殊定制需求。
Zabbix | Prometheus | |
---|---|---|
安装 | 部署简单,通过GUI配置 | 手动修改配置文件 |
软件详情 | 内核使用C编写,web GUI使用PHP编写,存储数据在关系型数据库中 | 使用go编写,自身集成非关系型数据库,由于数据库是专门为存储监控数据而设计的,因此其性能通常更快。 |
监控内容 | 缺乏实时报告及高级报告模版 | 支持定制化模版,通过Alert Manager实现实时监控 |
监控数据可视化 | 强大 | 简单,但是可以集成专业的可视化工具Grafana |
性能 | 适合10000节点的中小型网络 | 大型网络中表现快速稳定 |
监控范围 | 物理主机,虚拟机,交换机等硬件设备 | 更适用于 Cloud, SaaS, Openstack,Container 监控 |