背景
一个月前写的草稿文档,现在才发布,整体完成度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进行操作。
监控架构:
- 各K8S-node安装容器版本的agent。
- 各K8S-node将监控数据汇总到K8S内的Zabbix-proxy。
- Zabbix-proxy将数据传到K8S外的Zabbix-Server。
- 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
- K8S: v1.25.5
步骤二:下载helm源码
- 确认已安装的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 ~]$
- 登录zabbix官方git仓库下载对应版本的helm文件。地址是【zabbix官方代码仓库:zabbix6.0版本监控kubernetes使用的helm源码】
- 上传helm文件到K8S-master节点,并解压。得到的是helm安装的包对象chart文件。(Chart本质上还是一组被编排好的yaml文件,包括了service、deploy、secret、replicaset等等。)
步骤三:准备Zabbix-Proxy和Agent的相关镜像
- 检查解压后文件目录中的关键文件values.yaml,查找容器镜像版本信息。在联网环境下,提前通过docker desktop等手动pull至本地,用docker save -o、docker tag 、docker load -i 等命令将镜像提前准备好。
- 将本地的镜像保存为本地文件,存储到了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
- 用rz命令或者其它sftp工具将镜像tar文件上传。
- 离线环境加载docker镜像。
docker load -i zabbix_k8s_helm_6.0.19.tar
步骤四:在K8S上安装Zabbix-Proxy
- 安装helm命令:
- 可参考【helm官方文档:安装helm】进行安装,截至2023.9.13,官方最新版本是3.12.0。(我觉得官网安装太罗嗦,过于形式。)
- 推荐最简单的做法:获取helm命令的bin文件,直接复制到/usr/bin/目录下,新增x执行权限即可。(甚至不用配置全局变量)
- 我给的 csdn下载连接:【K8S-部署服务的helm-版本v3.6.3】(我设置的是免积分下载)
- 开始安装zabbix-proxy前回顾一下环境,需要满足的条件有:
- zabbix server正常运行
- K8S正常运行
- K8S-master节点上已准备好了helm命令、chart包(官方安装zabbix-proxy的yaml文件)、docker镜像(zabbix-proxy和agent镜像包,其实还有一个镜像包,稍后踩坑的时候讲)。
- 实际操作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模板)
- 在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端的问题,可以解决。参看下图
-
创建主机群组,用于存放新建K8S监控主机,依次使用kubernetes模板,使用zabbix-proxy,等待自动发现、自动注册主机。
-
配置第一个kubelet模板
-
配置其它模板。
(2023年10月20日备注:尤其关键的一个步骤是配置宏变量,否则无法获取kubelet或者其他K8S端口提供的相关监控项目,稍等我忙完手上杂事继续补充。) -
排查端口不通问题。
问题记录
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