在现有监控系统下,如何进行容器云应用监控实施?是否进行整体集成,容器云相关监控自成一体?还是对接现有监控系统,纳入整体监控平台?
收起 我们的项目是以Zabbix为基础监控工具设计和建设的,但鉴于prometheus对docker和k8s监控的天然集成,我们打算引入prometheus和Zabbix结合起来,prometheus只负责docker+K8S基础监控数据采集, Zabbix负责容器内应用监控数据采集,采集的数据集中接入Zabbix进行告警触发,并复用我们基于Zabbix开发的潜望者Zabbix运维管理平台,集中进行监控配置管理、阈值管理、巡检管理、数据对接等工作,大幅减少基于prometheus的定制开发工作,实现快速实现、高效部署的云平台整体监控。
按照容器监控的内容,我们分为 docker+K8S基础监控 和 容器内应用监控两部分来分别实现。
1.docker+K8S基础监控的实现:
由于prometheus对docker和k8s监控的天然集成,通过cAdvisor可以直接获取docker基础监控数据,通过kube-state-metrics可以直接获取K8S的资源对象和对应监控数据,因此我们在每个K8S集群上默认部署prometheus实现这部分监控采集,然后通过Zabbix Http Agent方式调用prometheus API来获取数据,接入Zabbix Server从而复用之前建设的功能,实现后续的告警阈值配置和数据接入集中监控平台。
2. 容器内应用监控的实现:
所有的应用监控我们都通过Zabbix实现,这里的“应用”可以是数据库、中间件、也可以是某个应用系统,我们通过在容器中增加环境变量monitor_type来定义,比如monitor_type=mysql就代表这个容器的“应用”是mysql,我们将对它进行mysql监控。
我们在每个K8S集群上默认部署部署两种采集方式的Proxy容器,一种是Pull采集方式(对应着Statefulset部署方式),另一种是Push采集方式(对应着deployment部署方式)。
Pull的方式包括基于odbc的数据库监控、JMX的中间件监控、还有其它通过http等方式实现的容器监控,我们用到了PVC来持久化一些配置文件。如果一个集群中需要多个Proxy,则需要Proxy采集分工实现负载均衡。
Push的方式接受应用容器通过trapper等方式主动推送过来的监控数据,这种方式的Proxy是无状态的,因此如果需要多个Proxy,可以直接通过增加pod副本数横向扩展。 两种方式采集到的数据也都是接入到Zabbix Server中。