zabbix部署实践

简单的说明

背景

在开发测试容器云环境中,常常出现节点磁盘占满,IO过高,节点连接数过多的情况,一般是节点出现里问题如故障/离线,节点使用人员采取去处理,极大影响了开发测试效率。鉴于此讨论了监控届知名的zabbix部署的可行性。

目的

  1. 每一个版本的开发迭代,需要重置虚拟机,需要部署简单快捷
  2. zabbix组件(包含依赖包)避免影响现有软件运行依赖版本,非侵占
  3. 自定义告警规则及通知方式

解决方法

  1. 现有的zabbix部署方式有三种:源码部署,package部署,容器部署。为满足目的1&2点,这里采用docker安装,极大减少了工作量及部署过程中的各种异常
  2. zabbix可以通过脚本方式自定义告警规则
  3. 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集群(部署方式)

  1. zabbix-appliance部署链接
docker run --name some-zabbix-appliance -p 80:80 -p 10051:10051 -d zabbix/zabbix-appliance:tag

zabbix appliance内置MySQL数据库,zabbix web

  1. 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配置

添加告警媒介

这里我们使用里脚本类型的告警媒介,好处是自定义告警方式,脚本使用比较灵活,可以定制化自身需求。

  1. 上传脚本
    登陆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))
  1. 创建报警媒介
    在"管理"-->"报警媒介类型"-->"创建媒体类型"中,填入我们的脚本信息。目前脚本信参数支持三种
参数 描述
{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宏列表)

  1. 测试脚本
    通过zabbix脚本测试功能,自动触发告警,查看脚本是否可执行


  2. 关联用户
    如果想让某个zabbix用户接收到从告警媒介发送过来的报警信息,那么需要把用户和对应的告警媒介关联起来
    在"管理"-->"用户"中,以Admin为例



    在报警媒介中添加新的报警媒介,根据需求个性化配置告警信息



    点击“添加”后,确认无误后点击“更新”。此时如果有报警发生,报警通过告警媒介发送到admin用户。
  3. 启用告警通知
    在"配置"-->"动作"中,启用默认的告警动作,或者新建动作


  4. (可选)告警内容定制
    步骤5中的告警时系统默认的,如果想定制化告警通知信息,可以编辑告警信息/告警恢复信息/告警更新信息等模版


    相关参数可以通过zaabbix宏列表获取

添加主机

通过与被监控主机上的zabbix agent建立通信,将主角纳入监控范围。

  1. 在"配置"-->"主机"中,添加主机信息


  1. 填入相关信息,群组可以使用新创建的或者使用现有系统预置分组。agent代理程序的接口就是主机IP+agent开放端口(默认10050)


  2. 添加模版,这里选择里基本的linux监控模版,也可以自定义其他监控模版


  3. 添加监控模版,最后添加主机完成


  4. 当可用性ZBX绿色时表示添加成功


讨论

自动发现

当环境中有很多主机时,配置主机自动发现代替手动添加主机,极大减轻工作量。该方式时zabbix server主动发起,定时扫描网络中指定范围的IP设备,如果某一设备上有zabbix agent服务,那么该IP设备就会加入到监控范围内

  1. 创建自动发现规则
    在"配置"-->"自动发现"中,选择Local network或创建自动发现规则。依次:
    填写监控IP地址范围,监控间隔,检查规则(这里选择zabbix,键值system.uname)


  2. 查看自动发现主机
    发现主机成功后,在"监控中"-->"自动发现"中会出现发现到的主机


一般在zabbix部署时,批量添加主机时使用主机发现功能,添加完毕后可以关闭该功能。

与prometheus区别

zabbix是一个功能丰富,开箱即用的传统监控软件。软件部署快捷,简单,但是不满足需要特殊定制化的场景。
Prometheus不能开箱即用,需要配合使用其他软件,如Alert Manager。Prometheus具有很强的灵活性和扩展性,可以满足不同场景的特殊定制需求。

Zabbix Prometheus
安装 部署简单,通过GUI配置 手动修改配置文件
软件详情 内核使用C编写,web GUI使用PHP编写,存储数据在关系型数据库中 使用go编写,自身集成非关系型数据库,由于数据库是专门为存储监控数据而设计的,因此其性能通常更快。
监控内容 缺乏实时报告及高级报告模版 支持定制化模版,通过Alert Manager实现实时监控
监控数据可视化 强大 简单,但是可以集成专业的可视化工具Grafana
性能 适合10000节点的中小型网络 大型网络中表现快速稳定
监控范围 物理主机,虚拟机,交换机等硬件设备 更适用于 Cloud, SaaS, Openstack,Container 监控

参考
Zabbix vs Prometheus
Prometheus实战

你可能感兴趣的:(zabbix部署实践)