Prometheus 监控系统说明
参考:
https://prometheus.io/docs/introduction/overview/
https://github.com/prometheus/prometheus
https://www.prometheus.wang/
Prometheus 简介
Prometheus 是一个开源系统,监控和警报工具包最初构建于 SoundCloud。 自 2012 年成立以来,许多公司和组织都采用了 Prometheus,该项目具有非常活跃的开发者和用户社区。它现在是一个独立的开源项目并独立于任何公司进行维护。 为了强调这一点,并澄清项目的治理结构,Prometheus 2016年加入了 云原生计算基金会,作为继 Kubernetes 之后的第二个托管项目。
Prometheus 将其指标收集并存储为时间序列数据,即指标信息与记录的时间戳一起存储,以及称为标签的可选键值对。
prometheus的主要特点是:
一个多维 数据模型, 具有由指标名称和键/值对标识的时间序列数据
PromQL,一种 灵活的查询语言 利用这个维度
不依赖分布式存储; 单个服务器节点是自治的
时间序列收集通过 HTTP 上的拉模型发生
推送时间序列 通过中间网关支持
通过服务发现或静态配置发现目标
多种图形和仪表板支持模式
这张图说明了 Prometheus 的架构和一些 其生态系统组成部分:
Prometheus Server
Prometheus Server是Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及查询。 Prometheus Server可以通过静态配置管理监控目标,也可以配合使用Service Discovery的方式动态管理监控目标,并从这些监控目标中获取数据。其次Prometheus Server需要对采集到的监控数据进行存储,Prometheus Server本身就是一个时序数据库,将采集到的监控数据按照时间序列的方式存储在本地磁盘当中。最后Prometheus Server对外提供了自定义的PromQL语言,实现对数据的查询以及分析。
Prometheus Server内置的Express Browser UI,通过这个UI可以直接通过PromQL实现数据的查询以及可视化。
Prometheus Server的联邦集群能力可以使其从其他的Prometheus Server实例中获取数据,因此在大规模监控的情况下,可以通过联邦集群以及功能分区的方式对Prometheus Server进行扩展。
Exporters
Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的Endpoint端点,即可获取到需要采集的监控数据。
一般来说可以将Exporter分为2类:
- 直接采集:这一类Exporter直接内置了对Prometheus监控的支持,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接内置了用于向Prometheus暴露监控数据的端点。
- 间接采集:间接采集,原有监控目标并不直接支持Prometheus,因此我们需要通过Prometheus提供的Client Library编写该监控目标的监控采集程序。例如: Mysql Exporter,JMX Exporter,Consul Exporter等。
AlertManager
在Prometheus Server中支持基于PromQL创建告警规则,如果满足PromQL定义的规则,则会产生一条告警,而告警的后续处理流程则由AlertManager进行管理。在AlertManager中我们可以与邮件,Slack等等内置的通知方式进行集成,也可以通过Webhook自定义告警处理方式。AlertManager即Prometheus体系中的告警处理中心。
PushGateway
由于Prometheus数据采集基于Pull模型进行设计,因此在网络环境的配置上必须要让Prometheus Server能够直接与Exporter进行通信。 当这种网络需求无法直接满足时,就可以利用PushGateway来进行中转。可以通过PushGateway将内部网络的监控数据主动Push到Gateway当中。而Prometheus Server则可以采用同样Pull的方式从PushGateway中获取到监控数据。
安装说明
prometheus-operator
参考:https://github.com/prometheus-operator/prometheus-operator
项目状态:beta,并非所有计划的特性都已完成。API、规范、状态和其他面向用户的对象可能会改变,但是以向后兼容的方式。
注:项目以前被称为coreos/prometheus-operator。
为了在Kubernetes能够方便的管理和部署Prometheus,我们使用ConfigMap管理Prometheus配置文件。每次对Prometheus配置文件进行升级时,,我们需要手动移除已经运行的Pod实例,从而让Kubernetes可以使用最新的配置文件创建Prometheus。 而如果当应用实例的数量更多时,通过手动的方式部署和升级Prometheus过程繁琐并且效率低下。
从本质上来讲Prometheus属于是典型的有状态应用,而其又包含了一些自身特有的运维管理和配置管理方式。而这些都无法通过Kubernetes原生提供的应用管理概念实现自动化。为了简化这类应用程序的管理复杂度,CoreOS率先引入了Operator的概念,并且首先推出了针对在Kubernetes下运行和管理Etcd的Etcd Operator。并随后推出了Prometheus Operator。
Prometheus Operator架构:
Prometheus Operator目前提供的️4类资源:
- Prometheus:声明式创建和管理Prometheus Server实例;
- ServiceMonitor:负责声明式的管理监控配置;
- PrometheusRule:负责声明式的管理告警配置;
- Alertmanager:声明式的创建和管理Alertmanager实例。
kube-prometheus
参考:https://github.com/prometheus-operator/kube-prometheus
kube-prometheus提供了基于Prometheus和Prometheus Operator的完整集群监控堆栈的示例配置。这包括部署多个Prometheus和Alertmanager实例、用于收集节点指标的指标导出器(如node_exporters)、将Prometheus链接到各种指标端点的抓取目标配置,以及用于通知集群中潜在问题的示例警报规则。
常用Exporter说明
监控Node
参考:https://github.com/prometheus/node_exporter
监控网络
参考:
https://github.com/prometheus/blackbox_exporter
https://github.com/prometheus/snmp_exporter
监控MySQL
参考:https://github.com/prometheus/mysqld_exporter
监控Haproxy
参考:https://github.com/prometheus/haproxy_exporter
监控Memcached
参考:https://github.com/prometheus/memcached_exporter
监控JVM
参考:https://github.com/prometheus/jmx_exporter
监控Elasticsearch
参考:https://github.com/prometheus-community/elasticsearch_exporter
监控PostgreSQL
参考:https://github.com/prometheus-community/postgres_exporter
监控MongoDB
参考:
https://github.com/dcu/mongodb_exporter
https://github.com/percona/mongodb_exporter
https://github.com/percona/grafana-dashboards
监控K8s
下表中,梳理了监控Kubernetes集群监控的各个维度以及策略: