本文介绍Prometheus 监控及在k8s集群中使用node-exporter、prometheus、grafana对集群进行监控。实现原理类似ELK、EFK组合。node-exporter组件负责收集节点上的metrics监控数据,并将数据推送给prometheus, prometheus负责存储这些数据,grafana将这些数据通过网页以图形的形式展现给用户。
在开始之前有必要了解下Prometheus是什么? Prometheus (中文名:普罗米修斯)是由 SoundCloud 开发的开源监控报警系统和时间序列数据库(TSDB).自2012年起,许多公司及组织已经采用 Prometheus,并且该项目有着非常活跃的开发者和用户社区.现在已经成为一个独立的开源项目。Prometheus 在2016加入 CNCF ( Cloud Native Computing Foundation 云原生计算基金会 ), 作为在 kubernetes 之后的第二个由基金会主持的项目。 Prometheus 的实现参考了Google内部的监控实现,与源自Google的Kubernetes结合起来非常合适。另外相比influxdb的方案,性能更加突出,而且还内置了报警功能。它针对大规模的集群环境设计了拉取式的数据采集方式,只需要在应用里面实现一个metrics接口,然后把这个接口告诉Prometheus就可以完成数据采集了,下图为prometheus的架构图。
promethues是一套开源的系统监控报警框架。Prometheus 所有采集的监控数据均以指标(metric)的形式保存在内置的时间序列数据库当中(TSDB):属于同一指标名称,同一标签集合的、有时间戳标记的数据流。除了存储的时间序列,Prometheus 还可以根据查询请求产生临时的、衍生的时间序列作为返回结果。包含了以下组件
promethues 的各个组件基本都是用 golang 编写,对编译和部署十分友好.并且没有特殊依赖.基本都是独立工作。
注: 由于数据采集可能会有丢失,所以 Prometheus 不适用对采集数据要 100% 准确的情形。但如果用于记录时间序列数据,Prometheus 具有很大的查询优势,此外,Prometheus 适用于微服务的体系架构。
prometheus中存储的数据为时间序列,是由Metric的名字和一系列的标签(键值对)唯一标识的,不同的标签代表不同的时间序列。
样本:实际时间序列,每个序列包括一个float64的值和一个毫秒级的时间戳。(指标+时间戳+样本值)
metric名字: 具有语义,表示功能:例如:http_requeststotal, 表示 http 请求的总数。其中,metric 名字由 ASCII 字符,数字,下划线,以及冒号组成,且必须满足正则表达式[a-zA-Z:][a-zA-Z0-9_:]*。
标签:使一个时间序列有不同未读的识别。例如 http_requeststotal{method=”Get”} 表示所有 http 请求中的 Get 请求。当 method=”post” 时,则为新的一个 metric。标签中的键由 ASCII 字符,数字,以及下划线组成,且必须满足正则表达式[a-zA-Z:][a-zA-Z0-9_:]*。
格式:{=, …},例如:http_requests_total{method=”POST”,endpoint=”/api/tracks”}。
Prometheus 客户端库主要提供四种主要的 metric 类型:
一种累加的 metric,典型的应用如: 请求的个数 结束的任务数 出现的错误数 。。。
例如: 查询 promhttp_metric_handler_requests_total{code=”200”,instance=”localhost:9090”,job=”prometheus”} 返回 8,10 秒后再次查询,则返回 14。
一种常规的 metric,典型的应用如: 温度 运行的 go routines 的个数 可以任意加减。
例如: go_goroutines{instance=”localhost:9090”,job=”prometheus”} 返回值 147,10 秒后返回 124。
注: routines: go的日常工作?
注: histogram 英[ˈhɪstəɡræm] 美[ˈhɪstəɡræm] 直方图;矩形图
可以理解为柱状图,典型的应用如: 请求持续时间 响应大小 可以对观察结果采样,分组及统计。
例如: 查询 go_gc_duration_seconds_sum{instance=”localhost:9090”,job=”prometheus”}时 返回结果如下:Histogram metric 返回结果图
类似于 Histogram,典型的应用如: 请求持续时间 响应大小 提供观测值的 count 和 sum 功能。 提供百分位的功能,即可以按百分比划分跟踪结果。
instance 和 jobs instance: 一个单独 scrape(抓取) 的目标, 一般对应于一个进程。
jobs: 一组同种类型的 instances(主要用于保证可扩展性和可靠性),例如: 注: scrape 英[skreɪp] 美[skreɪp] 刮掉; 削去; 擦坏; 擦伤; 刮坏; 蹭破; (使) 发出刺耳的刮擦声
当 scrape 目标时,Prometheus 会自动给这个 scrape 的时间序列附加一些标签以便更好的分别 例如: instance,job。
下面以实际的 metric 为例,对上述概念进行说明: Metrics 示例
如图所示,这三个 metric 的名字都一样,他们仅凭 handler 不同而被标识为不同的 metrics。 这类 metrics 只会向上累加,是属于 Counter 类型的 metric,且 metrics 中都含有 instance 和 job 这两个标签。