官方架构图
image.png

Prometheus Server

Prometheus的特点

  • 多维度数据模型。
  • 灵活的查询语言。
  • 不依赖分布式存储,单个服务器节点是自主的。
  • 通过基于HTTP的pull方式采集时序数据。
  • 可以通过中间网关进行时序列数据推送。
  • 通过服务发现或者静态配置来发现目标服务对象。
  • 支持多种多样的图表和界面展示,比如Grafana等。

Prometheus包含的模块:

  • 内置了一个HTTP server,用来提供了Web界面

image.png

  • TSDB:时序数据库,用来存储抓取到的数据,供查询和图表展示
  • 采集程序,根据配置文件的目标地址去抓取指标
  • PromQL:PromQL是Prometheus内置的数据查询语言,其提供对时间序列数据丰富的查询,聚合以及逻辑运算能力的支持

Push Gateway: 默认情况下Prometheus是去目标pull拉数据,也可以让目标主动push推数据,这个不常用
Service discovery: 服务发现,比如k8s集群有N台主机,IP地址和数量可能不是固定,我们可以让Prometheus自动发现集群中所有的节点,降低维护成本。

Prometheus的优缺点

Prometheus 属于 CNCF 项目,拥有完整的开源生态,与 Zabbix 这种传统 agent 监控不同,它提供了丰富的 exporter 来满足你的各种需求。你可以在这里看到官方、非官方的 exporter。如果还是没满足你的需求,你还可以自己编写 exporter,简单方便、自由开放,这是优点。

但是过于开放就会带来选型、试错成本。之前只需要在 zabbix agent里面几行配置就能完成的事,现在你会需要很多 exporter 搭配才能完成。还要对所有 exporter 维护、监控。尤其是升级 exporter 版本时,很痛苦。非官方exporter 还会有不少 bug。这是使用上的不足,当然也是 Prometheus 的设计原则。

K8S 生态的组件都会提供/metric接口以提供自监控,这里列下我们正在使用的:

  • cadvisor: 集成在 Kubelet 中。
  • kubelet: 10255为非认证端口,10250为认证端口。
  • apiserver: 6443端口,关心请求数、延迟等。
  • scheduler: 10251端口。
  • controller-manager: 10252端口。
  • etcd: 如etcd 写入读取延迟、存储容量等。
  • docker: 需要开启 experimental 实验特性,配置 metrics-addr,如容器创建耗时等指标。
  • kube-proxy: 默认 127 暴露,10249端口。外部采集时可以修改为 0.0.0.0 监听,会暴露:写入 iptables 规则的耗时等指标。
  • kube-state-metrics: K8S 官方项目,采集pod、deployment等资源的元信息。
  • node-exporter: Prometheus 官方项目,采集机器指标如 CPU、内存、磁盘。
  • blackbox_exporter: Prometheus 官方项目,网络探测,dns、ping、http监控
  • process-exporter: 采集进程指标
  • nvidia exporter: 我们有 gpu 任务,需要 gpu 数据监控
  • node-problem-detector: 即 npd,准确的说不是 exporter,但也会监测机器状态,上报节点异常打 taint
  • 应用层 exporter: mysql、nginx、mq等,看业务需求。
  • 还有各种场景下的自定义 exporter,如日志提取后面会再做介绍。

Alertmanager

Prometheus运行前,我们要提前写好规则,当规则满足,我们可以触发报警,Alertmanager就是专门处理各种报警的,支持如email,webhook,slack等提醒

Grafana

Prometheus自带的Web UI比较简陋,Grafana是个数据可视化开源软件, 支持各种数据源,如MySQL,Prometheus等,Grafana提供了很多图表组件和dashboard,如下图,一键导入即可
https://grafana.com/grafana/dashboards/8919
image.png

参考

https://news.51cto.com/art/202005/617092.htm
https://yunlzheng.gitbook.io/prometheus-book/