云原生监控Prometheus基本概念
十八岁
云原生监控Prometheus介绍
一、什么是Prometheus
Prometheus 是一个开源的系统监控和告警工具包。它最初是由 SoundCloud 开发的,目前已经成为云原生计算基金会(CNCF)的第二个毕业项目(仅次于 Kubernetes)。
主要特点包括:
- 多维度数据模型
- 时间序列数据由指标名称和键值对标签组成
- 支持灵活的查询语言 PromQL
- 数据收集
- 通过 HTTP 协议采用 pull 模型拉取数据
- 支持 push 网关来接收短期任务的数据推送
- 支持服务发现和静态配置
- 数据存储
- 使用本地时序数据库存储监控数据
- 高效的数据压缩算法
- 支持数据的长期存储
- 可视化
- 内置简单的图形界面
- 可以与 Grafana 等工具集成实现更强大的可视化
- 告警
- 支持灵活的告警规则配置
- 通过 Alertmanager 组件统一处理告警
二、Prometheus架构解析

1. Prometheus Server-核心组件
- 核心功能:Prometheus Server 是整个监控系统的核心,用于从不同的目标(targets)拉取指标数据,存储在时间序列数据库(TSDB)中,并提供查询接口。
- 主要组件
- Retrieval:检索模块,负责从配置的监控目标(如 exporters)中定期拉取(pull)指标数据。
- TSDB(Time Series Database):时间序列数据库,用于存储拉取到的监控数据。
- HTTP Server:提供 HTTP API 接口服务 和 Prometheus 查询语言(PromQL)接口,用户和其他服务可以通过它访问数据和执行查询。
- 数据存储:Prometheus 通过本地磁盘(如 HDD/SSD)来存储数据。
2. Prometheus Targets-数据采集层
- 定义:Prometheus 通过拉取(pull)的方式从不同的监控目标(Targets)收集数据。Targets 包括各种可以提供 Prometheus 格式指标数据的进程或服务。
- Jobs 和 Exporters:这些目标可能是应用的实例(称为 Jobs),也可以是特定的 Exporters,如 Node Exporter(收集操作系统数据)或其他第三方导出器。
- 数据拉取方式:Prometheus Server 定期从这些目标拉取数据,以便获得最新的监控指标。
3. Pushgateway-数据采集层
- 作用:Pushgateway 用于接收短生命周期任务的指标数据。某些任务可能只运行一次或持续时间很短(例如批处理任务),如果直接被 Prometheus 拉取,可能无法及时捕获这些任务的状态。Pushgateway 允许这些任务在退出时推送数据,保证 Prometheus Server 能拉取到这些数据。
- 数据流向:短生命周期任务在结束时向 Pushgateway 推送数据,Prometheus Server 再从 Pushgateway 拉取这些数据。
4. Service Discovery-服务发现
支持两种主要的服务发现方式:
kubernetes: 自动发现 K8s 集群中的监控目标
file_sd: 基于文件的服务发现机制
作用:Prometheus 使用服务发现机制动态发现需要监控的目标。常见的服务发现方式包括 Kubernetes API、静态文件配置(file_sd)等。
Kubernetes Integration:对于 Kubernetes 环境,Prometheus 可以直接通过 Kubernetes API 动态发现 Pod、Service 等资源,实现自动化监控。
5. Alertmanager-告警模块
- 作用:Prometheus 中的 Alertmanager 负责处理由 Prometheus Server 生成的告警。Prometheus 使用预先定义的告警规则来触发告警事件(例如某些指标超过阈值)。
- 告警推送:Prometheus Server 会根据配置的告警规则将告警推送给 Alertmanager。Alertmanager 负责对告警进行分组、去重、抑制等操作,并根据配置发送到不同的通知渠道。
- 通知渠道:Alertmanager 可以将告警通过 Email、PagerDuty 或其他集成工具发送给运维团队。
6. 数据可视化与查询接口(图右下部分)
PromQL: Prometheus 的查询语言
- Prometheus Web UI:Prometheus 自带的 Web UI 提供了一些基本的可视化和查询功能,用户可以通过 PromQL 执行查询,并查看实时数据。
- Grafana:更高级的可视化需求通常会借助 Grafana,它可以直接查询 Prometheus 数据,并提供丰富的图表选项和可定制的仪表板。
- API Clients:Prometheus 提供 HTTP API,使得外部应用或脚本可以直接查询 Prometheus 中的数据,以实现自定义分析或集成需求。
7. 数据流向总结
Pull 模式:
- Prometheus server 主动从 targets 拉取数据
- 从 Pushgateway 拉取短期任务的数据
- Pull 模式:Prometheus 的默认数据采集模式是从 Targets 拉取数据,Prometheus Server 定期访问每个目标的 HTTP 指标端点,获取并存储指标。
Push 模式:
告警流:
- Prometheus Server 通过配置的告警规则触发告警事件,将其推送给 Alertmanager。Alertmanager 处理告警并发送给指定的通知系统(如 Email、PagerDuty)。
总结
Prometheus 架构的关键在于「拉取模式」的数据采集、「时间序列数据库」的数据存储、「告警管理」的处理方式和「数据可视化」的整合。这个设计使得 Prometheus 在云原生环境中具备了高效、自动化、动态监控的能力,并且与 Kubernetes 等系统无缝集成。
三、Prometheus常见的自定义资源
在 Kubernetes 环境中部署 Prometheus 时,常见的自定义资源(CRD,Custom Resource Definitions)通常是 Prometheus Operator 提供的。它们主要是为了让 Prometheus 在 K8s 上能自动化地配置和管理,而不是让你每次都手动写繁琐的配置文件。
- Prometheus:定义并部署一个或多个 Prometheus 实例,也就是监控系统本身。
- Alertmanager:定义并部署 Alertmanager 实例,他负责接受Prometheus 发送的告警,并根据规则将告警通过钉钉、邮件、企业微信等通知到相关人员。
- ServiceMonitor:告诉 Prometheus “去监控这个 Service 的指标”,只适用于 Kubernetes 内部服务。
- PodMonitor:与 ServiceMonitor 类似,当服务没有 Service(比如直接通过 Pod IP 访问),就用它来监控单个 Pod。
- Probe:通常用于定义监控静态目标,和BlackBox Exporter配合使用,监控官网是否能访问。
- ScrapeConfig:用于自定义监控目标,通常用于抓取Prometheus集群外部的目标数据。
- AlertmanagerConfig:用于定义Alertmanager 的配置,告诉 Alertmanager 如何处理告警(路由、分组、抑制规则等)。
- PrometheusRule:定义告警规则,也就是告诉 Prometheus “什么时候该报警”(比如阈值、持续时间)。
1.Prometheus资源配置详解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| apiVersion: monitoring.coreos.com/v1 kind: Prometheus metadata: name: prometheus namespace: monitoring spec: replicas: 3 image: quay.io/prometheus/prometheus:v3.1.0 serviceAccountName: prometheus alerting: alertmanagers: - namespace: monitoring name: alertmanager-main apiVersion: v2 port: web resources: requests: memory: 400Mi cpu: 100m limits: memory: 800Mi cpu: 200m nodeSelector: kubernetes.io/os: linux storage: volumeClaimTemplate: spec: storageClassName: fast-ssd resources: requests: storage: 20Gi serviceMonitorSelector: matchLabels: app: prometheus podMonitorSelector: matchLabels: app: prometheus ruleSelector: matchLabels: app: prometheus securityContext: fsGroup: 2000 runAsNonRoot: true runAsUser: 1000 retention: "30d" retentionSize: "15GB" portName: web evaluationInterval: 30s scrapeInterval: 30s
|
2.Alertmanager资源配置详解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| apiVersion: monitoring.coreos.com/v1 kind: Alertmanager metadata: name: alertmanager namespace: monitoring labels: app: alertmanager app.kubernetes.io/name: alertmanager app.kubernetes.io/component: alerting app.kubernetes.io/part-of: monitoring app.kubernetes.io/instance: k8s app.kubernetes.io/version: 0.23.0 spec: replicas: 3 image: quay.io/prometheus/alertmanager:v0.23.0 nodeSelector: kubernetes.io/os: linux
|
3.ServiceMonitor资源配置详解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: grafana-monitor namespace: monitoring labels: app.kubernetes.io/name: servicemonitor app.kubernetes.io/component: microservice-monitor app.kubernetes.io/part-of: monitoring app.kubernetes.io/version: 1.0.0 spec: selector: matchLabels: app.kubernetes.io/name: grafana endpoints: - port: app-metrics path: /actuator/prometheus interval: 30s scrapeTimeout: 10s
|
4.PodMonitor资源配置详解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: myapp-pod-monitor namespace: monitoring labels: app.kubernetes.io/name: podmonitor app.kubernetes.io/component: app-metrics app.kubernetes.io/part-of: monitoring app.kubernetes.io/version: 1.0.0 spec: selector: matchLabels: app: myapp namespaceSelector: matchNames: - prod podMetricsEndpoints: - port: metrics path: /metrics interval: 30s scrapeTimeout: 10s scheme: http
|
5.Probe
在 Prometheus Operator 中,Probe 用来监控非 K8s Service 的目标,例如外部 HTTP 服务、TCP 端口探活等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| apiVersion: monitoring.coreos.com/v1 kind: Probe metadata: name: external-probe-example namespace: monitoring labels: app.kubernetes.io/name: probe app.kubernetes.io/component: monitoring app.kubernetes.io/part-of: prometheus spec: jobName: probe-external-example interval: 30s scrapeTimeout: 10s prober: url: http://blackbox-exporter.monitoring.svc:9115 scheme: http module: http_2xx targets: staticConfig: static: - https://www.google.com - https://www.github.com
|
在 Prometheus Operator 中,一个 Probe 只能对应 一个探测任务(它只有一个 prober、一个 module)。
所以如果想同时探测 HTTP 服务 和 TCP 端口(比如 Redis、MySQL),需要为它们分别定义 多个 Probe 资源。
示例:增加 Redis 和 MySQL 的探测
需要写 3 个探测任务:
- HTTP 探测(外部网站)
- Redis 探测(TCP 6379 端口)
- MySQL 探测(TCP 3306 端口)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
apiVersion: monitoring.coreos.com/v1 kind: Probe metadata: name: probe-http-external namespace: monitoring spec: jobName: probe-http-external interval: 30s scrapeTimeout: 10s prober: url: blackbox-exporter.monitoring.svc:9115 scheme: http module: http_2xx targets: staticConfig: static: - https://www.google.com - https://www.github.com
---
apiVersion: monitoring.coreos.com/v1 kind: Probe metadata: name: probe-redis namespace: monitoring spec: jobName: probe-redis interval: 30s scrapeTimeout: 5s prober: url: blackbox-exporter.monitoring.svc:9115 scheme: http module: tcp_connect targets: staticConfig: static: - redis-service.default.svc.cluster.local:6379 - 192.168.1.10:6379
---
apiVersion: monitoring.coreos.com/v1 kind: Probe metadata: name: probe-mysql namespace: monitoring spec: jobName: probe-mysql interval: 30s scrapeTimeout: 5s prober: url: blackbox-exporter.monitoring.svc:9115 scheme: http module: tcp_connect targets: staticConfig: static: - mysql-service.default.svc.cluster.local:3306 - 192.168.1.20:3306
|
6.ScrapeConfig
ScrapeConfig 和 ServiceMonitor / PodMonitor 的区别在于:
- ServiceMonitor / PodMonitor / Probe → 针对 Kubernetes 应用、Pod、外部探测,算是“高级抽象”。
- ScrapeConfig → 原生 Prometheus 的
scrape_configs 的 CRD 版本,灵活度高,可以配置任何 Prometheus 支持的采集方式(包括文件发现、Consul、静态目标等)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| apiVersion: monitoring.coreos.com/v1alpha1
kind: ScrapeConfig
metadata: name: redis-exporter-scrape namespace: monitoring labels: app.kubernetes.io/name: scrapeconfig app.kubernetes.io/component: monitoring app.kubernetes.io/part-of: prometheus
spec: jobName: redis-exporter scrapeInterval: 30s scrapeTimeout: 10s honorLabels: true scheme: http metricsPath: /scrape staticConfigs: - targets: - redis://redis.default:6379 labels: env: prod exporter: redis relabelings: - sourceLabels: [__address__] targetLabel: __param_target - sourceLabels: [__param_target] targetLabel: instance - targetLabel: __address__ replacement: redis-exporter.monitoring:9121
|
7.AlertmanagerConfig
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| apiVersion: monitoring.coreos.com/v1alpha1 kind: AlertmanagerConfig metadata: name: alertmanager-config-example namespace: monitoring spec: route: receiver: default-receiver groupBy: ['alertname', 'severity'] groupWait: 30s groupInterval: 5m repeatInterval: 3h routes: - matchers: - name: severity value: critical matchType: = receiver: critical-receiver continue: false
receivers: - name: default-receiver emailConfigs: - to: ops-team@example.com from: alertmanager@example.com smarthost: smtp.example.com:587 authUsername: alertmanager@example.com authPassword: name: smtp-secret key: password
- name: critical-receiver webhookConfigs: - url: 'http://alert-webhook-service.monitoring.svc:8080/' sendResolved: true
|
8.PrometheusRule
PrometheusRule 是 Prometheus Operator 提供的一种 CRD,用于集中管理告警规则(alerting rules)和录制规则(recording rules)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: example-prometheus-rules namespace: monitoring labels: role: alert-rules prometheus: k8s spec: groups: - name: example.rules interval: 30s rules: - alert: HighErrorRate expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.05 for: 10m labels: severity: warning annotations: summary: "High error rate detected" description: "More than 5% of requests are failing with 5xx errors on {{ $labels.job }} for 10m."
|
9.Prometheus资源分类
安装:Operator、Prometheus、Alertmanager、Grafana
监控:ServiceMonitor、Probe、PodMonitor、ScrapeConfig
告警:PrometheusRule
通知:AlertmanagerConfig