使用 Grafana 全面监控 Kubernetes 集群资源利用率与告警
Kubernetes (K8s) 作为云原生时代的基石,其集群的稳定性与性能直接关系到业务的连续性。对 K8s 集群进行有效监控是保障其健康运行的关键。Grafana 凭借其强大的数据可视化能力,结合 Prometheus 等数据源,已成为 K8s 监控领域的黄金组合。本文将详细介绍如何使用 Grafana 监控 Kubernetes 集群的资源利用率,涵盖关键指标、配置方法以及告警规则的设置。
一、 Kubernetes 监控栈概述
在深入 Grafana 配置之前,我们首先需要了解 Kubernetes 监控的基础组件:
- Prometheus: 作为核心时序数据库,负责从 Kubernetes 集群中抓取(Pull)各类指标数据。
- kube-state-metrics: 负责暴露 Kubernetes 核心资源(如 Pod、Deployment、Node 等)的状态指标,例如 Pod 运行状态、副本数等。
- node-exporter: 部署在每个 K8s 节点上,用于暴露宿主机(物理机或虚拟机)的操作系统和硬件指标,如 CPU、内存、磁盘 I/O、网络等。
- cAdvisor: 内嵌于 Kubelet 中,负责收集节点上运行的容器的资源使用情况,如 CPU 使用率、内存使用量、网络流量等。
- Grafana: 数据可视化平台,从 Prometheus 拉取数据并以图表、仪表盘的形式展示,同时提供强大的告警功能。
通常,我们会使用 Helm 等工具一键部署 Prometheus Operator,它会包含上述所有组件(cAdvisor 数据由 Kubelet 暴露,Prometheus 直接抓取)。
二、 关键监控指标
要有效监控 Kubernetes 集群的资源利用率,我们需要关注以下核心指标:
1. 节点(Node)级别
节点是集群的物理或虚拟计算单元,其健康状况至关重要。
- CPU 利用率:
node_cpu_seconds_total(通过计算增量获得),反映节点整体 CPU 负载。 - 内存利用率:
node_memory_MemTotal_bytes与node_memory_MemAvailable_bytes,计算可用内存与总内存的比率。 - 磁盘 I/O:
node_disk_reads_completed_total,node_disk_writes_completed_total,衡量磁盘读写性能。 - 网络 I/O:
node_network_receive_bytes_total,node_network_transmit_bytes_total,衡量网络带宽使用。 - 文件系统使用率:
node_filesystem_avail_bytes与node_filesystem_size_bytes,避免磁盘空间耗尽。
2. Pod/容器(Pod/Container)级别
Pod 和容器是应用程序运行的基本单位,对其细粒度监控是排查应用问题的关键。
- CPU 使用量:
container_cpu_usage_seconds_total,容器实际使用的 CPU 时间。 - 内存使用量:
container_memory_usage_bytes,容器实际占用的内存。关注container_memory_working_set_bytes更能反映进程活跃内存。 - Pod 重启次数:
kube_pod_container_status_restarts_total,频繁重启通常意味着应用健康问题。 - Pod 状态:
kube_pod_status_phase(Pending, Running, Succeeded, Failed, Unknown),特别是Failed或Pending状态的 Pod 数量。 - OOMKilled 次数:
kube_pod_container_status_last_terminated_reason为OOMKilled,表示容器因内存不足被杀死。
3. 工作负载(Workload)级别
对 Deployment, StatefulSet, DaemonSet 等工作负载的监控,确保应用按预期运行。
- 期望副本数与实际副本数:
kube_deployment_spec_replicas与kube_deployment_status_replicas_available,确保副本数量符合预期。 - 就绪 Pod 数量:
kube_deployment_status_replicas_ready,表示有多少 Pod 已经准备好接收流量。
三、 Grafana 仪表盘配置
安装 Grafana: 如果尚未安装,可以通过 Helm 或 Docker 部署 Grafana 实例。
添加 Prometheus 数据源: 在 Grafana UI 中,进入
Configuration->Data Sources->Add data source,选择Prometheus,并填写 Prometheus Server 的 URL。导入社区仪表盘: Grafana 社区提供了大量优秀的 Kubernetes 监控仪表盘。
- 例如,可以从 Grafana Labs 搜索
Kubernetes,找到如Kubernetes / Kubelet(ID: 10000)、Kubernetes / Compute Resources / Cluster(ID: 1860)、Kubernetes / Compute Resources / Namespace (Pods)(ID: 1866) 等。 - 在 Grafana 中,进入
Create->Import,输入仪表盘 ID 或直接粘贴 JSON 文件,选择之前配置好的 Prometheus 数据源即可导入。
- 例如,可以从 Grafana Labs 搜索
自定义仪表盘: 如果现有仪表盘无法满足需求,可以创建新的仪表盘,添加
Graph、Stat、Table等面板,并使用 PromQL 编写查询语句来展示上述关键指标。- 示例 PromQL 查询:
- 节点 CPU 使用率:
sum(rate(node_cpu_seconds_total{mode!="idle",mode!="iowait",instance=~"$node"}[5m])) by (instance)(此为近似值,实际需更复杂计算) - 节点内存使用率:
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 - Pod 内存使用量:
sum(container_memory_usage_bytes{container!="POD",namespace="$namespace",pod=~"$pod"}) by (pod)
- 节点 CPU 使用率:
- 示例 PromQL 查询:
四、 告警规则设置
告警是监控的最终目的,它能在问题发生时及时通知运维人员。Grafana 提供了强大的告警功能。
创建告警规则:
- 在 Grafana 仪表盘的任一面板上,点击面板标题 ->
Edit->Alert标签页。 - 或者,在 Grafana 左侧菜单栏,进入
Alerting->Alert rules->New alert rule。 - Name: 告警规则的名称,清晰描述其作用。
- Query: 选择要监控的 Prometheus 查询,例如一个 Pod 内存使用率的 PromQL。
- Conditions: 设置触发告警的条件。这是最关键的部分。
- WHEN:
max()ofquery(A, 5m, now)IS ABOVE80。表示当查询 A 在过去 5 分钟内的最大值超过 80 时触发告警。 - 可以添加多个条件(AND/OR)来构建更复杂的逻辑。
- WHEN:
- NO DATA Options: 当查询没有数据时如何处理,例如
No Data、Alerting、OK。通常建议设置为No Data。 - FOR: 持续时间。例如,
FOR 5m意味着条件必须持续 5 分钟才触发告警,避免瞬时波动引发误报。 - Notifications: 配置通知通道。
- 在 Grafana 仪表盘的任一面板上,点击面板标题 ->
配置通知通道(Notification Channels):
- 在 Grafana 左侧菜单栏,进入
Alerting->Contact points。 - 可以添加 Email、Slack、钉钉、企业微信、Webhook 等多种通知方式。
- 填写相应的配置信息(如邮箱地址、Webhook URL、API Key 等)。
- 在 Grafana 左侧菜单栏,进入
常见告警规则示例:
高 CPU 利用率(节点级别)
- Query:
sum(rate(node_cpu_seconds_total{mode!="idle",mode!="iowait"}[5m])) by (instance) - Condition:
A IS ABOVE 0.9(即 90% CPU 利用率) - FOR:
5m - Severity:
Warning或Critical
- Query:
高内存利用率(节点级别)
- Query:
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes - Condition:
A IS ABOVE 0.85(即 85% 内存利用率) - FOR:
10m
- Query:
Pod 频繁重启
- Query:
sum(increase(kube_pod_container_status_restarts_total{namespace="$namespace"}[10m])) by (pod) - Condition:
A IS ABOVE 3(10 分钟内重启超过 3 次) - FOR:
0m(立即告警)
- Query:
Pod 状态异常(Pending/Failed)
- Query:
sum(kube_pod_status_phase{phase="Failed",namespace="$namespace"}) - Condition:
A IS ABOVE 0(存在一个或多个 Failed 状态的 Pod) - FOR:
1m
- Query:
容器 OOMKilled
- Query:
count(kube_pod_container_status_last_terminated_reason{reason="OOMKilled",namespace="$namespace"}) - Condition:
A IS ABOVE 0 - FOR:
0m
- Query:
磁盘空间不足(节点级别)
- Query:
node_filesystem_avail_bytes / node_filesystem_size_bytes - Condition:
A IS BELOW 0.1(可用空间低于 10%) - FOR:
15m
- Query:
五、 总结
通过结合 Prometheus 和 Grafana,我们可以构建一个强大而灵活的 Kubernetes 集群监控系统。从节点到 Pod,从资源利用率到应用状态,全方位的监控能够帮助我们及时发现并解决问题,确保业务的稳定运行。配置好合适的关键指标和告警规则,将大大提升运维效率,降低系统风险。持续优化仪表盘和告警策略,是保障集群健康的重要实践。