Prometheus是一个简单而有效的开源监控系统。在我们发表《用Prometheus监控微服务》一文后的几年里,该系统已经从云原生计算基金会(CNCF)毕业,成为分布式系统的首选监控工具。正如我们在之前的文章中提到的,其中一个原因是其直观的简单性。它并不试图做任何花哨的事情。它提供了一个数据存储、数据搜刮器、警报机制和一个非常简单的用户界面。
部署Prometheus和相关的Alertmanger工具可能是一项复杂的任务,但有一些工具可以简化和自动化这一过程,比如Prometheus Operator项目。
在这篇博文中,我们将解释一般情况下什么是操作员,Prometheus操作员如何工作,以及如何配置它以最佳方式使用Prometheus和Alertmanager。
操作员
正如我们的文章《Kubernetes运营商解释》中所说,运营商是Kubernetes的一种软件扩展。它们提供了一种一致的方法来自动处理所有应用程序的操作过程,而不需要任何人工干预,它们通过与Kubernetes API密切合作来实现。
操作员是建立在Kubernetes的两个关键原则之上。自定义资源(CR),在这里通过自定义资源定义(CRD)和自定义控制器的方式实现。CR是Kubernetes API的一个扩展,它提供了一个可以存储和检索结构化数据的地方--应用程序的理想状态。自定义控制器用于观察这个CR,并利用收到的信息采取行动,将Kubernetes集群调整到所需状态。
普罗米修斯操作员
这个操作员的主要目的是简化和自动配置和管理运行在Kubernetes集群上的Prometheus监控栈。从本质上讲,它是一个自定义的控制器,可以监控通过以下CRD引入的新对象类型。
- Prometheus:将所需的Prometheus部署定义为一个StatefulSet
- Alertmanager:定义了一个所需的Alertmanager部署
- ServiceMonitor:声明性地指定应如何监控Kubernetes服务组。
- PodMonitor:声明性地指定应如何监控pod群组
- Probe:声明性地指定应如何监控入口或静态目标组。
- PrometheusRule:定义了一套所需的Prometheus警报和/或记录规则
- AlertmanagerConfig:声明性地指定Alertmanager配置的子段
为什么使用普罗米修斯操作符
如前所述,使用操作员可以大大减少配置、实施和管理普罗米修斯监控堆栈的所有组件的工作量。它还可以提供资源的动态更新,如警报和/或普罗米修斯规则,而不需要停机。
使用引入的CRD是相对直接的,是采用该堆栈的操作最佳实践的交钥匙解决方案。此外,这种方法使运行多个实例成为可能,甚至可以使用不同版本的普罗米修斯。
使用普罗米修斯操作员
先决条件
要遵循本文章中的例子,必须满足以下要求。
- Kubernetes集群。出于测试目的,我们建议使用Kind来运行一个使用Docker容器的本地集群,Minikube也可以作为一种选择
kubectl
命令行工具:安装并配置好,以便连接到集群上- 一个暴露普罗米修斯指标的网络应用。我们使用的是microservices-demo,它模拟了一个电子商务网站面向用户的部分,并为每个服务暴露了一个
/metrics
端点。按照文档的要求,在集群上部署它
部署运营商
我们首先将普罗米修斯操作员部署到集群中。我们必须创建所有 CRD,定义用于配置监控栈的 Prometheus、Alertmanager 和 ServiceMonitor 抽象,以及 Prometheus Operator 控制器和服务。
这可以使用 Prometheus Operator GitHub 仓库中的bundle.yaml
文件完成。
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/master/bundle.yaml
首先我们验证所有的 CRD 是否已经创建。
kubectl get crds
输出结果应该与此类似。