一、Kubernetes容器监控的标配—Prometheus
1、简介
Prometheus是由SoundCloud开发的开源监控告警系统并且带时序数据库,基于Go语言,是Google BorgMon监控系统的开源版本。2016年,由Google发起的Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation,CNCF)将Prometheus纳入其第二大开源项目。Prometheus在开源社区也十分活跃,在GitHub上拥有两万多Star,并且系统每隔一两周就会有一个小版本的更新。
随着Kubernetes在容器调度和管理上确定领头羊的地位,Prometheus 也成为Kubernetes容器监控的标配。
2、优点
Prometheus的优点有很多,如下所述。
(1)提供多维度数据模型和灵活的查询方式,通过将监控指标关联多个tag,来将监控数据进行任意维度的组合,并且提供简单的PromQL查询方式,还提供HTTP查询接口,可以很方便地结合Grafana等GUI组件展示数据。
(2)在不依赖外部存储的情况下,支持服务器节点的本地存储,通过Prometheus自带的时序数据库,可以完成每秒千万级的数据存储;不仅如此,在保存大量历史数据的场景中,Prometheus可以对接第三方时序数据库如OpenTSDB等。
(3)定义了开放指标数据标准,以基于HTTP的Pull方式采集时序数据,只有实现了Prometheus监控数据格式的监控数据才可以被Prometheus采集、汇总,并支持以Push方式向中间网关推送时序列数据,能更加灵活地应对多种监控场景。
(4)支持通过静态文件配置和动态发现机制发现监控对象,自动完成数据采集。Prometheus目前已经支持Kubernetes、etcd、Consul等多种服务发现机制,可以减少运维人员的手动配置环节,在容器运行环境中尤为重要。
(5)易于维护,可以通过二进制文件直接启动,并且提供了容器化部署镜像。
(6)支持数据的分区采样和联邦部署,支持大规模集群监控。
3、架构
下面简单介绍Prometheus的架构。
Prometheus的基本原理是通过HTTP周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口并且符合Prometheus定义的数据格式,就可以接入Prometheus监控。
如图1-9所示为Prometheus的整体架构图(来自Prometheus官网),展现了Prometheus内部模块及相关的外围组件之间的关系。
图1-9
PrometheusServer负责定时在目标上抓取metrics(指标)数据,每个抓取目标都需要暴露一个HTTP服务接口用于Prometheus定时抓取。这种调用被监控对象获取监控数据的方式被称为Pull(拉)。Pull方式体现了Prometheus独特的设计哲学与大多数采用了Push(推)方式的监控系统不同。
Pull方式的优势是能够自动进行上游监控和水平监控,配置更少,更容易扩展,更灵活,更容易实现高可用。展开来说就是Pull方式可以降低耦合。由于在推送系统中很容易出现因为向监控系统推送数据失败而导致被监控系统瘫痪的问题,所以通过Pull方式,被采集端无须感知监控系统的存在,完全独立于监控系统之外,这样数据的采集完全由监控系统控制,增强了整个系统的可控性。
Prometheus通过Pull方式采集数据,那么它如何获取监控对象呢?Prometheus支持两种方式:第1种是通过配置文件、文本文件等进行静态配置;第2种是支持ZooKeeper、Consul、Kubernetes等方式进行动态发现,例如对于Kubernetes的动态发现,Prometheus使用Kubernetes的API查询和监控容器信