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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部