10.1 kube-prometheus-stack 一键部署
在 Kubernetes 上手搓 Prometheus 太累。社区的 kube-prometheus-stack(Helm Chart)打包了 Prometheus Operator、Prometheus、Alertmanager、Grafana、node-exporter、kube-state-metrics 与一整套预置告警规则和看板。
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm install kps prometheus-community/kube-prometheus-stack \
-n monitoring --create-namespace \
--set grafana.adminPassword='ChangeMe!' \
--set prometheus.prometheusSpec.retention=15d
- Prometheus Operator
- 用 CRD 声明式管理 Prometheus:你写 CR,Operator 自动生成/热更配置。
- ServiceMonitor
- CRD,声明"抓哪个 Service 的哪个端口的 /metrics",Operator 据此自动加抓取目标。
- PodMonitor
- 类似 ServiceMonitor,但直接按 Pod 标签选择目标。
- PrometheusRule
- CRD,声明告警规则与 recording rule,替代手写 rule_files。
- kube-state-metrics
- 把 K8s API 对象状态(Deployment 副本、Pod 阶段、Node 状态)暴露成指标。
10.2 用 ServiceMonitor 接入你的微服务
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: order-service
namespace: monitoring
labels:
release: kps # 必须匹配 Prometheus 的 selector
spec:
selector:
matchLabels:
app: order # 选中带此标签的 Service
namespaceSelector:
matchNames: ["prod"]
endpoints:
- port: metrics # Service 里命名的端口
interval: 15s
path: /metrics
ServiceMonitor 不生效?先查 selector
90% 的问题是标签不匹配:ServiceMonitor 上的 release: kps 必须落在 Prometheus CR 的 serviceMonitorSelector 范围内,且 spec.selector 要真的选中目标 Service 的命名端口。用 Prometheus UI 的 Status → Targets 页面确认。
10.3 SLO 与错误预算
与其零散地对 CPU/内存告警,不如用 SLO(服务等级目标)面向用户体验来定义健康。
- SLI 服务等级指标
- 可量化的用户体验度量,如"成功请求占比"、"P99 延迟 < 300ms 占比"。
- SLO 服务等级目标
- 对 SLI 设定的目标,如"30 天内成功率 ≥ 99.9%"。
- Error Budget 错误预算
1 - SLO= 允许失败的额度(99.9% 即每 30 天约 43 分钟)。预算耗尽应冻结发布、优先稳定性。- Burn Rate 燃烧率
- 错误预算的消耗速度。多窗口多燃烧率告警(快窗口抓突发、慢窗口抓缓慢劣化)是 SRE 推荐做法。
# 30 天成功率 SLI
sum(rate(http_requests_total{status!~"5.."}[30d]))
/
sum(rate(http_requests_total[30d]))
# 快速燃烧告警:1h 内消耗预算 > 14.4 倍(约 2 天烧光月预算)
- alert: ErrorBudgetBurnFast
expr: |
(1 - sum(rate(http_requests_total{status!~"5.."}[1h]))
/ sum(rate(http_requests_total[1h]))) > (14.4 * 0.001)
for: 2m
labels: { severity: critical }
10.4 告警最佳实践回顾
- 基于用户症状(SLO 燃烧率)告警,少告零散原因指标。
- 每条告警可行动、分级明确(critical 电话 / warning 工作时间)。
- 用 for + 多窗口燃烧率抗抖动,避免告警疲劳。
- 关键 meta 告警:
up == 0(目标下线)、Watchdog(常亮心跳,验证链路本身活着)。
Watchdog 告警
kube-prometheus-stack 内置一条永远 firing 的 Watchdog 告警。外部系统监控它"是否消失"来判断整条告警链路(Prometheus→Alertmanager→通知)是否还活着——防止"告警系统自己挂了却无人知晓"。
10.5 上线部署 checklist
| 类别 | 检查项 |
|---|---|
| 可靠性 | Prometheus 跑 2 副本;Alertmanager 集群 ≥ 3;有 Watchdog 心跳告警 |
| 存储 | 数据盘用 SSD;配 retention;重要指标 remote_write 到长期存储 |
| 基数 | 监控 head_series 趋势;drop 高基数无用指标;禁止用户 ID 类 label |
| 安全 | /metrics 与 UI 加认证/网络隔离;Exporter 用只读账号;TLS |
| 告警 | 规则经 promtool test 验证;分级清晰;接入值班渠道并演练 |
| 可视化 | 核心服务有 RED 看板;数据源/看板用 Provisioning 纳入 Git |
| 容量 | 限制 query.max-samples/timeout;预估磁盘与内存;设资源 request/limit |
| 自监控 | 监控 Prometheus/Alertmanager 自身;抓取失败、规则评估延迟有告警 |
10.6 全书总结
从可观测性概念到生产落地,你已经走完 Prometheus 的完整链路:
- 模型:pull 采集 + 多维时间序列 + 四种指标类型。
- 查询:PromQL 的 rate/聚合/分位数,是一切告警与看板的基础。
- 采集:服务发现 + relabel 管目标,Exporter 与 client library 管数据来源。
- 行动:Alertmanager 告警 + Grafana 可视化。
- 规模:remote_write + Thanos/VM/Mimir 解决长期与高可用;SLO 让监控对齐用户价值。
继续学习
配合 Kubernetes 云原生、OpenTelemetry 可观测性 与 Docker 容器化 三门教程,你就能搭出指标+日志+追踪的完整可观测性体系。