理解OpenShift(2):网络之 DNS(域名服务)node
理解OpenShift(4):用户及权限管理github
理解OpenShift(5):从 Docker Volume 到 OpenShift Persistent Volume数据库
理解OpenShift(6):集中式日志处理segmentfault
理解OpenShift(7):基于 Prometheus 的集群监控后端
** 本文基于 OpenShift 3.11,Kubernetes 1.11 进行测试 ***api
和日志系统同样,监控系统也是平台一大不可或缺的组成部分。在敏态的OpenShift 和 Kubernetes 平台之中,运行平台组件及业务应用的Pod 时刻都处于变化之中,并且数量可能会巨大。在这种状况下,对监控系统的要求会更高。当前,基于 Prometheus 和 Granfana 的监控系统,对于OpenShfit 和 Kubernetes 这样的平台来讲,是一个比较好的选择。可是,Prometheus 自己就至关复杂,再加上复杂的容器云平台,复杂性成倍提升。本文试着对它的原理进行梳理,但确定没法面面俱到。更多更详细的信息,还请查阅更多资料。微信
1. Prometheus 概述
关于 Prometheus 的文档很是多,这里不会详细说明,只是一个概述。网络
它是什么:
- 一个带时序数据库(TSDB)的监控系统。SoundCloud 在2012年开始开发,2015年开源,如今是 CNCF 继 Kuebernetes 以后的第二个项目。
- 经过拉取(pull)方式收集测量数据,并将其保存在TSDB 中。
- 提供计量数据查询功能,实现了相似于 SQL 的查询语法PromSQL。
- 提供告警功能,能根据已定义的告警规则向外输出告警。
- 虽然它本身实现了一个面板,但还比较简陋。如今主流的作法是将它和 Grafana 结合,由 Grafana 提供面板。
- 它不处理日志或跟踪(tracing),只处理计量数据。
- 它自己不是专门的具备良好扩展性的持久存储。它自身的存储,被设计为用于短期保存数据。
它的基本架构:
关于架构的简单说明:
- 左侧是被监控的对象(target)。若是监控对象自身提供知足Prometheus要求的测量数据的 HTTP API(好比cAdvisor,https://github.com/google/cadvisor),则能够直接和 Prometheus 对接;不然,能够借助 exporter 来实现对接(好比 node exporter,https://github.com/prometheus/node_exporter)。exporter 会从应用中获取测量数据,而后提供HTTP API,再和 Prometheus 对接。
- 中下部分是 Prometheus。它的开源项目地址是 https://github.com/prometheus。它是监控系统的中心,负责策略数据收集、存储、告警、查询等。
- 中上部分是服务发现,用于动态对象的监控。在不少现代系统中,被监控对象不是静态的,好比 K8S 中的Pod。对于动态目标,按照静态目标那种监控方式就很难了,所以 Prometheus 提供了服务发现功能。它能动态地发现被监控的对象,而后对它们作监控。
- 右上是 AlertManager。其开源项目地址是 https://github.com/prometheus/alertmanager。它接受 Prometheus 根据所配置的告警规则发过来的告警,而后作去重、分组和路由等处理,而后发给外部的接口组件,好比 PageDuty、邮件系统等。
- 右下是 Grafana。其开源项目地址是 https://github.com/grafana/grafana。它以Prometheus 为后端(它支持对接不少种后端),根据配置,从中获取数据,而后以很是漂亮的界面(Dashboard)将数据呈现出来。
网上有不少不少的关于 Prometheus 的文档,好比 https://yunlzheng.gitbook.io/prometheus-book/ 。
2. 利用 Prometheus 对 OpenShfit 集群进行监控
2.1 OpenShfit 集群的监控需求
上图整理了OpenShift 集群的监控需求。它包括两大部分:
- 一部分是对OpenShift 平台进行监控,确保它稳定运行。这是平台运维团队的需求。这部分又包括不少内容,包括节点监控(节点的CPU、内存、网络、存储等)、容器监控(每一个容器所消耗的资源,包括cpu、内存、网络、文件系统等),以及 OpenShift 核心组件等。
- 另外一部分是运行在OpenShfit 平台上的业务服务,确保业务服务稳定运行,这是应用开发和运维团队的需求。
2.2 基于 Prometheus 的 OpenShift 监控系统的实现
为了知足上述监控需求,OpenShift 提供了基于 Prometheus + Grafana 的监控系统。针对每一个须要被监控的目标(target),都利用了Prometheus提供的某个功能来实现对它的监控。
先上一张官方的架构图:
我画的逻辑图:
具体每一个部分在后文会有相关介绍。
2.3 基于 Prometheus 的 OpenShift 监控系统的部署和维护
OpenShfit 利用 ansible 在某个project(个人是 openshift-monitoring)中部署包括 Prometheus 和 Granfana 在内的监控系统。这里面主要用到两个开源项目:
- 一个是 Cluster Monitoring Operator。它的开源项目地址是 https://github.com/openshift/cluster-monitoring-operator。它负责在 OpenShfit 环境中部署基于 Prometheus 的监控系统。
- 另外一个是 Prometheus Operator。 它的开源项目地址是 https://github.com/coreos/prometheus-operator。它负责在 Kubernetes 环境中部署基于 Prometheus 的监控系统。
关于这两个 Operator 的更多信息,请查阅有关文档。下面只介绍某些重点部分。
Cluster Monitoring Operator 只是很薄的一层,可是它是入口。它的主要任务是负责把 Prometheus Operator 建立出来。
Prometheus Operator 是 CoreOS 开源的项目,它就很复杂了。如下图为参照,它负责建立和管理三种东西:
- 第一种是 Prometheus 及相关的服务。默认包括 alertmanager 服务、Prometheus 服务、Grafana 服务、kube-state-metrics 服务、node-exporter 服务。
- 第二种是4个 CRD 类型(实际上有6个,但另两个的用途不明),包括 AlterManager,Prometheus、PrometheusRule 和 ServiceMonitor。
- 每个 CRD 都是一个相似 Deployment 配置,从名字上能够看出与实体的对应关系。
- Prometheus Operator 会监控这些实例。若是发现有更改,则会对相应的实体作变动。好比若 PrometheusRule 的内容被修改,那么新的监控和告警规则会被 Prometheus 从新加载。
- 所以,定义这些 CRD 类型的目的,是为了简化对 Prometheus 系统的管理。管理员只须要对这些 CRD 实例作管理,系统就会自动对实例作变动。
- 1 个 alertmanager 实例对应 alertmanager 服务,每一个服务默认3 个副本,也就是有3个 Pod。
- 1 个 Prometheus 实例对应 Prometheus 服务,每一个服务默认2个副本,也就是有2个 Pod。
- 1 个 PrometheusRule 实例对应当前 Prometheus 实例所使用的监控和告警规则。
- 9 个 ServiceMonitor 实例,对应对 Prometheus 所监控的9个目标,这里的每一个目标都是一个 OpenShift 服务。下面会详细说明