Prometheus 在代码上就已经对 Kubernetes 有了原生的支持,可以通过服务发现的形式来自动监控集群,因此我们可以使用另外一种更加高级的方式来部署 Prometheus:Operator 框架
功能
Prometheus Operator (后面都简称 Operater) 提供如下功能:
- 创建/销毁:在 Kubernetes namespace 中更加容易地启动一个 Prometheues 实例,一个特定应用程序或者团队可以更容易使用 Operator。
- 便捷配置:通过 Kubernetes 资源配置 Prometheus 的基本信息,比如版本、存储、副本集等。
- 通过标签标记目标服务: 基于常见的 Kubernetes label 查询自动生成监控目标配置;不需要学习 Prometheus 特定的配置语言。
为什么用Prometheus Operator?
于 Prometheus 本身没有提供管理配置的 API 接口(尤其是管理监控目标和管理警报规则),也没有提供好用的多实例管理手段,因此这一块往往要自己写一些代码或脚本。但假如你还没有写这些代码,那就可以先看一下 Prometheus Operator,它很好地解决了 Prometheus 不好管理的问题。
什么是 Operator?Operator = Controller + CRD。假如你不了解什么是 Controller 和 CRD,可以看一个 Kubernetes 本身的例子:我们提交一个 Deployment 对象来声明期望状态,比如 3 个副本;而 Kubernetes 的 Controller 会不断地干活(跑控制循环)来达成期望状态,比如看到只有 2 个副本就创建一个,看到有 4 个副本了就删除一个。在这里,Deployment 是 Kubernetes 本身的 API 对象。那假如我们想自己设计一些 API 对象来完成需求呢?Kubernetes 本身提供了 CRD(Custom Resource Definition),允许我们定义新的 API 对象。但在定义完之后,Kubernetes 本身当然不可能知道这些 API 对象的期望状态该如何到达。这时,我们就要写对应的 Controller 去实现这个逻辑。而这种自定义 API 对象 + 自己写 Controller 去解决问题的模式,就是 Operator Pattern。
上图是Prometheus-Operator官方提供的架构图,其中Operator是最核心的部分,作为一个控制器,他会去创建Prometheus、ServiceMonitor、AlertManager以及PrometheusRule4个CRD资源对象,然后会一直监控并维持这4个资源对象的状态。
Prometheus: 定义一个Prometheus Server。
ServiceMonitor:就是exporter的各种抽象,exporter是用来提供专门提供metrics数据接口的工具,Prometheus就是通过ServiceMonitor提供的metrics数据接口去 pull 数据的。
Alertmanager:定义一个 Alertmanager 集群
PrometheusRule:是用来被Prometheus实例使用的报警规则文件。
总结
Prometheus Operator 干的事情其实就是平常我们用 CI 脚本、定时任务或者手工去干的事情,逻辑上很直接。它的成功在于借助 Operator 模式(拆开说就是控制循环+声明式API这两个 k8s 的典型设计模式)封装了大量的 Prometheus 运维经验,提供了友好的 Prometheus 管理接口,而这对于平台化是很重要的。另外,这个例子也可以说明,即使对 Prometheus 这样运维不算很复杂的系统,Operator 也能起到很好的效果。