分类:笔记 日期:2024-03-01 作者:caocaofff 浏览:1271
zabbix是一个基于Web界而的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。
zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。
zabbix由2部分构成,zabbix server与可选组件zabbix agent。通过C/S模式采集数据,通过B/S 模式在Web端展示和配置。
zabbix server 可以通过SNMP,zabbix agent, ping, 端口监视等方法提供对远程服务器/网络状态的监视,数据收集等功能,它可以运行在Linux等平台上。
zabbixagent需要安装在被监视的目标服务器上,它主要完成对硬件信息或与操作系统有关的内存,CPU等信息的收集。
zabbix agent安装在被监控的主机上,zabbix agent 负责定期收集客户端本地各项数据,并发送至zabbix server 端,zabbix server收到数据后,将数据存储到数据库中,用户基于Zabbix web可以看到数据在前端展现图像。当zabbix监控某个具体的项目,该项目会设置一个触发器阈值,当被监控的指标超过该触发器设定的阈值,会进行–些必要的动作,动作包括:发送信息(邮件、微信、短信)、发送命令(shell 命令、reboot、restart、 install 等)。
Zabbix Server
zabbix 服务端守护进程,其中zabbix_ agent、zabbix_ proxy的数据最终都提交给zabbix server;
- Zabbix server是Zabbix软件的核心组件;
- Zabbix Agent向其报告可用性、系统完整性信息和统计信息。
- Zabbix server也是存储所有配置信息、统计信息和操作信息的核心存储库。
- Zabbix server也是zabbix监控系统的告警中心。在监控的系统中出现任何异常,将发出通知给管理员。
- 基本的Zabbix Server的功能分解成为三个不同的组件。他们是:Zabbix server、Web前端和数据库。
- Zabbix的所有配置信息都存储在Server和Web前端进行交互的数据库中。例如,当你通过Web前端(或者APl)新增一个监控项时,它会被添加到数据库的监控项表里。然后,Zabbix server以每分钟一次的频率查询监控项表中的有效项,接着将它存储在Zabbix server中的缓存里。这就是为什么Zabbix前端所做的任何更改需要花费两分钟左右才能显示在最新的数据段的原因。
数据库
- 所有配置信息以及Zabbix采集到的数据都被持久存储在数据库中
- 可以支持MySQL、PostgreSQL、SQLite、Oracle等多种数据库
Web界面
- WEB界面是Zabbix server的一部分,用于实现展示和配置的界面
- 通常(但不一定)和Zabbix server运行在同一台物理机器上
- 基于Apache(Nginx)+PHP实现,早期只支持LAMP架构,从Zabbix5.0开始支持LNMP
Agent
客户端守护进程,负责收集客户端数据,例如:收集CPU负载、内存、硬盘使用情况等;
- Zabbix agents部署在被监控目标上,用于主动监控本地资源和应用程序,并将收集的数据发送给Zabbix server。
- 从Zabbix 5.0开始支持Zabbix Agent 2
Proxy
zabbix 分布式代理守护进程,通常大于500 台主机,需要进行分布式监控架构部署;
- Zabbix Proxy可以代替Zabbix Server采集性能和可用性数据
- Zabbix Proxy在Zabbix的部署是可选部分
- Zabbix Proxy的部署可以很好的分担单个Zabbix server的负载
Java网关
- Zabbix要监控tomcat服务器和其它JAVA程序,需要使用Java gateway做为代理,才能从JAVA程序中获取数据
Zabbix server高可用防止硬件故障或计划维护期的停机:
- 原生选择加入HA群集配置
- 定义一个或多个备用节点
- 实时监控Zabbix server群集节点的状态
- 不需要外部工具即可将Zabbix server配置为HA群集模式
Zabbix 6.0 LTS新增Kubernetes监控功能,可以在Kubernetes系统从多个维度采集指标:
- Kubernetes节点和pods的自动发现和监控
- 无代理方式采集Kubernetespods和节点的信息
- 获取Kubernetes节点主机高水平信息
ZabbixServer提供了三种安装方法
要实现zabbix监控K8S,官方说明zabbix必须需要使用6.x以上,kubernetes必须需要使用v1.18.x以上。
本次操作环境如下:
名称 | 版本信息 | 操作系统 | IP | 备注信息 |
---|---|---|---|---|
K8S集群 | 1.23.0 | Centos7.9 | 192.168.1.130 192.168.1.124 | 192.168.1.130:k8s-master 192.168.1.124:k8s-node |
Zabbix | 6.0.25 | Centos7.9 | 容器内 | 所有zabbix容器都在monitoring名称空间 |
MySQL | 8.0.35 | Centos7.9 | 192.168.1.130:23306 | MySQL数据挂载到/opt/mysql8下,my.cnf挂载到/opt/my8.cnf |
NFS | Centos7.9 | 192.168.1.130 | 共享目录为/opt/nfs |
zabbix通信方式
当监控规模变得庞大时我们是否需要部署多套zabbix系统进行监控呢?
答案肯定是不用的,因为zabbix支持分布式监控,可以把成千上万台的被监控对象分成不同的区域,每个区域中设置一台代理主机
zabbix proxy的架构图
在master节点192.168.1.130新建/opt/my8.cnf文件和/opt/mysql8目录,确保/opt/mysql8目录内容为空。
/opt/my8.cnf写入内容:
[mysqld]
default_authentication_plugin = mysql_native_password
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysqlpid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
只有default_authentication_plugin = mysql_native_password是自己加的,其他的照搬MySQL
然后执行以下命令创建一个MySQL8的容器:
docker run -d --name=mysql8 -p 23306:3306 --restart=always -v /opt/my8.cnf:/etc/my.cnf -v /opt/mysql8:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=P@ssw0rd mysql:8.0.35
截图
确认能在其他主机连接:
root用户应该是可以被任意主机远程连接的,下面这张图是已经有zabbix连接数据库了,所以有zabbix用户:
k8s-master节点192.168.1.130安装nfs服务
mkdir -p /opt/nfs
#创建nfs挂载目录
yum -y install nfs-utils rpcbind
#安装nfs和rpc
echo "/opt/nfs *(rw,sync,no_root_squash,no_subtree_check)" >> /etc/exports
systemctl start nfs && systemctl start rpcbind
systemctl enable nfs-server && systemctl enable rpcbind
showmount -e
#查看到NFS共享目录
使用helm部署nfs-client
helm search repo nfs-client
helm pull stable/nfs-client-provisioner
tar xf nfs-client-provisioner-1.2.11.tgz
cd nfs-client-provisioner/
vim values.yaml
helm install nfs-client-provisioner .
helm list
zabbix-server和zabbix-web直接使用yaml进行部署,zabbix-proxy和zabbix-agent通过helm部署。
需要先创建命名空间monitoring
kubectl create namespace monitoring
2.5.1 zabbix server
创建zabbix-server.yaml
apiVersion: v1
kind: Service
metadata:
name: zabbix-server
namespace: monitoring
labels:
app: zabbix-server
spec:
selector:
app: zabbix-server
ports:
- name: zabbix-server
port: 10051
type: ClusterIP
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zabbix-scripts
namespace: monitoring
spec:
storageClassName: "nfs-client"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: zabbix-server
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: zabbix-server
template:
metadata:
labels:
app: zabbix-server
spec:
containers:
- name: zabbix-server
image: zabbix/zabbix-server-mysql:alpine-6.0.25
imagePullPolicy: IfNotPresent
env:
- name: DB_SERVER_HOST
value: 192.168.1.130
- name: DB_SERVER_PORT
value: "23306"
- name: MYSQL_DATABASE
value: zabbix
- name: MYSQL_USER
value: zabbix
- name: MYSQL_PASSWORD
value: zabbix
- name: MYSQL_ROOT_PASSWORD
value: P@ssw0rd
- name: ZBX_CACHESIZE
value: "512M"
- name: ZBX_HISTORYCACHESIZE
value: "128M"
- name: ZBX_HISTORYINDEXCACHESIZE
value: "128M"
- name: ZBX_TRENDCACHESIZE
value: "128M"
- name: ZBX_VALUECACHESIZE
value: "256M"
- name: ZBX_TIMEOUT
value: "30"
ports:
- containerPort: 10051
name: zabbix-server
protocol: TCP
resources:
requests:
cpu: 1000m
memory: 1000Mi
limits:
cpu: 1000m
memory: 1000Mi
volumeMounts:
- mountPath: /etc/localtime
name: date-config
- mountPath: /usr/lib/zabbix/alertscripts
name: zabbix-scripts
volumes:
- name: zabbix-scripts
persistentVolumeClaim:
claimName: zabbix-scripts
- hostPath:
path: /etc/localtime
type: ""
name: date-config
创建资源
kubectl apply -f zabbix-server.yaml
volumes可以参考官方文档
这里把自定义告警脚本目录/usr/lib/zabbix/alertscripts挂载到nfs
Zabbix server | |
---|---|
/usr/lib/zabbix/alertscripts | 这个 volume 用于自定义告警脚本。即 https://www.zabbix.com/documentation/6.0/zh/manual/appendix/config/zabbix_server 中的 AlertScriptsPath 参数。 |
2.5.2 zabbix-web
创建zabbix-web.yaml文件,内容如下:
apiVersion: v1
kind: Service
metadata:
name: zabbix-web
namespace: monitoring
labels:
app: zabbix-web
spec:
selector:
app: zabbix-web
ports:
- name: web
nodePort: 30085
port: 8080
protocol: TCP
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: zabbix-web
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: zabbix-web
template:
metadata:
labels:
app: zabbix-web
spec:
containers:
- name: zabbix-web
image: zabbix/zabbix-web-nginx-mysql:alpine-6.0.25
imagePullPolicy: IfNotPresent
env:
- name: DB_SERVER_HOST
value: 192.168.1.130
- name: DB_SERVER_PORT
value: "23306"
- name: MYSQL_DATABASE
value: zabbix
- name: MYSQL_USER
value: zabbix
- name: MYSQL_PASSWORD
value: zabbix
- name: MYSQL_ROOT_PASSWORD
value: P@ssw0rd
- name: ZBX_SERVER_HOST
value: 'zabbix-server'
- name: PHP_TZ
value: "Asia/Shanghai"
ports:
- containerPort: 8080
name: web
protocol: TCP
resources:
requests:
cpu: 500m
memory: 500Mi
limits:
cpu: 500m
memory: 500Mi
创建资源:
kubectl apply -f zabbix-web.yaml
2.5.3 Helm部署zabbix-proxy&zabbix-agent
2.5.3.1 安装helm
wget https://get.helm.sh/helm-v3.13.2-linux-amd64.tar.gz
#安装Helm工具
tar zxvf helm-v3.13.2-linux-amd64.tar.gz
cp linux-amd64/helm /usr/local/bin/helm
2.5.3.2 添加Helm Chart Repository
helm repo add zabbix-chart-6.0 https://cdn.zabbix.com/zabbix/integrations/kubernetes-helm/6.0/
helm repo list
2.5.3.3 下载Zabbix Helm Chart 并修改values.yaml
此步骤参考官方文档
主要是修改镜像名称、环境变量
zabbixProxy:
image:
tag: alpine-6.0.25
env:
- name: ZBX_PROXYMODE
value: 1
- name: ZBX_HOSTNAME
value: zabbix-proxy
- name: ZBX_SERVER_HOST
#此处填写的是zabbix-server的IP地址与端口
value: "192.168.1.130,0.0.0.0/0"
- name: ZBX_CACHESIZE
value: 256M
- name: ZBX_JAVAGATEWAY_ENABLE
value: false
- name: ZBX_CONFIGFREQUENCY
value: 60
service:
#在zabbix-server的web界面创建proxy时,需要填写proxy的服务端口。必须通过NodePort对外暴露端口
nodePort: 30051
type: NodePort
zabbixAgent:
image:
repository: zabbix/zabbix-agent2
tag: alpine-6.0.25
env:
- name: ZBX_SERVER_HOST
value: 0.0.0.0/0
- name: ZBX_PASSIVE_ALLOW
#整个proxy使用的是passive模式,此处的agent也改成passive模式,因此改为true
value: true
修改完毕后部署到k8s
helm install zabbix zabbix-chart-6.0/zabbix-helm-chrt --dependency-update -f zabbix_values.yaml -n monitoring
执行上述命令后,等待资源部署完成。
登录zabbix-web,浏览器访问:http://192.168.1.130:30085/
输入默认用户名/密码:Admin/zabbix
首页
可以在User settings设置语言为中文
首页出现一个告警,这是因为默认情况下Zabbix-server主机的接口地址是127.0.0.1:10050,这样会提示连接agent失败
解决方法:
查看agent的endpoint地址,一般是节点的IP地址
这里的接口地址填写endpoint的地址就行了
等待两分钟,“可用性”这一列的图标就会变绿
Zabbix Agent的工作模式可以分为主动模式(Active)和被动模式(Passive),主动模式和被动模式在同一个Zabbix Agent上,是可以共存的,比如让一部分被动模式,另一部分处于主动模式,处于主动模式的监控项由Zabbix Agent周期性采集数据传输给 Zabbix Server,处于被动模式的监控项,则由Zabbix Server周期性地从Zabbix Agent获取数据。
Zabbix Agent的工作模式分为主动和被动模式,默认情况下二种模式共存。
二种模式对于数据的采集方式是所有不同的,简单可以概述为以下过程:
被动模式:Zabbix Server向Zabbix Agent的10050端口(默认)发起请求,获取监控数据。
主动模式:Zabbix Agent向Zabbix Server的10051端口(默认)发起请求,提交监控数据。
主被动模式在使用上有以下小区别:
模式 | Server压力 | 远程命令 | 日志监控 |
---|---|---|---|
主动 | 低 | 不支持 | 支持 |
被动 | 高 | 支持 | 不支持 |
由于我们的agent配置的是被动模式,所以当前环境是zabbix-server向zabbix-agent发起请求。
在zabbix-server上创建zabbix-proxy配置时,需要K8S内的zabbix-proxy暴露服务。
这里使用了NotePort暴露端口30051(zabbix-server可以telnet 通 30051端口):
添加步骤:管理——agent代理程序——创建代理
agent代理程序名称:填写deployment.apps/zabbix-proxy里的ZBX_HOSTNAME环境变量
系统代理程序模式:官方博客推荐使用主动式,但我们这里使用被动式
接口——IP地址:k8s-master节点IP地址192.168.1.130
接口——连接到:默认选择IP
接口——端口:zabbix-proxy的service对外暴露的端口30051
添加完成之后等待两分钟,检查状态是否正常
如果红框内始终没有秒数出现,请检查zabbix-server和zabbix-proxy的日志
在 Zabbix 6.0 版本中默认带 Kubernetes 监控模板,如果是从低版本升级上来的,我们也可以通过下载官方模板进行导入。
模板名称 | 解释 |
---|---|
Kubernetes API server by HTTP | K8S ApiServer组件指标模板 |
Kubernetes cluster state by HTTP | K8S 集群指标模板 |
Kubernetes Controller manager by HTTP | K8S ControllerManager组件指标模板 |
Kubernetes kubelet by HTTP | K8S Kubelet组件指标模板 |
Kubernetes nodes by HTTP | K8S 集群节点发现以及状态指标模板 |
Kubernetes Scheduler by HTTP | K8S Scheduler组件指标模板 |
4.1.1 创建k8s主机群组
配置——主机群组——创建主机群组——组名,填写一个组名,例如:k8s server
4.1.2 创建k8s-node主机,用于自动发现K8S节点主机
配置——主机——创建主机
主机名称:k8s-nodes
模板:Templates/Applications——Kubernetes nodes by HTTP
主机组:K8S Server
由agent代理程序监测(可选):zabbix-proxy
已启用: true
配置宏变量,参考官方文档
释义:
{$KUBE.API.ENDPOINT.URL} : https://xxx:6443/api
#ip为master的ip
{$KUBE.API.TOKEN}: XXXXXXXX
#kubectl get secret zabbix-service-account -n monitoring -o jsonpath={.data.token} | base64 -d
{$KUBE.NODES.ENDPOINT.NAME}: zabbix-zabbix-helm-chrt-agent
#kubectl get ep -n monitoring |grep agent
添加成功后,可以获得k8s集群主机列表相关数据
请注意,发现的节点将在Zabbix中创建为单独的主机,并自动为其分配Linux模板。
4.1.3 创建k8s-cluster主机,用于自动发现服务组件
配置——主机——创建主机
主机名称:k8s-cluster
模板:Templates下的Kubernetes cluster state by HTTP
主机组:K8S Server
由agent代理程序监测(可选):zabbix-proxy
已启用: true
配置宏变量
{$KUBE.API.HOST} 192.168.1.130
{$KUBE.API.PORT} 6443
{$KUBE.API.TOKEN} xxxxxxxxxx
{$KUBE.API_SERVER.PORT} 6443
{$KUBE.API_SERVER.SCHEME} https
{$KUBE.CONTROLLER_MANAGER.PORT} 10252(10257)
{$KUBE.CONTROLLER_MANAGER.SCHEME} http
{$KUBE.KUBELET.PORT} 10250
{$KUBE.KUBELET.SCHEME} https
{$KUBE.SCHEDULER.PORT} 10251(10259)
{$KUBE.SCHEDULER.SCHEME} http
{$KUBE.STATE.ENDPOINT.NAME} zabbix-kube-state-metrics
注意:端口 10251 和 10252 已在版本 1.17 中被替换(CHANGELOG-1.17)
Kubeadm: enable the usage of the secure kube-scheduler and kube-controller-manager ports for health checks. For kube-scheduler was 10251, becomes 10259. For kube-controller-manager was 10252, becomes 10257.
或者
创建了k8s-cluster之后,自动发现各服务组件的数据:
Zabbix提供两种监控Linux主机的方法,一种是启用主机上的SNMP协议,另一种是在主机上安装Zabbix Agent服务,这里介绍Linux系统下Zabbix Agent的安装与使用。
环境:CentOS 7.9
4.2.1 安装Zabbix Agent
先从官网下载rpm包,这里下载 zabbix-agent2-6.0.25-release1.el7.x86_64.rpm
wget https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-agent2-6.0.25-release1.el7.x86_64.rpm
#安装依赖
yum install pcre2
rpm -ivh zabbix-agent2-plugin-mongodb-6.0.25-release1.el7.x86_64.rpm
rpm -ivh zabbix-agent2-plugin-postgresql-6.0.25-release2.el7.x86_64.rpm
rpm -ivh zabbix-agent2-6.0.25-release1.el7.x86_64.rpm
#编辑配置文件
vim /etc/zabbix/zabbix_agent2.conf
修改内容
#这里为类似ACL规则,可以控制哪些网络或者设备可以通过被动模式来访问zabbix agent,这里可以配置域名,多个网络地址等
Server=192.168.1.130,0.0.0.0/0
#主动模式下agent会把数据发送到此zabbix server或zabbix proxy,这里可以填写多个地址
ServerActive=192.168.1.130
#本机IP或者主机名不要用127.0.0.1,在Zabbix服务端添加主机时 主机名称 要和此相同
Hostname=harbor
注意该Linux时间要和zabbix server端一致。
启动agent2且开机⾃启
systemctl enable --now zabbix-agent2
检查端口
4.2.2 添加监控项
配置——主机——创建主机
在zabbix web页面上添加主机时,需要注意主机的interface IP以及端口,这里要配置为机器的实际ip及端口,zabbix server会访问此ip端口进行数据的获取
需要确保zabbix server端能telnet 目标Linux服务器的10050端口,可以禁用目标服务器的防火墙服务
systemctl stop firewalld.service
systemctl disable firewalld.service
等待两分钟后状态可用
查看最新数据
Zabbix提供高效灵活的网络自动发现功能。(官方文档)
网络发现的优势:
Zabbix网络发现依赖于以下信息:
不支持:
网络发现主要包含两个步骤:发现和动作。
网络发现由两个阶段组成:发现(discovery)和动作(actions)。
5.1.1 配置->自动发现->启动默认的Local network
5.1.2 配置规则
5.1.3 配置->动作->事件源->自动发现->启用动作
可修改动作规则和操作细节
5.1.4 总结
1.网络发现速度较慢
2.轮询扫描网段
3.如果网段中存在不通的主机,会出现卡顿并且造成后续新增的服务器无法加入节点
4.影响server性能
Zabbix agent可以自动注册到服务器进行监控。这种方式无需在服务器上手动配置它们。
5.2.1 配置->动作->自动注册动作->创建动作
5.2.2 配置动作
5.2.3 配置操作
最后等待自动注册
199:20240111:132700.478 proxy data request from server "10.244.219.64" is not allowed: connection from "10.244.219.64" rejected, allowed hosts: "192.168.1.130"
解决:ZBX_SERVER_HOST添加0.0.0.0/0
- name: ZBX_SERVER_HOST
value: 192.168.1.130,0.0.0.0/0
Linux: System time is out of sync (diff with Zabbix server > 60s)
排查:
server的时间慢了一分多钟,可以通过挂载主机时间配置的方式解决
spec:
containers:
- name: zabbix-server
image: zabbix/zabbix-server-mysql:alpine-6.0.25
imagePullPolicy: IfNotPresent
#..............
volumeMounts:
- name: date-config
mountPath: /etc/localtime
#.............
volumes:
- name: date-config
hostPath:
path: /etc/localtime
如果宿主机时间不准也可以先同步:
ntpdate cn.pool.ntp.org
注意:如果主机 /etc/localtime 已存在且时区正确的话,可以直接挂载,如果本地 /etc/localtime 不存在或时区不正确的话,那么可以直接挂载/usr/share/zoneinfo/Asia/Shanghai 到容器内 /etc/localtime,都是可行的。
告警消失
Get value from agent failed: ZBX_TCP_READ() failed: [104] Connection reset by peer
修改/etc/zabbix/zabbix_agent2.conf,添加0.0.0.0/0
Server=192.168.1.130,0.0.0.0/0
CC版权: 本篇博文采用《CC 协议》,转载必须注明作者和本文链接