4. Prometheus 架构回顾:Prometheus Server、Alertmanager、Exporters、Service Monitor 的核心组件与数据流

在深入告警规则与控制面弹性伸缩的适配之前,有必要系统回顾 Prometheus 的核心架构。理解各组件职责及数据流转路径,是后续编写适配性告警规则、设计弹性伸缩策略的基础。

4.1 核心组件一览

Prometheus 生态由四个主要组件构成,它们协同完成指标采集、存储、查询与告警触发。下表总结了各组件的定位与关键特征:

组件 核心职责 关键特征
Prometheus Server 指标拉取、存储、查询、告警评估 基于 Pull 模型;内置时序数据库(TSDB);支持 PromQL 查询;负责评估告警规则
Alertmanager 告警去重、分组、静默、路由与通知 接收来自 Prometheus Server 的告警;支持多种接收器(Email、PagerDuty、Webhook 等)
Exporters 将非原生指标转换为 Prometheus 格式 运行在被监控目标侧;暴露 /metrics 端点;常见有 node_exporter、kube-state-metrics 等
Service Monitor 定义 Prometheus 如何发现与采集服务指标 Kubernetes CRD;通过标签选择器匹配 Service;指定指标路径与端口
架构要点: Prometheus Server 是核心引擎,Exporters 是数据源头,Service Monitor 是 Kubernetes 环境下的自动发现配置层,Alertmanager 是告警生命周期的管理者。四者缺一不可。

4.2 数据流全景

下图展示了从指标产生到告警通知的完整数据流。箭头方向代表数据或事件的传递方向。

Prometheus 核心组件数据流图 Prometheus 核心组件数据流 Exporters node_exporter / kube-state-metrics Service Monitor CRD 定义采集目标 Prometheus Server 拉取 / 存储 / 查询 / 告警评估 Alertmanager 去重 / 分组 / 路由 / 通知 通知接收器 Email / Webhook / Slack Pull /metrics 服务发现配置 告警推送 通知 数据流说明: 1. Exporters 暴露 /metrics 端点,Prometheus Server 按配置周期拉取指标。 2. Service Monitor 通过标签选择器动态发现目标 Service,生成采集配置。 3. Prometheus Server 评估告警规则,满足条件时推送告警到 Alertmanager。 4. Alertmanager 对告警进行去重、分组、静默处理后,路由到对应接收器。

4.3 组件交互细节

4.3.1 Prometheus Server 内部工作流

Prometheus Server 是数据流的核心枢纽,其内部包含多个子模块:

  • 采集管理器(Scrape Manager):根据配置或服务发现结果,定期向目标端点发起 HTTP 请求,拉取指标数据。
  • 时序数据库(TSDB):将拉取到的指标按时间序列存储,支持高效压缩与查询。
  • 规则引擎(Rule Engine):周期性评估告警规则与记录规则,当告警规则表达式结果为 true 时生成告警事件。
  • 查询引擎(Query Engine):对外提供 PromQL 查询接口,支持即时查询与范围查询。

4.3.2 Alertmanager 告警生命周期

Alertmanager 接收告警后,经历以下处理阶段:

  1. 接收与去重:对相同告警名称、标签组合的重复告警进行合并。
  2. 分组(Grouping):按配置的标签(如 severity、cluster)将告警归入同一通知。
  3. 静默(Silencing):匹配静默规则,抑制特定告警的发送。
  4. 抑制(Inhibition):当高优先级告警触发时,抑制低优先级告警。
  5. 路由(Routing):根据告警标签匹配路由树,决定发送到哪个接收器。
  6. 通知(Notification):通过配置的接收器(Email、Webhook、PagerDuty 等)发送告警消息。
控制面弹性伸缩场景提示: 在控制面弹性伸缩中,Alertmanager 的分组与抑制能力尤为重要。例如,当多个控制面组件同时触发“CPU 过载”告警时,分组可以将它们合并为一条通知,避免告警风暴;抑制规则可以确保在“控制面不可用”告警触发时,抑制所有次级告警。

4.4 Service Monitor 在 Kubernetes 中的角色

Service Monitor 是 Prometheus Operator 引入的 CRD,用于声明式定义指标采集目标。其核心字段包括:

字段 作用 示例值
spec.selector 通过标签选择器匹配目标 Service app: kube-controller-manager
spec.endpoints 定义指标路径、端口、采集间隔 port: metrics, path: /metrics
spec.namespaceSelector 限定 Service 所在的命名空间 matchNames: [kube-system]

以下是一个典型的 Service Monitor 配置示例:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: kube-controller-manager
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: kube-controller-manager
  endpoints:
  - port: metrics
    interval: 30s
    path: /metrics
  namespaceSelector:
    matchNames:
    - kube-system
注意: Service Monitor 本身不采集指标,它只是为 Prometheus Server 提供“发现目标”的配置。Prometheus Server 根据 Service Monitor 生成最终的 scrape_config,然后执行拉取操作。在控制面弹性伸缩场景中,Service Monitor 的 interval 字段直接影响告警规则的评估时效性——间隔越短,告警响应越快,但资源消耗也越大。

4.5 数据流总结

将上述组件串联起来,完整的 Prometheus 数据流可以概括为以下步骤:

  1. 指标暴露:Exporters 或应用自身在 /metrics 端点暴露 Prometheus 格式指标。
  2. 服务发现:Service Monitor(或静态配置)告知 Prometheus Server 哪些目标需要采集。
  3. 指标拉取:Prometheus Server 的 Scrape Manager 按周期拉取指标并存入 TSDB。
  4. 规则评估:Rule Engine 定期执行告警规则,若条件满足则生成告警事件。
  5. 告警推送:Prometheus Server 将告警事件发送到 Alertmanager 的 API。
  6. 告警处理:Alertmanager 执行去重、分组、静默、抑制,最终路由到接收器。
  7. 通知发送:接收器(如 Webhook)将告警消息送达运维人员或自动化系统。