用 Prometheus + Grafana 搭建容器监控

用 Prometheus + Grafana 搭建容器监控

「看不见,就无从优化」。监控体系的核心目标是:实时看见系统状态,并在异常发生前告警。Prometheus 负责采集与存储指标,Grafana 负责可视化。

架构一图流

[Exporters / /metrics] → [Prometheus 拉取] → [TSDB 存储]
                                            → [Alertmanager 告警]
                                            → [Grafana 查询展示]

Prometheus 采用拉(pull)模型:它周期性地访问各目标的 /metrics 端点抓取指标。

一个最小配置

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['node-exporter:9100']
  - job_name: 'k8s-pods'
    kubernetes_sd_configs:
      - role: pod

用 PromQL 提问题

PromQL 是 Prometheus 的查询语言,下面是几个高频问题:

# CPU 使用率(按实例)
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 容器内存使用 TOP 5
topk(5, container_memory_usage_bytes)

# 请求错误率
sum(rate(http_requests_total{status=~"5.."}[5m]))
  / sum(rate(http_requests_total[5m]))

技巧:把 rate() 用在 _total 计数器上才能得到「速率」;用 irate() 对短时抖动更敏感。

在 Grafana 里可视化

Grafana 添加 Prometheus 数据源后,直接写 PromQL 就能出图。社区还有大量现成 Dashboard(如 Node Exporter Full,ID 1860),导入即可用。

别忘了告警

监控没有告警等于「事后诸葛亮」。在 Prometheus 中配置规则:

groups:
  - name: example
    rules:
      - alert: HighCpuUsage
        expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
        for: 5m
        labels: { severity: warning }
        annotations:
          summary: "实例 {{ $labels.instance }} CPU 持续偏高"

告警会推送到 Alertmanager,再分发到邮件、钉钉或企业微信。

小结

监控三步走:采集(Exporter)→ 查询(PromQL)→ 展示与告警(Grafana + Alertmanager)。先把指标「看见」,故障定位时间能缩短一个数量级。后续可以再引入 Loki 补齐日志、Tempo 补齐链路追踪,组成完整可观测性栈。