Chapter 10

实战与生产

把前九章串起来:用 kube-prometheus-stack 一键监控 K8s 集群与微服务,落地 SLO 与错误预算,交付一份可执行的上线 checklist。

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 告警最佳实践回顾

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 的完整链路:

继续学习

配合 Kubernetes 云原生OpenTelemetry 可观测性Docker 容器化 三门教程,你就能搭出指标+日志+追踪的完整可观测性体系。