prometheus 在 kubernetes 中需系统性设计:必须用 kubernetes_sd_configs 动态服务发现(nodes/endpoints/pod/service),搭配 cadvisor、node exporter、kube-state-metrics 等标准化 exporter,区分指标语义;生产环境须解决存储瓶颈(thanos/victoriametrics/pushgateway),告警与可视化需闭环(alertmanager 静默分组、grafana 聚焦 slo、告警带 runbook_url)。

Prometheus 在 Kubernetes 中不是“装上去就能用”的工具,而是需要围绕其拉取模型、服务发现机制和云原生特性做系统性设计。核心在于让 Prometheus 主动、安全、可持续地获取动态变化的监控目标,同时保障数据可用性与可观测性闭环。
服务发现必须用 Kubernetes 原生方式
静态配置 targets(如 targets: ["10.244.1.5:9100"])在 Kubernetes 中完全不可行——Pod 重建、扩缩容、节点漂移都会导致 IP 失效。必须依赖 kubernetes_sd_configs 按角色自动发现:
- nodes:监控节点资源,需配合 Node Exporter DaemonSet 和对应 RBAC
- endpoints:发现 Service 关联的 Pod IP,适合监控 API Server、kube-scheduler 等控制平面组件
- pod:直接按标签筛选容器,适用于 sidecar 暴露指标或无 Service 的临时任务
- service:发现 Service 自身(非后端 Pod),常用于监控 Service Mesh 控制面
例如监控所有带 app=backend 标签的 Pod,配置中只需写:
role: pod<br>selectors:<br> - role: pod<br> label: app=backend
关键组件不能缺位,各司其职
单靠 Prometheus Server 无法覆盖 Kubernetes 全栈指标,必须组合使用标准化 Exporter:
-
cAdvisor:内嵌在 kubelet 中,暴露容器 CPU、内存、网络、磁盘 I/O 实时指标,路径为
/metrics/cadvisor - Node Exporter:采集宿主机维度指标(CPU 负载、磁盘空间、内核参数等),建议以 DaemonSet 部署
- kube-state-metrics(KSM):将 Kubernetes 对象状态(Deployment 副本数、Pod 相位、PV 绑定状态等)转为 Prometheus 指标,不采集资源使用率,只反映编排层事实
- 自定义 Exporter:如 MySQL Exporter、Blackbox Exporter(探测 HTTP/ICMP 可达性),按业务需求补充
注意:cAdvisor 和 KSM 的指标语义完全不同——container_memory_usage_bytes 是实际用量,kube_pod_status_phase 是调度状态,混用会导致查询逻辑错误。
生产环境必须解决存储与扩展瓶颈
默认本地 TSDB 不适合长期运行:数据保留超 15 天易触发 WAL 崩溃,高基数标签(如 trace_id)会快速耗尽内存。应明确区分场景:
-
短期观测(≤7 天):启用
--storage.tsdb.retention.time=7d,关闭压缩日志以降低写入压力 - 跨集群聚合:引入 Thanos Sidecar + Object Storage(S3/MinIO),通过 StoreAPI 实现全局视图与降采样
- 超大规模写入(百万级时间序列):替换为 VictoriaMetrics,兼容 PromQL 且内存占用低 60%
- 临时任务指标(如 CI Job):必须经由 Pushgateway 中转,避免 Prometheus 拉不到已销毁的 Pod
告警与可视化要形成闭环
监控价值最终体现在问题响应速度上,不能只停留在“能查到”:
- Alertmanager 需配置静默规则(如节点维护期屏蔽 NodeDown 告警)、分组策略(同节点多个告警合并为一条通知)和多通道路由(企业微信+短信+电话 escalation)
- Grafana 仪表盘避免堆砌图表,聚焦 SLO 关键指标:如
rate(http_request_total{code=~"5.."}[5m]) / rate(http_request_total[5m])(错误率)、histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))(P95 延迟) - 每个告警规则必须带
runbook_url标签,指向内部故障处理 SOP 文档,实现“告警即文档”
不复杂但容易忽略











