3. Prometheus 架构回顾:核心组件与数据流
在深入基于 Prometheus 数据驱动的控制面弹性伸缩测试验证之前,有必要系统回顾 Prometheus 的整体架构。理解各组件职责及数据流转路径,是后续设计压测场景、配置指标采集、验证伸缩策略的基础。
3.1 核心组件一览
Prometheus 生态由四个核心组件构成,它们各司其职,共同完成指标的采集、存储、告警与推送。
| 组件 | 职责 | 部署形态 | 关键特性 |
|---|---|---|---|
| Prometheus Server | 指标拉取、存储、查询、告警规则评估 | 中心化服务,通常以 StatefulSet 部署 | Pull 模型、TSDB、PromQL、内置 Alertmanager 集成 |
| Exporter | 将应用/系统指标转换为 Prometheus 格式 | Sidecar 或 DaemonSet,与被监控对象同生命周期 | HTTP /metrics 端点、官方/社区/自定义实现 |
| Pushgateway | 接收短生命周期任务的指标推送 | 独立 Service,作为指标 | Push 模型、支持批处理/定时任务指标收集 |
| Alertmanager | 告警去重、分组、静默、路由与通知 | 独立 Deployment,可高可用部署 | 分组抑制、静默规则、多接收器(Slack/PagerDuty/Webhook) |
架构要点:Prometheus Server 是核心,Exporter 是数据源,Pushgateway 是补充通道,Alertmanager 是告警出口。在弹性伸缩场景中,Prometheus Server 的指标查询性能直接影响 HPA 的决策时效。
3.2 数据流全景
下图展示了 Prometheus 生态中从指标产生到告警通知的完整数据流。理解这条链路,有助于定位伸缩延迟的瓶颈。
3.3 组件交互细节
3.3.1 Prometheus Server:Pull 模型与 TSDB
- 服务发现:通过 Kubernetes API、Consul、文件等方式动态发现目标端点。
- 指标拉取:按配置的
scrape_interval(默认 15s)向 Exporter 的/metrics发起 HTTP GET 请求。 - 时序存储:将拉取到的样本写入本地 TSDB,按 2 小时 block 组织,支持压缩与保留策略。
- 查询引擎:提供 PromQL 接口,供 Grafana、HPA 等消费端查询聚合指标。
3.3.2 Exporter:指标适配器
- 官方 Exporter:node_exporter(主机指标)、kube-state-metrics(K8s 对象指标)、cadvisor(容器指标)。
- 自定义 Exporter:通过 Client Library(Go/Java/Python)暴露业务指标,如请求量、队列深度、gRPC 延迟。
- 数据格式:遵循 Prometheus 文本格式,支持 Counter、Gauge、Histogram、Summary 四种指标类型。
3.3.3 Pushgateway:弥补 Pull 模型的不足
- 适用场景:批处理任务、CronJob、短生命周期容器,这些任务在运行结束后无法被 Pull。
- 工作方式:任务结束时通过 HTTP POST 将指标推送到 Pushgateway,Prometheus Server 再定期从 Pushgateway 拉取。
- 注意事项:Pushgateway 是单点,指标不会自动过期,需手动清理或设置
push_timeout_seconds。
3.3.4 Alertmanager:告警生命周期管理
- 告警触发:Prometheus Server 评估告警规则,当表达式持续满足阈值时,将告警发送至 Alertmanager。
- 分组与抑制:按标签分组,避免告警风暴;支持抑制规则,如已触发严重告警则静默同类警告。
- 路由与通知:根据告警标签匹配路由树,发送至 Slack、Email、PagerDuty 或自定义 Webhook。
弹性伸缩关联:在控制面弹性伸缩测试中,Prometheus Server 的 scrape 延迟和 TSDB 查询性能直接影响 HPA 的指标获取时效。建议将
scrape_interval 设置为 10s 或更低,并监控 prometheus_tsdb_head_series 和 prometheus_engine_query_duration_seconds 以评估 Server 负载。
3.4 数据流时序图
以下时序图展示了从指标产生到 HPA 触发伸缩的完整数据流,帮助理解各组件间的调用关系与延迟分布。
3.5 关键配置示例
以下是一个典型的 Prometheus 配置片段,展示了如何定义 scrape 任务、告警规则以及 Alertmanager 集成。
# prometheus.yml 核心配置
global:
scrape_interval: 15s # 全局拉取间隔
evaluation_interval: 15s # 告警规则评估间隔
scrape_configs:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- job_name: 'pushgateway'
honor_labels: true
static_configs:
- targets: ['pushgateway.monitoring.svc.cluster.local:9091']
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager.monitoring.svc.cluster.local:9093']
rule_files:
- 'alerts/*.yml'
注意:在弹性伸缩测试中,建议将
scrape_interval 和 evaluation_interval 统一设置为 10s,以减少指标采集与告警评估之间的时间差。同时,监控 prometheus_target_scrapes_exceeded_sample_limit_total 指标,防止因目标返回过多样本导致采集失败。
3.6 本章小结
- Prometheus 采用 Pull 模型为主,Pushgateway 作为补充,适合云原生动态环境。
- Exporter 是指标适配层,负责将系统/应用指标标准化。
- Alertmanager 提供告警生命周期管理,避免告警风暴。
- 在弹性伸缩场景中,scrape 周期、PromQL 查询延迟、HPA 评估周期构成端到端延迟的主要瓶颈。
- 理解数据流有助于定位伸缩延迟,并为后续的压测与优化提供理论基础。