k8s--Prometheus + Grafana资源监控
Kubernetes 集群的动态性和复杂性使得传统监控方式难以胜任——Pod 频繁创建销毁、节点弹性扩缩容、服务网络动态变化,这些特性要求监控体系具备自动发现和动态适配的能力。而 Prometheus + Grafana 的组合,已经成为云原生监控领域的标准方案。
一、监控体系架构概览
一个完整的 K8s 资源监控体系由三个核心层次构成:
-
节点级监控:关注物理机或虚拟机的资源使用情况(CPU、内存、磁盘、网络)。通过
node-exporter采集,部署为 DaemonSet 在每个节点运行。 -
容器级监控:关注 Pod 和容器的资源消耗。
cAdvisor(Container Advisor)集成在 kubelet 中,自动采集容器的 CPU、内存、文件系统和网络指标。 -
应用级监控:关注业务应用的自定义指标。应用通过
/metrics端点暴露 Prometheus 格式的数据,由 Prometheus 主动拉取。
此外,kube-state-metrics 是不可或缺的组件——它通过监听 Kubernetes API Server,暴露集群状态指标(如 Deployment 期望副本数、Pod 重启次数等),与 node-exporter 形成互补:前者回答“应该是什么状态”,后者反映“实际是什么状态”。
二、Prometheus:监控系统的核心
2.1 Prometheus 是什么?
Prometheus 是一个开源监控系统,前身是 SoundCloud 的警告工具包。2016 年,它在继 Kubernetes 之后成为第二个从 CNCF 毕业的项目。其核心特性包括:
- 多维数据模型:由 metric 名字和一组 key/value 标签构成的时间序列
- 灵活的查询语句(PromQL)
- 采用 HTTP 协议,使用 Pull 模式拉取数据
- 支持服务发现或静态配置来发现监控目标
- 无依赖存储,支持 local 和 remote 模式
2.2 核心组件及其职责
| 组件 | 职责 |
|---|---|
| Prometheus Server | 定期从静态配置或服务发现(DNS、Consul、K8s)的 targets 拉取数据 |
| Exporters | 负责向 Prometheus Server 汇报数据,如 node-exporter、MySQL exporter 等 |
| Pushgateway | 解决 Pull 模式无法拉取的场景(如不在同一子网、防火墙限制),类似 Zabbix Proxy |
| Alertmanager | 负责告警的去重、分组、抑制和路由分发 |
| Grafana | 作为可视化 WebUI,展示监控数据 |
2.3 数据模型与指标类型
Prometheus 存储的是时序数据——按照相同时序(相同的名字和标签),以时间维度存储连续的数据集合。时序由 Metric 名字和一组 Key/Value 标签定义。
四种核心指标类型:
- Counter(计数器):只增不减,如
http_requests_total,用于记录服务请求总数、错误总数 - Gauge(仪表盘):可增可减,如内存使用率、磁盘使用率
- Histogram(直方图):对数据进行采样并统计区间分布,如请求持续时间,用于计算分位数
- Summary(摘要):类似 Histogram,但直接存储分位数(quantile)值
2.4 在 K8s 中部署 Prometheus
推荐使用 Prometheus Operator,它通过 CRD(Custom Resource Definition)简化了配置管理。ServiceMonitor 是其引入的核心 CRD——通过声明式配置定义 Prometheus 应抓取哪些服务的指标,并通过标签选择器自动发现目标,完美适配 K8s 的动态特性。
关键的 scrape_configs 配置示例(以抓取 node-exporter 为例):
scrape_configs:
- job_name: 'node-exporter'
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_app]
action: keep
regex: node-exporter
部署验证命令:
# 检查 node-exporter DaemonSet
kubectl get daemonset -n monitoring
# 查看 Prometheus 目标是否在线
kubectl port-forward svc/prometheus-server -n monitoring 9090:9090
# 访问 http://localhost:9090/targets
三、Grafana:数据可视化层
3.1 部署 Grafana
使用 Helm 部署是最常见的方式:
# 添加 Grafana Helm 仓库
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
# 创建命名空间
kubectl create namespace monitoring
# 部署 Grafana(需准备 values.yaml 配置数据源)
helm install grafana grafana/grafana -n monitoring --values grafana-values.yaml
关键的 values.yaml 配置示例:
persistence:
enabled: true
size: 10Gi
datasources:
datasources.yaml:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus-server.monitoring.svc.cluster.local
access: proxy
isDefault: true
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
3.2 访问与数据源配置
部署完成后,通过端口转发访问:
kubectl port-forward svc/grafana -n monitoring 3000:80
访问 http://localhost:3000,默认用户名/密码为 admin/admin。
在 Grafana 界面中:
- 进入 Configuration → Data Sources
- 点击 Add data source,选择 Prometheus
- 填写 URL(如
http://prometheus-server.monitoring.svc.cluster.local) - 点击 Save & Test,验证连接是否成功
3.3 预置 Dashboard
社区提供了大量优质的 Kubernetes 监控 Dashboard。其中 dotdc/grafana-dashboards-kubernetes 是一套现代化的 Dashboard 集合,包含:
k8s-views-nodes.json:节点视图k8s-views-pods.json:Pod 视图k8s-views-namespaces.json:命名空间视图k8s-system-api-server.json:API Server 监控k8s-system-coredns.json:CoreDNS 监控
可以通过 Helm values 直接加载这些 Dashboard:
grafana:
dashboardProviders:
dashboardproviders.yaml:
apiVersion: 1
providers:
- name: 'grafana-dashboards-kubernetes'
orgId: 1
folder: 'Kubernetes'
type: file
options:
path: /var/lib/grafana/dashboards/grafana-dashboards-kubernetes
dashboards:
k8s-views-nodes:
url: https://raw.githubusercontent.com/dotdc/grafana-dashboards-kubernetes/master/dashboards/k8s-views-nodes.json
3.4 Dashboard 设计原则
设计有效的 Dashboard 应遵循三大原则:
- 聚焦原则:每个 Dashboard 聚焦一个主题(如节点概览、API 网关监控),避免堆砌无关面板
- 层次原则:按“概览 → 详细 → 下钻”的层次组织,顶部放关键指标单值面板,中部放趋势图,底部放明细表格
- 阈值原则:为关键指标设置颜色阈值(绿色正常、黄色警告、红色危险),使异常一目了然
四、常用监控指标与 PromQL 查询
4.1 常用 PromQL 查询示例
| 监控目标 | PromQL 查询 | 说明 |
|---|---|---|
| 节点 CPU 使用率 | 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) |
计算节点整体 CPU 使用率 |
| 节点内存可用率 | node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 |
节点可用内存百分比 |
| Pod CPU 使用率 | sum(rate(container_cpu_usage_seconds_total{image!=""}[5m])) by (pod, namespace) |
按 Pod 和命名空间统计 CPU 使用 |
| Pod 内存使用率 | sum(container_memory_working_set_bytes{container!=""}) by (pod, namespace) / (sum(container_spec_memory_limit_bytes{container!=""}) by (pod, namespace)) * 100 |
计算 Pod 内存使用百分比(需有 limit) |
| 集群节点数 | count(kube_node_info) |
集群节点总数 |
| 运行中 Pod 数 | sum(kube_pod_status_phase{phase="Running"}) |
集群中 Running 状态的 Pod 数量 |
| 容器重启次数 | sum(increase(kube_pod_container_status_restarts_total[1h])) |
过去 1 小时的重启事件总数 |
五、告警配置
5.1 告警规则示例
告警规则使用 PromQL 表达式定义触发条件。例如:
groups:
- name: kubernetes-resources
rules:
- alert: HighPodMemory
expr: sum(container_memory_working_set_bytes{container!=""}) by (pod, namespace) / (sum(container_spec_memory_limit_bytes{container!=""}) by (pod, namespace)) * 100 > 90
for: 5m
labels:
severity: warning
annotations:
summary: "Pod {{ $labels.pod }} 内存使用率超过 90%"
5.2 Alertmanager 配置
Alertmanager 负责管理告警通知,支持去重、分组、抑制和路由:
route:
group_by: ['alertname', 'cluster']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: 'team@example.com'
告警级别建议:
- P0 级别(服务完全不可用):电话或短信通知
- P1 级别(错误率升高):企业微信或钉钉群
- P2 级别(资源使用率偏高):工单系统
六、存储与扩展
6.1 存储管理
Prometheus 默认使用本地 TSDB 存储,保留时间通常设置为 15~30 天。如需更长保留时间或高可用,可使用远程存储方案:
- Thanos:将历史数据上传到对象存储(如 S3),同时提供全局查询视图
- VictoriaMetrics:高性能的 Prometheus 兼容时序数据库
- 分片(Sharding)方案:当单个 Prometheus 无法承载监控目标数量时,按服务拆分为多个实例
6.2 适用场景说明
Prometheus 在记录纯数字时间序列方面表现出色,适用于服务器硬件监控和微服务监控。需要注意:它对统计数据不要求 100% 精确(如实时计费系统不适合使用),其核心价值在于服务可靠性保障和快速问题定位。
结语
Prometheus + Grafana 构建的监控体系,通过自动发现、多维数据模型和灵活的可视化能力,完美适配了 Kubernetes 的动态环境。在落地时,建议关注几个运营要点:
- 定期评审监控覆盖度:新增服务是否已纳入监控
- 定期评审告警有效性:告警准确率、响应时间是否达标
- 定期评审 Dashboard 使用情况:归档无人查看的 Dashboard
监控体系不是一次性建设工程,需要持续运营和迭代,才能让数据和告警真正为团队创造价值。
更多推荐


所有评论(0)