zabbix6.4配置监控rke2 rancher k8s集群
- 1. 说明
- 1.1 为什么要使用zabbix6.x监控k8s
- 1.2 部署环境
- 1.3 部署前的一些问题
- 2. 使用helm3部署zabbix proxy和zabbix agent
- 2.1 添加仓库
- 2.2 修改配置
- 2.3 部署
- 2.4 确认部署情况
- 3. 在zabbix web页面配置连接zabbix proxy
- 3.1 添加Proxy代理
- 3.2 k8s主机自动注册
- 3.3 绑定另外三个模板
- 4. 配置告警
- 5. 部署完之后的一些问题
- 5.1 zabbix proxy主动模式还是被动模式?
- 5.2 zabbix监控,数据量的问题
- 5.3 zabbix proxy镜像标签的问题
- 参考:
1. 说明
1.1 为什么要使用zabbix6.x监控k8s
在选择Zabbix作为Kubernetes监控工具之前,我们问自己:“为什么我们选择使用Zabbix而不是Prometheus、Grafana和alertmanager呢?”
毕竟,它们已经成为云生态系统中的标准监控工具。我们决定对Zabbix的最低要求是,它在监控Kubernetes和云原生应用程序方面至少与Prometheus一样有效。
通过探索,我们得出结论, Zabbix满足(甚至超过)了这一最低要求。 Zabbix提供与Prometheus、alert manager和Grafana相似的指标和触发器,因为它们都使用相同的后端工具来实现这一点。
但是,Zabbix可以在一个产品中完成这一切,同时保持灵活性,并允许您监控几乎任何可以编写代码采集的内容。在应用程序监控方面,Zabbix可以将由Prometheus exporter和端点提供的Prometheus指标转换。
此外,由于Zabbix可以调用任何HTTP端点,因此它可以监控没有专用Prometheus端点的应用程序,而Prometheus不能做到这一点。
上面的内容来自:https://www.163.com/dy/article/J27DVM730538I0ZK.html
对我来说,因为自建的RKE2集群,在上面配置的是有prometheus+grafana+alertmanager监控告警体系的,但是官方开源的版本,在UI界面上没有可以配置钉钉、企业微信、飞书等告警手段的地方,要借助第三方Prometheus Alert组件,又感觉太过麻烦。
当然,也是自己有点菜。。。
在这里吐槽一下,rancher 2.4 2.5的开源版本,还支持直接配置钉钉、微信告警,到了2.6、2.7、2.8,就只有商业版支持了。开源版支持的告警类型,在国内,基本上用不上。
又尝试了夜莺系统,这个告警系统可以对接Pormetheus系统,可以只当做告警系统来用。
夜莺监控是一款开源云原生观测分析工具,采用 All-in-One 的设计理念,集数据采集、可视化、监控告警、数据分析于一体,与云原生生态紧密集成,提供开箱即用的企业级监控分析和告警能力。夜莺于 2020 年 3 月 20 日,在 github 上发布 v1 版本,已累计迭代 100 多个版本。
参考:https://flashcat.cloud/docs/content/flashcat-monitor/nightingale-v7/introduction/
尝试了之后,感觉夜莺监控k8s的文档还是不够完善,还是用zabbix可能更熟悉一些。
1.2 部署环境
首先要配置k8s集群和helm3,我使用的是RKE2部署的三节点集群,然后又配置的rancher。
k8s版本:v1.28.12+rke2r1
Rancher版本:v2.8.4
操作系统:Anolis OS 8.9
内核版本:4.19.91-26.an8.x86_64
zabbix helm版本:6.4(注意跟server版本最好要一致,或者至少大版本一致)
Helm版本:v3.15.3
zabbix server / web:6.x (注意:这个是配置在k8s集群之外的,是单独的主机)
docker镜像拉取的问题:
现阶段,由于docker官方镜像站在国内无法访问,所以需要先把需要的镜像先下载打包,然后进行导入,或者自己搭建镜像站。具体操作根据自己的情况来吧。
可以参考:https://blog.csdn.net/weixin_43092290/article/details/131004307
1.3 部署前的一些问题
在部署之前,我也搜了一些其他博客,发现写的有些是语焉不详,参考来做,并不能很顺利就成了。
比如,zabbix proxy使用主动模式还是被动模式,数据上报的流程,zabbix web页面怎么配置,自动发现怎么实现的等等,很多问题说的都不详细。
因为之前没有使用过zabbix proxy的配置方式,我还以为这种配置方式比较特殊,又用docker镜像重新搞了一遍,发现并没有那么复杂。
按照别人的博客来,一直卡住,折腾了好几天,反复对比,反复试,才把整个流程跑通。我有时候怀疑,一些博主成功之后,估计自己也没搞清楚为啥就成功了。。。
好了,不说那么多了,下面开始部署,我尽量写的详细一些,里面可能遇到的问题,为什么这样配置,也写一写。
2. 使用helm3部署zabbix proxy和zabbix agent
直接按照官方文档来就行
https://git.zabbix.com/projects/ZT/repos/kubernetes-helm/browse?at=refs%2Fheads%2Frelease%2F6.0
注意,这里面选择的版本,最好是跟zabbix server版本一致,至少大版本一致
2.1 添加仓库
添加helm仓库
helm repo add zabbix-chart-6.0 https://cdn.zabbix.com/zabbix/integrations/kubernetes-helm/6.0
2.2 修改配置
输出默认配置文件
helm show values zabbix-chart-6.0/zabbix-helm-chrt > $HOME/zabbix_values.yaml
修改配置文件
# vim $HOME/zabbix_values.yaml
# zabbix proxy配置段
zabbixProxy:
image:
## Tag of Docker image of Zabbix proxy
tag: ubuntu-6.4-latest # 镜像标签改了
env:
- name: ZBX_PROXYMODE
value: 0 # 使用了默认的主动模式,active proxy
## Zabbix proxy hostname
- name: ZBX_HOSTNAME
value: zabbix-proxy-rke2 # 修改了proxy名称,当有多个proxy的时候,需要一个特别的名字来区分
- name: ZBX_SERVER_HOST
value: "192.168.0.1" # 这个改成你单独部署的zabbix server的地址,如果没有使用10051,记得带上端口号,比如192.168.0.1:20051,但是不建议,一个主机上面还是不要部署太多服务
# zabbix agent配置段
zabbixAgent:
## Enables use of Zabbix agent
enabled: true
image:
## Tag of Docker image of Zabbix agent
tag: ubuntu-6.4-latest # 镜像标签改了
env:
## Zabbix server host
- name: ZBX_SERVER_HOST
value: 0.0.0.0/0
## This variable is boolean (true or false) and enables or disables feature of passive checks. By default, value is true
- name: ZBX_PASSIVE_ALLOW
value: true
## This variable is boolean (true or false) and enables or disables feature of active checks
- name: ZBX_ACTIVE_ALLOW
value: false
# 注意: zabbix agent的主被动模式不需要改!!!server的那个,直接用0.0.0.0/0配置即可,不要乱改了!!!
其实改的配置很少。我刚开始的时候跟着其他博主做,说要用被动模式,然后又改了其它参数,改来改去,越来越乱,怎么都不成。
说一下,为啥要改镜像标签
因为zabbix proxy镜像,如果用默认的,自动发现功能会失败!!!
报错如下:
Preprocessing failed for: {"error":"Error: cannot set cURL option CURLOPT_INTERFACE: A libcurl function was given a bad arg...1. Failed: cannot extract value from json by path "$.nodes..filternode": no data matches the specified path
用ubuntu-6.4-latest这个镜像就可以成功,应该是默认的镜像缺少了一些程序包、库。
2.3 部署
改好配置之后,进行部署
git clone https://git.zabbix.com/scm/zt/kubernetes-helm.git
cd kubernetes-helm
kubectl create namespace monitoring
helm install --enable-dns --plain-http zabbix . --dependency-update -f $HOME/zabbix_values.yaml -n monitoring
解释一下下面两个参数:
--enable-dns enable DNS lookups when rendering templates
--plain-http use insecure HTTP connections for the chart download
正常的官方的安装命令是
helm install zabbix . --dependency-update -f $HOME/zabbix_values.yaml -n monitoring
但是会出现一个问题,由于helm安装的时候需要连接github.io这个域名,来获取国内kube-state-metrics这个组件的最新镜像与配置,但是国内连接github.io这个域名经常超时,所以很可能会失败。刚开始失败的时候,我用nslookup查了github.io的解析,修改了hosts,成功了几次,但是后面又不行了,所有加上了–enable-dns 这个参数,成功概率较大。
安装完之后如果要更新配置
helm upgrade --enable-dns --plain-http zabbix . --dependency-update -f $HOME/zabbix_values.yaml -n monitoring
在这一步安装中,还有一个问题,部署zabbix-kube-state-metrics时候,需要拉取
registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.9.2
这个镜像,如果你只配置了docker.io的镜像站,还需要注意重新导出导入。我用的rke2集群,默认使用的containerd进行管理,还要用ctr命令,如果用的是docker管理,那样更简单一些。这也是需要注意的。
ln -sv /run/k3s/containerd/containerd.sock /run/containerd/containerd.sock
ctr -n=k8s.io i import kube-state-metrics.tar
ctr images ls
参考:https://blog.csdn.net/jmmyhans/article/details/131913046
获取api token,这个等会儿配置自动发现的时候,需要用到
kubectl get secret zabbix-service-account -n monitoring -o jsonpath={.data.token} | base64 -d
2.4 确认部署情况
查看相关的资源,是否部署成功
kubectl get svc -n monitoring
kubectl get pods -n monitoring
kubectl get all -n monitoring
完成部署之后,可以在rancher控制台,或者使用命令行查看相关的日志进行排错,确认服务配置正常。
删除部署
helm uninstall zabbix -n monitoring
3. 在zabbix web页面配置连接zabbix proxy
因为没办法直接用生产环境的zabbix server,我用docker镜像直接部署了zabbix web,zabbix server进行测试。
docker镜像下载地址:https://www.zabbix.com/cn/container_images
具体的部署方式就不在这里写了。但是生产环境不建议用容器镜像的方式进行部署。
用helm完成zabbix-agent和zabbix-proxy的部署后,我们可以看到3个zabbix-agent pod以demonset的方式,zabbix proxy只有一个,以普通deployment的方式运行。我在测试的时候,为了调试zabbix proxy被动模式,还加了10051的nodeport端口映射,最后没有用上。
3.1 添加Proxy代理
第一步,在“管理”–“Proxy”里面添加代理,如下
proxy名称:这个要跟helm value.yaml配置文件里面的name: ZBX_HOSTNAME value: zabbix-proxy-rke2,这个配置对应上,否则proxy会注册失败
proxy模式:主动模式,还是被动模式?
我用的主动模式。主动模式的时候,proxy代理地址一定要注意zabbix proxy和zabbix server的日志,如果有两者数据传输异常的情况,一定要及时更改这个代理地址的配置,为什么我用10.251.0.1,而不用rke集群中的node节点的ip,就是因为server端日志报错了,ip deny。而10.251.0.1这个地址对应的是zabbix server部署后的docker网桥地址。对,就是那么麻烦。而且如果你的zabbix proxy中间如果重新部署,pod漂移到了其它k8s节点,也需要改一下配置,否则server会有ip deny的日志,两边监控数据传输不了。
如果使用被动模式,那么需要加一个nodeport,或者是修改yaml配置文件,实现对zabbix proxy这个服务,对外可以访问,如下
192.168.0.10是其中一个k8s节点。
3.2 k8s主机自动注册
配置完成Proxy,且从proxy和server的日志,看到数据传输正常,日志正常,开始配置监控
在这一步配置的时候,可以先设置一个
注意看我上面的配置,上面是完成所有配置后的截图,其中有两个是没有关联主机接口的,但是监控项是最多的。其他主机都是自动发现的。实际的节点只有3个,但是因为我配置的是master节点,所以监控模板很多,有API的、Controller的、Kubelet的、Scheduler的,还有最基础的node的。
所以在最开始配置的时候,你要先选择一个主机,关联那几个监控模板。
首先配置第一个模版Kubernetes Kubelet by HTTP,添加主机,添加模板
其实这两个模版,好像哪个是第一个都行。我们先添加Kubernetes Kubelet by HTTP
注意配置的时候,要修改两个“宏”参数,否则获取不到主机
{$KUBE.API.TOKEN}这个参数,就是通过下面的命令获取的
kubectl get secret zabbix-service-account -n monitoring -o jsonpath={.data.token} | base64 -d
这个参数,有些博主描述的很不清晰。。。搞得我刚开始的时候很迷惑
{$KUBE.KUBELET.URL}这个参数,默认的是https://localhost:10250,要修改成k8s某一节点的IP地址,比如
https://192.168.0.10:10250 # 192.168.0.10是三个节点其中一个,随便选一个节点就行
为什么要修改这个参数,因为localhost这个配置不通。
配置完成之后,注意观察proxy和server的日志,过一段时间就会根据自动发现规则,有新主机更新到“数据采集”–“主机”下面了
然后再配置Kubernetes nodes by HTTP,来自动发现k8s的所有节点,包括master、worker。
这个k8s模板的node发现规则,默认绑定的是Linux by Zabbix agent监控模板,我稍微改了一下。因为默认的规则里面,监控的网卡如果用默认的,监控项就会把虚拟网卡也算上,太多了没必要。我改了一下网卡的过滤规则
不过这个实际上用默认的模板也可以,里面有一个参数可以设置
在这个里面修改,有两个参数
{$NET.IF.IFNAME.MATCHES}
{$NET.IF.IFNAME.NOT_MATCHES}
根据自己的实际情况进行修改。
3.3 绑定另外三个模板
下面绑定另外三个模板,为啥要分开绑定?因为把5个模板绑到一个上面会报错
所以新建了一个
这个模板里面也要修改一些参数
还是在这个位置改,我改了这四个变量。
改完之后生效,稍等一会儿,就会自动发现了。如果没有,再查一下proxy和server的日志
在生产环境中配置的时候,我截图里面的k8s-node,k8s-node-cluster,可以不配置,找其中一台主机加上相应的模板就可以了。
4. 配置告警
zabbix 6.x支持webhook告警了,但是我试了一下没成功,所以还是用脚本告警吧。
这种配置比较成熟了,就不在这里写了。
5. 部署完之后的一些问题
5.1 zabbix proxy主动模式还是被动模式?
其实都行。建议zabbix server独立部署,这种情况下,使用被动模式没有任何问题。使用主动模式,有一个很大的问题,就是那个IP可能会有变动,当zabbix proxy的pod异常,重新调度,你还要在web界面更新你配置。
5.2 zabbix监控,数据量的问题
看一下监控模板,监控项还是不少的,而且zabbix用的是关系型数据库,数据量累计之后可能会很大,所以最好改一下监控模板的历史留存。prometheus数据库,我一般也就保留最多14天的数据。当节点数达到几十个的时候,感觉mysql历史表很可能很快达到上亿条数据,查询速度就会越来越慢。
5.3 zabbix proxy镜像标签的问题
为啥我没有用默认的镜像标签,一个原因就是默认的标签里面缺少了curl的一些库,导致没办法自动发现。而且默认的是本地sqllite库,如果有条件,还是用mysql库更合适一些。因为每次proxy的pod重新部署,都会跟zabbix server同步一次数据,如果节点数比较多,数据量就会比较大,同步时间会比较长,影响监控数据传输。
参考:
zabbix容器镜像下载地址
https://www.zabbix.com/cn/container_images
zabbix helm安装包地址
https://git.zabbix.com/projects/ZT/repos/kubernetes-helm/browse?at=refs%2Fheads%2Frelease%2F6.4
Monitoring Kubernetes with Zabbix
https://blog.zabbix.com/monitoring-kubernetes-with-zabbix/25055/
Zabbix + Kubernetes
https://www.zabbix.com/cn/integrations/kubernetes
Zabbix6监控K8S(Zabbix-Proxy监控K8S)
https://blog.csdn.net/weixin_43092290/article/details/131004307
Zabbix实现监控Kubernetes
https://blog.csdn.net/qq_25854057/article/details/128885621