Zabbix6监控K8S(Zabbix-Proxy监控K8S)

7 篇文章 1 订阅
5 篇文章 0 订阅

背景

一个月前写的草稿文档,现在才发布,整体完成度90%吧。足够满足从无到有的监控了。

一句话说明需求:

  • zabbix中有很多K8S模板,我把他们都用起来,看能得到哪些监控项。

一句话说明解决:

  • 使用Linux搭建一台外部zabbix6.4,将一套zabbix-proxy部署到目标K8S集群中,在外部zabbix中获取zabbix-proxy的监控数据,可以实现监控。

关键词:
zabbix监控K8S/helm安装zabbix-proxy/zabbix-proxy监控K8S/zabbix监控K8S容器/zabbix监控kubernetes

监控目标及结果

目标: 知道哪个容器率先故障、知道哪个节点故障,并结合自动预警及时通知。
背景: 暂无时间去学习使用普罗米修斯,已有zabbix平台,主打一个all in one,用一套监控平台监控所有。
(虽然APM监控还是采用了Skywalking)。
基本前提: 要实现zbx监控K8S,官方说明zabbix必须需要使用6.x以上,kubernetes必须需要使用v1.18.x以上。本次针对zabbix6.0和k8s v1.25.x进行操作。

监控架构:

  1. 各K8S-node安装容器版本的agent。
  2. 各K8S-node将监控数据汇总到K8S内的Zabbix-proxy。
  3. Zabbix-proxy将数据传到K8S外的Zabbix-Server。
  4. Zabbix-proxy也会获取K8S的api、cluster state、schedule等信息,传输给Zabbix-Server。
    在这里插入图片描述

参考文章

【zabbix官方博客:Monitoring Kubernetes with Zabbix(6.x版本以上)】
【zabbix官方解决方案:集成监控kubernetes】
【zabbix官方代码仓库:zabbix6.0版本监控kubernetes使用的helm源码】
【本人最初的几篇文章:kylinv10安装zabbix6】
【helm官方文档:安装helm】
【本人提供的CSDN下载:K8S-部署服务的helm-版本v3.6.3】

简要步骤

1. 安装zabbix-server6以上。准备好需要被监控的K8S集群(1.18.x)以上。
2. 访问git仓库,下载zabbix-helm源码。 将源码上传到K8S-master节点,准备安装。
3. 在联网环境下准备好相关helm使用的镜像。 将镜像上传到K8S-master节点,准备安装。
4. 在目标K8S master节点上通过helm安装zabbix-proxy。 需要提前在K8S-master上安装helm命令。
5. 登录zabbix-server配置各个kubernetes模板,等待自动监控K8S主机即可。

注意: 第4、5步是最简单但是坑比较多的地方,比如端口被占用、镜像不全、主机名冲突、端口监听不通、宏变量需修改(6.0和6.4连web界面都有变化,宏变量虽然同名但值也有差异)等。

实际操作

步骤一:安装Zabbix6和K8S 1.25.5

  • 安装zabbix6请参考这篇文章:【kylinv10安装zabbix6】
    大部分Linux系统都可以参考其中的注意点进行安装,注意点是选用兼容的软件版本。

  • 安装K8S相信是查看本篇文章的各位同行的基本功,我在这里就不做丢人现眼了。我自己用Ansible安装的是1.25.5版本。

  • 软件版本信息:

    • K8S: v1.25.5
      在这里插入图片描述
    • Zabbix Server: 6.0.8
      在这里插入图片描述

步骤二:下载helm源码

  1. 确认已安装的zabbix-server版本号:从Linux上查看安装包、查看readme文件、查看进程都行。最直观就是登录web查看最下方小字。
    通过命令行查看zabbix server版本,操作如下
[sysma@zabbix ~]$ pwd
/home/sysma
[sysma@zabbix ~]$ /usr/local/zabbix/sbin/zabbix_server -V
zabbix_server (Zabbix) 6.0.8
Revision c7c3044a4a2 29 August 2022, compilation time: Aug 15 2023 09:52:14

Copyright (C) 2022 Zabbix SIA
License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it according to
the license. There is NO WARRANTY, to the extent permitted by law.
[sysma@zabbix ~]$ 

  1. 登录zabbix官方git仓库下载对应版本的helm文件。地址是【zabbix官方代码仓库:zabbix6.0版本监控kubernetes使用的helm源码】
    在这里插入图片描述在这里插入图片描述
  2. 上传helm文件到K8S-master节点,并解压。得到的是helm安装的包对象chart文件。(Chart本质上还是一组被编排好的yaml文件,包括了service、deploy、secret、replicaset等等。)
    在这里插入图片描述

步骤三:准备Zabbix-Proxy和Agent的相关镜像

在这里插入图片描述

  1. 检查解压后文件目录中的关键文件values.yaml,查找容器镜像版本信息。在联网环境下,提前通过docker desktop等手动pull至本地,用docker save -o、docker tag 、docker load -i 等命令将镜像提前准备好。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 将本地的镜像保存为本地文件,存储到了D盘的zabbix_k8s_helm_6.0.19.tar文件。(方便SCP到目标离线环境的K8S-master节点上)
docker save zabbix/zabbix-proxy-sqlite3:alpine-6.0.19 zabbix/zabbix-agent2:alpine-6.0.19 -o d:/zabbix_k8s_helm_6.0.19.tar

在这里插入图片描述

  1. 用rz命令或者其它sftp工具将镜像tar文件上传。
    在这里插入图片描述
  2. 离线环境加载docker镜像。
 docker load -i zabbix_k8s_helm_6.0.19.tar

在这里插入图片描述

步骤四:在K8S上安装Zabbix-Proxy

  1. 安装helm命令:
    • 可参考【helm官方文档:安装helm】进行安装,截至2023.9.13,官方最新版本是3.12.0。(我觉得官网安装太罗嗦,过于形式。)
    • 推荐最简单的做法:获取helm命令的bin文件,直接复制到/usr/bin/目录下,新增x执行权限即可。(甚至不用配置全局变量)
    • 我给的 csdn下载连接:【K8S-部署服务的helm-版本v3.6.3】(我设置的是免积分下载)
  2. 开始安装zabbix-proxy前回顾一下环境,需要满足的条件有:
    • zabbix server正常运行
    • K8S正常运行
    • K8S-master节点上已准备好了helm命令、chart包(官方安装zabbix-proxy的yaml文件)、docker镜像(zabbix-proxy和agent镜像包,其实还有一个镜像包,稍后踩坑的时候讲)。
  3. 实际操作helm安装zabbix-server。
  • 可参考官方安装文档,按步骤安装。【zabbix官方代码仓库:zabbix6.0版本监控kubernetes使用的helm源码】其中的readme文件就是安装文档。
  • 实际上官方文档属于在线安装,不符合我的场景,我参考并修改了部分执行命令。各位可以根据实际进行修改。
    在这里插入图片描述
  • 实际操作如下
    进入chart文件目录,修改values.yml文件后进行部署
  • 修改values.yml文件
    values.yml文件内有很多注释,通过以下命令先筛选掉一部分注释,方便查看。
cat values.yaml |grep -v $****\## >noAnnotation-values.yaml

筛选掉大部分注释后的values.yaml文件如下

[sysma@prod-k8s-0001 01]$ cat noAnnotation-values.yaml 
nameOverride: ""
fullnameOverride: ""
kube-state-metrics:
  enabled: true

rbac:
  create: true
  additionalRulesForClusterRole: []
serviceAccount:
  create: true
  name: zabbix-service-account


zabbixProxy:
  enabled: true
  containerSecurityContext: {}
  resources: {}
  image:
    repository: xxxx.harbor/devops/zabbix-proxy-sqlite3 #此处改为我使用的本地harbor仓库。
    #repository: zabbix/zabbix-proxy-sqlite3 原值为在线环境才能拉取到的zabbix项目
    tag: alpine-6.0.19
    pullPolicy: IfNotPresent
    pullSecrets: 
      - name: registrysecret	#在线环境从官方仓库拉取镜像时,不需要指定pullsecrets,此处我改用本人搭建的harbor仓库,因此需要指定拉取的secrets。

  env:
    - name: ZBX_PROXYMODE
      value: 1	#此处需将zbx-proxy改为被动模式。官方博客推荐使用主动模式,但我没有配置成功主动模式,改为被动模式反而成功。
    - name: ZBX_HOSTNAME
      value: zabbix-proxy-xx6 #在zabbix-server上为区分不同K8S的proxy,需要使用不同的proxy名称。


    - name: ZBX_SERVER_HOST
      value: 1xx.xxx.xxx.73:10051 #此处填写的是zabbix-server的IP地址与端口
    - name: ZBX_DEBUGLEVEL
      value: 3
    - name: ZBX_CACHESIZE
      value: 128M
    - name: ZBX_JAVAGATEWAY_ENABLE
      value: false
    - name: ZBX_CONFIGFREQUENCY
      value: 60


  service:
    annotations: {}
    labels: {}
    type: NodePort
    port: 10051
    targetPort: 10051	#在zabbix-server的web界面创建proxy时,需要填写proxy的服务端口。
    nodePort: 30051		#因为K8S内部署的应用,如果不通过service暴露,则外界无法访问。
    externalIPs: []		#除了通过service暴露,还需要指定为NodePort而不是ClusterIP,否则同样无法访问。
    loadBalancerIP: ""
    loadBalancerSourceRanges: []


  nodeSelector: {}

  tolerations: {}

  affinity: {}

  persistentVolume:
    enabled: false

    accessModes:
      - ReadWriteOnce

    annotations: {}

    existingClaim: ""

    mountPath: /data

    size: 2Gi

    storageClass: "-"

    volumeBindingMode: ""

    subPath: ""

zabbixAgent:
  enabled: true
  resources: {}

  securityContext: {}
    # fsGroup: 65534
    # runAsGroup: 65534
    # runAsNonRoot: true
    # runAsUser: 65534

  containerSecurityContext: {}

  hostNetwork: true

  # Specify dns configuration options for agent containers e.g ndots
  dnsConfig: {}
  #  options:
  #  - name: ndots
  #    value: "1"

  hostPID: true
  hostRootFsMount: true
  extraHostVolumeMounts: []
  image:
    repository: xxxxxx.harbor/devops/zabbix-agent2
    #repository: zabbix/zabbix-agent2
    tag: alpine-6.0.19
    pullPolicy: IfNotPresent
    pullSecrets: 
      - name: registrysecret	#在线环境从官方仓库拉取镜像时,不需要指定pullsecrets,此处我改用本人搭建的harbor仓库,因此需要指定拉取的secrets。
  env:
      # - name: ZBX_SERVER_HOST 	#此处需要注释掉这两行,后续若测试有问题,可从deploy中再及时修改。我测试时,提示server host存在两个值,造成冲突,因此需要注释掉一个。
      #value: 0.0.0.0/0
    - name: ZBX_SERVER_PORT
      value: 10051
    - name: ZBX_PASSIVE_ALLOW 	#整个proxy使用的是passive模式,此处的agent也改成passive模式,因此改为true
      value: true
    - name: ZBX_ACTIVE_ALLOW
      value: false
    - name: ZBX_DEBUGLEVEL
      value: 3
    - name: ZBX_TIMEOUT
      value: 4
    - name: ZBX_PASSIVESERVERS
      value: 0.0.0.0/0

  nodeSelector:
    kubernetes.io/os: linux

  tolerations:
    - effect: NoSchedule
      key: node-role.kubernetes.io/control-plane
  affinity: {}
  serviceAccount:
    create: true
    name: zabbix-agent-service-account
    annotations: {}
    imagePullSecrets: []
    automountServiceAccountToken: false

  service:
    type: ClusterIP
    port: 10050
    targetPort: 10050
    nodePort: 10050
    portName: zabbix-agent
    listenOnAllInterfaces: true
    annotations:
      agent.zabbix/monitor: "true"

  rbac:
    create: true
    pspEnabled: false
    pspAnnotations: {}

[sysma@prod-k8s-0001 01]$ 

执行下列命令,部署zabbix到K8S中。

kubectl create namespace monitoring
helm install zabbix Chart.yml -f values.yml -n monitoring	#该命令是在线安装命令。我们应该使用本地离线环境中的helm-chart包(.tgz文件)。

执行上述命令后,等待资源部署就行。可以通过K9S工具、K8Sdashboard查看相关对象的部署情况。根据相关报错进行调整即可,此处列举一下我遇到的问题:

- 待列举。

步骤五:配置zabbix(zabbix-proxy和K8S模板)

  1. 在K8S外的zabbix-server上创建zabbix-proxy配置。前提是K8S内的zabbix-proxy须暴露服务。强烈建议配置过程中打印zabbix-server端、zabbix-proxy端的日志,可以排查故障问题。
    在这里插入图片描述此环境中,zabbix-proxy暴露的随机端口为32464,即从zabbix-server可以telnet 通 32464端口。

在这里插入图片描述新增proxy配置后,可持续打印zabbix-server的日志,查看proxy的可用状态。也可排查故障。
评论中提出一个找不到zabbix-server端的问题,可以解决。参看下图
在这里插入图片描述

  1. 创建主机群组,用于存放新建K8S监控主机,依次使用kubernetes模板,使用zabbix-proxy,等待自动发现、自动注册主机。
    在这里插入图片描述
    在这里插入图片描述

  2. 配置第一个kubelet模板
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 配置其它模板。
    (2023年10月20日备注:尤其关键的一个步骤是配置宏变量,否则无法获取kubelet或者其他K8S端口提供的相关监控项目,稍等我忙完手上杂事继续补充。)

  4. 排查端口不通问题。

在这里插入图片描述

问题记录

33108:20230602:115203.130 item "Kubernetes Controller:kubernetes.controller.workqueue_work_duration_seconds_p90["horizontalpodautoscaler"]" became not supported: Cannot evaluate function: not enough data at "bucket_percentile(//kubernetes.controller.duration_seconds_bucket[*,"horizontalpodautoscaler"],5m,90)".

33108:20230602:110944.692 item "Kubernetes Cluster State:kube.deployment.replicas_mismatched[default/parentdemo]" became not supported: Preprocessing failed for: Cannot execute script: Error: log exceeds the maximum size of 8388608 bytes..    at [anon] (zabbi...
1. Failed: cannot convert value to string

无法访问10257、10259端口

其它问题

在这里插入图片描述
解决一:将之前准备的离线镜像包,分别推送到各台k8s node,并重新装载至每台node的本地。
解决二:共享镜像

helm install zabbix zabbix-helm-chrt-1.3.3.tgz -f values.yaml -n monitoring
docker images
docker tag zabbix/zabbix-proxy-sqlite3:alpine-6.0.19 registry.custom.local:5000/zabbix-proxy-sqlite3:alpine-6.0.19
docker push registry.custom.local:5000/zabbix-proxy-sqlite3:alpine-6.0.19
docker tag zabbix/zabbix-proxy-sqlite3:alpine-6.0.19 xxxxnmt.harbor/devops//zabbix-proxy-sqlite3:alpine-6.0.19
docker tag zabbix/zabbix-proxy-sqlite3:alpine-6.0.19 xxxxnmt.harbor/devops/zabbix-proxy-sqlite3:alpine-6.0.19
docker push xxxxnmt.harbor/devops/zabbix-proxy-sqlite3:alpine-6.0.19
docker images
docker tag zabbix/zabbix-agent2:alpine-6.0.19 xxxxnmt.harbor/devops/zabbix-agent2:alpine-6.0.19
docker push xxxxnmt.harbor/devops/zabbix-agent2:alpine-6.0.19

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值