Zabbix 监控 Kubernetes 集群
Zabbix作为一个成熟且功能强大的监控系统,被许多企业广泛采用。它能够对各种IT基础设施进行全面的监控,包括服务器、网络设备、应用程序等。而将Zabbix与Kubernetes结合,可以实现对Kubernetes集群的全面监控,从而提高集群的可观察性和管理效率。
Zabbix 的最低标准是它在监控 Kubernetes 和云原生应用程序方面与 Prometheus 一样有效。
Zabbix 提供与 Prometheus、警报管理器和 Grafana for Kubernetes 类似的指标和触发器,因为它们都使用相同的后端工具来执行此操作。然而,Zabbix 可以在一个产品中做到这一点,同时仍然保持灵活性,并允许您监视几乎任何您可以编写代码来收集的内容。关于应用程序监控,Zabbix 可以转换 Prometheus 导出器和端点提供给它的 Prometheus 指标。此外,由于 Zabbix 可以调用任何 HTTP 端点,因此它可以监视没有专用 Prometheus 端点的应用程序,这与 Prometheus 不同。
准备kubernets集群
root@node40:~# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
node40 Ready control-plane 60d v1.29.3 192.168.72.40 <none> Ubuntu 22.04.2 LTS 5.15.0-105-generic containerd://1.7.15
node41 Ready <none> 60d v1.29.3 192.168.72.41 <none> Ubuntu 22.04.2 LTS 5.15.0-76-generic containerd://1.7.15
node42 Ready <none> 60d v1.29.3 192.168.72.42 <none> Ubuntu 22.04.2 LTS 5.15.0-76-generic containerd://1.7.15
准备可用的默认storageclass存储
root@node40:~# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
openebs-hostpath (default) openebs.io/local Delete WaitForFirstConsumer false 60d
部署zabbix-server
项目地址:https://github.com/zabbix-community/helm-zabbix
本示例在kubernetes集群中部署zabbix-server。
添加helm仓库
helm repo add zabbix-community https://zabbix-community.github.io/helm-zabbix
安装zabbix-server
helm upgrade --install zabbix-server zabbix-community/zabbix \
-n monitoring --create-namespace \
--set zabbixWeb.service.type=NodePort \
--set postgresql.persistence.enabled=true
查看创建的pods
root@kube001:~# kubectl -n monitoring get pods
NAME READY STATUS RESTARTS AGE
zabbix-server-postgresql-0 1/1 Running 0 47m
zabbix-server-zabbix-server-6fd6c44b57-hrdlx 2/2 Running 0 47m
zabbix-server-zabbix-web-79d84c458b-pwt7c 1/1 Running 0 47m
zabbix-server-zabbix-webservice-b8765d785-rj6g2 1/1 Running 0 47m
查看创建的service
root@kube001:~# kubectl -n monitoring get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
zabbix-server-postgresql ClusterIP 10.96.1.32 <none> 5432/TCP 48m
zabbix-server-zabbix-server ClusterIP 10.96.3.147 <none> 10051/TCP,10052/TCP 48m
zabbix-server-zabbix-web NodePort 10.96.2.122 <none> 80:31080/TCP 48m
zabbix-server-zabbix-webservice ClusterIP 10.96.0.126 <none> 10053/TCP 48m
查看为postgresql创建的pvc持久卷申请
root@node40:~# kubectl -n monitoring get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
postgresql-data-zabbix-server-postgresql-0 Bound pvc-21a8a49b-cc14-4d62-b08c-ba3a4c20ea8b 5Gi RWO openebs-hostpath <unset> 47s
浏览器访问zabbix-web,通过NodePort service 端口在集群外访问,默认账号密码为Admin/zabbix
http://192.168.72.40:31080
web访问如下:
部署zabbix-agent
项目地址:https://git.zabbix.com/projects/ZT/repos/kubernetes-helm/browse
官方博客:https://blog.zabbix.com/monitoring-kubernetes-with-zabbix/25055/
helm chart地址:https://cdn.zabbix.com/zabbix/integrations/kubernetes-helm/7.0/
Zabbix 通过收集 Kubernetes API 和 kube-state-metrics 公开的指标来监控 Kubernetes。使用 Zabbix 提供的 Helm Chart 将监视集群所需的组件安装在集群内。 Helm Chart 包括作为守护进程集安装的 Zabbix 代理,用于监视每个节点上的本地资源和应用程序。还安装了Zabbix代理来收集监控数据并将其传输到外部Zabbix服务器。
只有 Zabbix proxy 需要访问 Zabbix server,而代理可以将数据发送到安装在与每个代理相同的命名空间中的代理。集群角色允许 Zabbix 通过 Kubernetes API 访问集群中的资源。虽然可以修改集群角色来限制授予 Zabbix 的权限,但这将导致某些项目不受支持。如果您想通过 Zabbix 充分利用 Kubernetes 监控,我们建议保持不变。
Zabbix Helm Chart 将 kube-state-metrics 项目安装为依赖项。您可能已经熟悉 Kubernetes 组织下的这个项目,该项目根据 Kubernetes 资源的当前状态生成 Prometheus 格式的指标。此外,如果您有使用 Prometheus 监控集群的经验,您可能已经安装了它。如果是这种情况,您可以指向此部署,而不是安装另一个部署。
添加helm仓库
helm repo add zabbix-chart-7.0 https://cdn.zabbix.com/zabbix/integrations/kubernetes-helm/7.0
安装zabbix-agent
helm upgrade --install zabbix-agent zabbix-chart-7.0/zabbix-helm-chrt \
-n monitoring --create-namespace \
--set zabbixProxy.enabled=true \
--set zabbixProxy.env[0].name=ZBX_HOSTNAME \
--set zabbixProxy.env[0].value=zabbix-proxy \
--set zabbixProxy.env[1].name=ZBX_SERVER_HOST \
--set zabbixProxy.env[1].value=zabbix-server-zabbix-server \
--set zabbixAgent.enabled=true
查看创建的pods
root@node40:~# kubectl -n monitoring get pods
......
NAME READY STATUS RESTARTS AGE
zabbix-agent-9dxl6 1/1 Running 0 43m
zabbix-agent-kube-state-metrics-67f68d9db9-fpw79 1/1 Running 0 43m
zabbix-agent-svv4l 1/1 Running 0 43m
zabbix-agent-wq2dt 1/1 Running 0 43m
zabbix-proxy-58bcbcf55c-g44q6 1/1 Running 0 39m
查看创建的service
......
root@node40:~# kubectl -n monitoring get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
zabbix-agent-kube-state-metrics ClusterIP 10.96.2.212 <none> 8080/TCP 43m
zabbix-agent-zabbix-helm-chrt-agent ClusterIP 10.96.1.235 <none> 10050/TCP 43m
zabbix-agent-zabbix-helm-chrt-proxy ClusterIP 10.96.2.129 <none> 10051/TCP 43m
需要从我们的 zabbix 服务器中提取对 api 服务器进行身份验证所需的 zabbix 服务帐户令牌。将此命令的输出保存在某处,因为我们需要它来配置 zabbix UI。
kubectl get secret zabbix-service-account -n monitoring -o jsonpath={.data.token} | base64 -d
配置zabbix-web
添加代理
我们将通过管理 -> 代理来添加代理:
- 单击创建代理。因为默认情况下这是一个主动代理,所以我们只需要指定代理名称。如果您没有对 helm 图表进行任何更改,则默认为 zabbix-proxy。如果您想以不同的方式命名,可以在 helm 图表中更改代理的环境变量 zbx_hostname。我们暂时将其保留为默认值。您将输入该名称,然后单击“添加”。几分钟后,您将开始看到它说代理已被看到。
- 创建一个Host Group,放置与Kubernetes相关的主机。对于这个例子,我们创建一个,我们将其称为 Kubernetes。
- 前往配置下的主机页面,然后单击创建主机。第一个主机将收集与监控 Kubernetes 节点相关的指标,我们将使用 Zabbix 低级发现来发现节点并创建新主机。
- 将此主机命名为 Kubernetes Nodes。我们还将将此主机分配给我们创建的 Kubernetes 主机组,并通过 HTTP 附加模板 Kubernetes 节点。
- 将“Monitored by proxy”行更改为之前创建的代理,称为 zabbix-proxy。
- 单击“宏”选项卡并选择“继承和宿主宏”。您应该能够看到可能设置为影响集群中监视内容的所有宏。在这种情况下,我们需要更改前两个宏。第一个 {KUBE.API.ENDPOINT.URL} 应设置为 Kubernetes API 端点。在我们的例子中,我们可以将其设置为我之前提到的:default.svc.cluster.local:443/api。接下来,应将令牌设置为之前从命令行检索到的值。
- 点按添加。几分钟后,您应该开始在最新数据页上看到数据,并在代表每个节点的主机页上看到新主机。
zabbix-web创建proxy,选择管理–Proxy
确认proxy 状态为online
添加主机
新建主机组,选择数据采集–主机群组
zabbix-web创建host,选择数据采集–主机,在Templates/Applications
中勾选Kubernetes nodes by HTTP
模板。
配置宏
您还需要 Kubernetes API 端点。在大多数情况下,您将使用已安装的代理,而不是直接使用服务器或集群外部的代理。如果是这种情况,您可以使用 API 的服务 DNS。我们应该能够通过指向 https://kubernetes.default.svc.cluster.local:443 来访问它。
查看kubernetes监控指标,选择监测–最新数据
创建附加主机
现在让我们创建另一个主机来表示通过 Kubernetes API 和 kube-state-metrics 端点可用的指标。
- 再次单击“创建主机”,将该主机命名为“Kubernetes Cluster State”,并再次将其添加到 Kubernetes 组中。
- 我们还通过 HTTP 附加 Kubernetes 集群状态模板。同样,我们将选择之前创建的代理。
- 假设 Helm Chart 安装过程中没有进行任何其他更改,我们现在可以添加该主机。
几分钟后,您应该会收到与集群状态相关的指标,包括代表每个节点上 kubelet 的主机。