3. Prometheus 监控体系:架构、资源定义与采集生命周期
在 Kubernetes 与服务网格的混合治理场景中,Prometheus 不仅是指标存储与告警引擎,更是回滚护栏的数据基座。本节从架构分层、资源对象配置、采集生命周期三个维度,拆解 Prometheus 如何与 K8s 原生机制协同,为后续的指标驱动回滚提供可靠数据管道。
3.1 Prometheus 在 K8s 环境中的分层架构
生产环境通常采用 Prometheus Operator 模式部署,将 Prometheus 实例抽象为 Kubernetes 自定义资源。整体架构分为三层:
- 采集层:Prometheus Server + ServiceMonitor / PodMonitor 动态发现目标。
- 存储与查询层:Thanos / VictoriaMetrics 实现长期存储与全局视图。
- 告警与事件层:Alertmanager 根据指标阈值触发回滚或人工介入。
关键设计原则:每个 Kubernetes 命名空间对应一个 Prometheus 实例或 Shard,避免指标采集互相干扰;ServiceMonitor 与 PodMonitor 通过 label selector 精确控制采集范围,减少无效抓取。
3.2 ServiceMonitor 与 PodMonitor 配置详解
Prometheus Operator 通过 ServiceMonitor 和 PodMonitor 两个 CRD 实现动态服务发现。两者核心区别在于发现的目标层级:
| 对比维度 | ServiceMonitor | PodMonitor |
|---|---|---|
| 发现目标 | Kubernetes Service 背后的 Endpoints | 直接匹配 Pod IP + 端口 |
| 适用场景 | 有 Service 代理的微服务(如 Istio Sidecar) | 无 Service 的 DaemonSet / 静态 Pod |
| 标签选择 | selector.matchLabels 匹配 Service 标签 | selector.matchLabels 匹配 Pod 标签 |
| 端口定义 | 通过 Service 端口名称或端口号 | 直接指定 Pod 内容器端口 |
| 路径与协议 | endpoints 级别配置 metrics 路径 | pod 级别配置 metrics 路径 |
3.2.1 ServiceMonitor 配置示例
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: productpage-monitor
namespace: istio-system
spec:
selector:
matchLabels:
app: productpage
endpoints:
- port: http
interval: 15s
path: /metrics
scheme: http
namespaceSelector:
any: true
生产建议:ServiceMonitor 的
namespaceSelector 建议显式指定命名空间,避免跨 namespace 误抓;interval 根据业务抖动容忍度设置,回滚场景建议 ≤ 15s。
3.2.2 PodMonitor 配置示例
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: envoy-stats-monitor
namespace: istio-system
spec:
selector:
matchLabels:
istio: sidecar-injector
podMetricsEndpoints:
- port: http-envoy-prom
interval: 10s
path: /stats/prometheus
relabelings:
- sourceLabels: [__meta_kubernetes_pod_node_name]
targetLabel: node
action: replace
namespaceSelector:
matchNames:
- default
- istio-system
避坑提示:PodMonitor 的
relabelings 常用于注入节点标签、工作负载标签;但注意不要覆盖 Prometheus 内置的 __meta_* 标签,否则会导致服务发现失效。
3.3 指标采集生命周期
从 Prometheus 发起 HTTP 请求到指标入库,完整生命周期包含 6 个阶段。理解每个阶段有助于排查采集延迟、指标丢失等问题。
3.3.1 各阶段详细说明
| 阶段 | 核心动作 | 常见问题 | 回滚护栏关联 |
|---|---|---|---|
| 1. 服务发现 | Prometheus 通过 K8s API 获取 Service/Pod 列表 | RBAC 权限不足导致发现失败 | 目标缺失 → 回滚指标空洞 |
| 2. Relabel | 修改/过滤标签,注入工作负载标识 | 标签覆盖导致唯一标识丢失 | 无法按版本聚合回滚指标 |
| 3. HTTP 抓取 | 向目标端点发起 GET /metrics 请求 | 超时、TLS 证书过期 | 采集延迟 → 回滚判断滞后 |
| 4. 解析 & 过滤 | 解析 Prometheus 文本格式,丢弃无效行 | 指标名称冲突、标签基数爆炸 | 高基数导致存储压力 |
| 5. 存储 | 写入 TSDB block,压缩与持久化 | 磁盘 IO 瓶颈、WAL 损坏 | 历史数据缺失影响回滚基线 |
| 6. 告警评估 | PromQL 规则周期性计算 | 规则语法错误、评估间隔过长 | 直接决定回滚触发时机 |
3.4 采集生命周期中的回滚护栏关键指标
在服务网格治理场景下,以下指标必须确保被正确采集并保留足够历史窗口:
- istio_requests_total:请求总量,用于计算错误率与延迟分位数。
- istio_request_duration_milliseconds:P99/P95 延迟,回滚触发核心信号。
- envoy_cluster_upstream_rq_xx:按响应码聚合,5xx 突增直接关联回滚。
- container_cpu_usage_seconds_total / container_memory_working_set_bytes:资源饱和导致级联故障。
采集配置最佳实践:
1. 每个 ServiceMonitor 只匹配一个微服务,避免 selector 范围过大。
2. 为回滚场景单独设置
3. 在 relabel 阶段保留
4. 启用
1. 每个 ServiceMonitor 只匹配一个微服务,避免 selector 范围过大。
2. 为回滚场景单独设置
scrape_timeout: 10s,避免慢目标拖慢整体采集。3. 在 relabel 阶段保留
version 标签,用于回滚时的版本对比。4. 启用
honor_labels: true 防止 Prometheus 覆盖目标暴露的标签。