Prometheus定义指南之Operator

译文
开发 前端
本文将让您深入了解Prometheus Operator的工作机制,以及如何使用Prometheus Operator和Helm charts,为Kubernetes部署有关Prometheus的监控。

[[433690]]

【51CTO.com快译】本文将重点向您介绍如何使用Prometheus Operator和Helm Chart,以及如何以简单的方式在Kubernetes集群上安装和管理Prometheus。首先,让我们先了解一些与Prometheus Operator相关的基本概念。

CRD(Custom Resource Definition,定制资源定义)的方法是允许用户自定义Deployment和StatefulSet等资源类型的结构和有效性。其中,CR(Custom Resource,定制资源)是按照CRD的结构所创建的资源。而Custom Controller(定制控制器)则能够确保Kubernetes集群、或应用程序始终将其当前的状态,与我们所期望的状态相匹配。因此,Operator可以被理解为我们部署在集群中的一组Kubernetes定制控制器。它会去侦听被定制资源中,针对Kubernetes资源的创建、修改、删除等操作。您可以通过链接-- https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/,了解更多有过定制资源的相关内容。

Kubernetes Operator的用例

总的说来,Kubernetes Operator可以实现:

  • 提供一种在Kubernetes上部署有状态服务(如各种数据库)的方法
  • 处理应用程序代码的升级
  • 根据性能指标,横向扩展资源
  • 按需备份和恢复应用程序或数据库的状态
  • 向Kubernetes部署监控、存储、归档(vault)等方案

什么是Prometheus Operator?

简单来说,类似其他标准化的Kubernetes部署对象,Prometheus Operator能够以完全自动化的方式部署Prometheus服务器、Alertmanager、以及所有相关的密钥和configmap等。该方式有助于在较短几分钟内,建立出Prometheus监控系统,并实例化Kubernetes的集群监控。而在完成部署后,Prometheus Operator将具有如下功能:

  • 自动化:便捷地为Kubernetes的命名空间、特定的应用或团队启动Prometheus实例。
  • 服务发现:无需额外学习Prometheus的特定配置语言,便可使用熟悉的Kubernetes标签,自动发现有待监控的目标。
  • 轻松配置:可管理Prometheus的版本、持久性、留存策略、以及来自Kubernetes资源的副本等基本资源的相关配置。

安装Prometheus栈的方法

在Kubernetes中设置Prometheus监控栈有如下三种不同的方法:

1.自行创造一切

如果您已准备好了Prometheus组件、及其先决条件,则可以通过参考其相互之间的依赖关系,以正确的顺序为Prometheus、Alertmanager、Grafana的所有密钥、以及ConfigMaps等每个组件,手动部署YAML规范文件。这种方法通常非常耗时,并且需要花费大量的精力,去部署和管理Prometheus生态系统。同时,它还需要构建强大的文档,以便将其复制到其他环境中。

2. 使用Prometheus Operator

既然前文提到了Prometheus Operator能够管理Prometheus所有组件的生命周期,那么我们可以参考链接--https://github.com/prometheus-operator/prometheus-operator,据此在Kubernetes集群中部署Prometheus。

3. 使用Helm Chart部署Operator

作为一种更好、更高效的方式,我们可以使用由Prometheus社区维护的Helm Chart,来部署Prometheus Operator。概括地说,Helm会随着Prometheus、Alertmanager和其他定制资源的创建,进行Prometheu Operator的初始化安装。然后,Prometheus Operator会管理这些定制资源的整个生命周期。其安装步骤如下:

  1. Go  
  2. helm repo add prometheus-community https://prometheus-community.github.io/helm-charts  
  3. helm repo update  
  4. helm install prometheus prometheus-community/kube-prometheus-stack 

此处的kube-Prometheus-stack安装了以下组件:

  • Prometheus Operator
  • 创建Prometheus、Alertmanager、以及相关的CR
  • Grafana
  • 各种节点导出器

它们还预先配置了针对协同工作、以及为您设置了基本集群的监控,以方便您轻松地调整和添加各种自定义。上述命令的执行速度非常快,只需几分钟便可启动并运行所有的组件。

您可以通过“helm get manifestPrometheus| kubectl get -f –”命令,来查看创建的所有对象。

如上所图示,您将能够看到Prometheus栈的Deployments和StatefulSet等所有不同的资源。

Prometheus如何找到所有监控项并抓取的目标?

为了让Prometheus发现待监控的对象,我们需要传递一个被称为prometheus.yaml的YAML(配置文件,以便Prometheus可以参考并实施监控。每个待监控的目标端点都在prometheus.yaml中的scrape_configs部分下被定义。下面展示了Prometheus release tar中自带的典型配置文件的内容:

  1. Go
  2. # my global config 
  3. global
  4.   scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute
  5.   evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute
  6.   # scrape_timeout is set to the global default (10s). 
  7.  
  8. # Alertmanager configuration 
  9. alerting: 
  10.   alertmanagers: 
  11.   - static_configs: 
  12.     - targets: 
  13.        - localhost:9093 
  14.  
  15. Load rules once and periodically evaluate them according to the global 'evaluation_interval'
  16. rule_files: 
  17.   - '/etc/prometheus/alert.rules' 
  18.      
  19.   # - "first_rules.yml" 
  20.   # - "second_rules.yml" 
  21.  
  22. # A scrape configuration containing exactly one endpoint to scrape: 
  23. # Here it's Prometheus itself. 
  24. scrape_configs: 
  25.   # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. 
  26.   - job_name: 'prometheus' 
  27.  
  28.     # metrics_path defaults to '/metrics' 
  29.     # scheme defaults to 'http'
  30.  
  31.     static_configs: 
  32.       - targets: ['localhost:9090'
  33.  
  34.   - job_name: 'node_exporter' 
  35.     scrape_interval: 5s 
  36.     static_configs: 
  37.       - targets: ['localhost:9100']     

下面,让我们深入了解prometheus.yaml文件中的一些主要关键术语。其中,我们可以通过如下两种方式,为Prometheus指定目标端点集合:

  • scrape_config通过指定一组目标和配置参数,来描述如何抓取他们。也就是说,在prometheus.yaml文件中,我们需要针对每个目标定义一个抓取配置块。
  • ServiceMonitor则让我们以Kubernetes原生的方式,轻松地在scrape_config中创建一个作业条目。在内部,Prometheus Operator将配置从每个 ServiceMonitor资源转换为prometheus.yaml的scrape_config部分。由kube-prometheus-stack创建的Prometheus资源带有一个选择器,可以对所有带有标签release: prometheus(请参见配置)的ServiceMonitor进行各项操作。下图展示了其工作原理:

图片来源:CoreOS(https://www.openshift.com/blog)

让我们以Prometheus服务本身为例,查看ServiceMonitor能否自动在Prometheus配置文件中创建了一个scrape_config条目。

  1. Go 
  2. kubectl get services prometheus-prometheus-oper-prometheus -o wide --show-labels  
  3. NAME                                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE   SELECTOR                                                          LABELS 
  4. prometheus-prometheus-oper-prometheus   ClusterIP   10.105.67.172   <none>        9090/TCP   12d   app=prometheus,prometheus=prometheus-prometheus-oper-prometheus   app=prometheus-operator-prometheus,release=prometheus,self-monitor=true 

根据上述代码,我们进而可以查看相应的ServiceMonitor是否已为Prometheus的服务准备就绪。

  1. Go 
  2. kubectl get servicemonitors.monitoring.coreos.com -l app=prometheus-operator-prometheus 
  3. NAME                                    AGE 
  4. prometheus-prometheus-oper-prometheus   12d 

上述代码证实了Prometheus服务本身ServiceMonitor的存在性。下面,让我们检查“prometheus-prometheus-oper-prometheus”是否已在Prometheusconfig YAML文件中添加了一个作业。我们首先需要访问由Prometheus Operator创建的Prometheuspod。

  1. Go 
  2. kubectl exec -it prometheus-prometheus-prometheus-oper-prometheus-0 -- /bin/sh 
  3. /prometheus $  

让我们通过如下代码找出pod内由Prometheus使用的配置文件名。

  1. Go 
  2. /prometheus $ ps 
  3.  
  4. PID   USER     TIME  COMMAND 
  5. 1     1000      4h58 /bin/prometheus … --config.file=/etc/prometheus/config_out/prometheus.env.yaml 
  6. 59    1000      0:00 /bin/sh 

从上述代码可知,由Operator创建的配置文件prometheus.env.yaml可以被Prometheus服务器用于查找待监控和抓取的目标端点。最后,让我们检查Prometheus服务本身的作业是否已被ServiceMonitor添加到了该配置文件中:

  1. Go 
  2. /Prometheus $  cat  / etc /Prometheus/ config_out /Prometheus。ENV 。yaml  |  grep  - i  - A  10  "job_name: default/prometheus-prometheus-oper-prometheus/0" ​ 
  3.  
  4. Go 
  5. - job_name: default/prometheus-prometheus-oper-prometheus/0 
  6.   honor_labels: false 
  7.   kubernetes_sd_configs: 
  8.   - role: endpoints 
  9.     namespaces: 
  10.       names: 
  11.       - default 
  12.   metrics_path: /metrics 

由上述代码可知,ServiceMonitor会自动为基于Kubernetes的服务创建一个待监控和抓取的作业。

此外,我们也可以直接在Prometheus Web UI中的Status -> Configuration下查看scrape_config的方法。如下图所示:

除了ServiceMonitor之外,我们也可以使用PodMonitor方法去抓取Kubernetes pod,并由Prometheus Operator处理定制的资源。PodMonitor能够以声明的方式,指定如何直接监控一组Pod。

您一定会问,既然我们有了ServiceMonitor,为何还需要PodMonitor呢?其主要原因是,ServiceMonitor合适那些Pod里已经有某个服务(Service)的场景。否则,您需要用到PodMonitor。通常,Prometheus可以被配置为如下两种方式,去定义待监控的目标端点。

  • 使用static_config机制

如果待监控的Kubernetes服务/端点非常小且固定,那么您可以使用prometheus.yaml文件中的static_config来定义这些静态端点。示例链接展示了如何通过配置Prometheus,以默认使用static_configs来监控本身。

当然,这主要适用于简单的用例,而且需要在添加和删除节点时,手动更新prometheus.yml。而在Kubernetes之类的动态环境中,新的应用服务实例往往会出现得快而频繁。

  • 使用service_discovery机制

目前,支持Prometheus的服务发现机制有:DNS、Kubernetes、AWS、Consul、以及其他自定义的类型。这些机制通常能够动态地发现待监控和抓取的目标端点。对于Kubernetes而言,它可以使用Kubernetes API来实现。示例链接展示了如何为Kubernetes配置Prometheus。其中,Prometheus Operator负责根据ServiceMonitor和PodMonitor资源完成上述配置。

Prometheus的规则

您可以创建一个包含规则语句的YAML文件,并使用Prometheus-configuration中的rule_files字段,将它们加载到Prometheus中。而在使用Prometheus Operator时,您可以使用PrometheusRule源的Helm,创建相应的规则。目前,Prometheus可以定期配置和评估如下两种类型的规则:

  • 记录(Recording)规则

记录规则允许您预先计算出经常使用的PromQL表达式,并且需要相对大量的步骤,来实现表达式的结果。据此,在下一次运行相同的PromQL查询时,您可以直接从预先计算出的PromQL结果中获取到。这比反复执行相同的查询要快得多。例如:

  1. Go 
  2. groups: 
  3.   - name: example 
  4.     rules: 
  5.     - record: job:http_inprogress_requests:sum 
  6.       expr: sum by (job) (http_inprogress_requests) 
  • 警报(Alerting)规则

警报规则允许您根据PromQL定义的警报条件,将有关触发警报的通知,发送到外部接收器上。只要警报表达式的结果为True时,就会发送警报。例如:

  1. Go 
  2. groups: 
  3. name: example 
  4.   rules: 
  5.   - alert: HighRequestLatency 
  6.     expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5 
  7.     for: 10m 
  8.     labels: 
  9.       severity: page 
  10.     annotations: 
  11.       summary: High request latency 

警报和可视化

图片来源:Prometheus的介绍(https://www.youtube.com/watch?v=9GMWvFcQjYI&t=314s)

在配置了警报规则后,我们需要通过Alertmanager来添加警报摘要、控制、甚至将收到的通知“静音”。如上图所示,Alertmanager会定期从Prometheus服务器处接收有关警报状态的信息,以确保对已定义的接收者(如电子邮件、PagerDuty等)进行分组、数据去重、以及通知发送。

我们不必担心在何处、以及如何在Kubernetes集群中定义或设置Alertmanager。我们之前在Helm Chart的帮助下部署Prometheus Operator时,已经创建了一个作为StatefulSet的Alertmanager。请参见如下代码:

  1. Go 
  2. kubectl get statefulsets.apps  
  3.  
  4. NAME                                                    READY      AGE 
  5. alertmanager-prometheus-prometheus-oper-alertmanager    1/1         8d 

Alertmanager StatefulSet会在内部使用一个配置文件--alertmanager.yaml。我们可以将它放入alertmanagerpod中。请参见如下命令:

  1. Go 
  2. /bin/alertmanager --config.file=/etc/alertmanager/config/alertmanager.yaml 

alertmanager.yaml文件包含了如下关键元素:

  • 路由:这是一个代码块,可用于定义将警报路由到下一个位置。
  • 接收器:接收器是可用来发送或通知警报的网络钩子、邮件地址、以及PagerDuty之类的工具。
  • 禁止规则:禁止规则部分可以在另一个警报因相同原因被触发时,使之“静音”。例如,对于那些已经处于critical级别的应用服务,即便再次出现故障,其警告通知也会被静音。

我们可以通过如下示例来查看Alertmanager的配置文件:

  1. Go 
  2. global
  3.   resolve_timeout: 5m 
  4.  
  5. route: 
  6.   group_by: ['alertname'
  7.   group_wait: 10s 
  8.   group_interval: 10s 
  9.   repeat_interval: 1h 
  10.   receiver: 'web.hook' 
  11. receivers: 
  12. name'web.hook' 
  13.   webhook_configs: 
  14.   - url: 'http://127.0.0.1:5001/' 
  15. inhibit_rules: 
  16.   - source_match: 
  17.       severity: 'critical' 
  18.     target_match: 
  19.       severity: 'warning' 
  20.     equal: ['alertname''dev''instance'

使用Grafana进行指标可视化

作为一种标准化工​​具,Grafana可以帮助您可视化那些在Prometheus的帮助下,收集到的所有指标。kube-Prometheus-stack的Helm Chart已经为我们部署了Grafana。我们可以通过如下命令,定位Grafana服务。

  1. Go 
  2. kubectl get services  
  3.  
  4. NAME                               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                       
  5.  
  6. prometheus-grafana                ClusterIP    10.104.143.147    <none>       80/TCP       

通过如下代码,我们可以将端口转发到此服务上,以便显示在Grafana的Web界面上。

  1. Go 
  2. kubectl port-forward svc/prometheus-grafana 3000:80 
  3.  
  4. Forwarding from 127.0.0.1:3000 -> 3000 
  5. Forwarding from [::1]:3000 -> 3000 

如下图,您可以在浏览器中访问http://localhost:3000。

在输入了默认用户名:admin和密码:prom-operator后,您可以访问到Grafana仪表板,如下图所示。

依次点击Dashboard -> Manage,您将能够看到由kube-prometheus-stack提供的有关Kubernetes集群的所有仪表板:

您可以浏览到诸如“Kubernetes/Compute Resources/Pod”等仪表板信息:

上面展示的标准化仪表板便是从kubernetes-mixin项目生成的。

小结

综上所述,我们讨论了Prometheus Operator是什么,如何在Prometheus Operator和Helm Chart的帮助下轻松地配置Prometheus,Prometheus如何发现带监控的资源,以及该如何配置Prometheus的各个组件与运作机制。此外,我们还探讨了如何设置警报,以及如何将它们可视化。

原文标题:Prometheus Definitive Guide: Prometheus Operator,作者:Ninad Desai

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

责任编辑:华轩 来源: 51CTO
相关推荐

2020-12-14 10:26:48

Prometheus 监控Services

2011-12-05 15:02:21

Knockout

2021-05-28 08:58:41

Golang网卡metrics

2023-03-26 08:41:37

2020-11-26 09:10:36

Prometheus

2021-03-26 20:37:14

Prometheus监控指标

2020-12-28 10:13:32

运维Prometheus监控

2020-12-30 08:09:46

运维Prometheus 监控

2024-01-01 21:57:41

kubernetesCRDOperator

2020-05-21 11:38:10

监控系统架构技术

2023-10-09 08:12:00

2009-12-30 17:29:53

Silverlight

2020-12-29 10:45:22

运维Prometheus-监控

2023-04-26 00:01:04

2014-11-10 15:02:21

大数据云计算Hadoop

2022-07-11 13:43:51

Prometheus监控

2021-06-10 07:49:26

RPCgRPC模式

2021-07-07 05:46:46

运维监控Prometheus

2011-08-24 14:35:33

DROP OPERAT中文man

2023-11-10 15:05:08

Kubernetes云计算
点赞
收藏

51CTO技术栈公众号