WEBKT

使用 Grafana 全面监控 Kubernetes 集群资源利用率与告警

54 0 0 0

Kubernetes (K8s) 作为云原生时代的基石,其集群的稳定性与性能直接关系到业务的连续性。对 K8s 集群进行有效监控是保障其健康运行的关键。Grafana 凭借其强大的数据可视化能力,结合 Prometheus 等数据源,已成为 K8s 监控领域的黄金组合。本文将详细介绍如何使用 Grafana 监控 Kubernetes 集群的资源利用率,涵盖关键指标、配置方法以及告警规则的设置。

一、 Kubernetes 监控栈概述

在深入 Grafana 配置之前,我们首先需要了解 Kubernetes 监控的基础组件:

  1. Prometheus: 作为核心时序数据库,负责从 Kubernetes 集群中抓取(Pull)各类指标数据。
  2. kube-state-metrics: 负责暴露 Kubernetes 核心资源(如 Pod、Deployment、Node 等)的状态指标,例如 Pod 运行状态、副本数等。
  3. node-exporter: 部署在每个 K8s 节点上,用于暴露宿主机(物理机或虚拟机)的操作系统和硬件指标,如 CPU、内存、磁盘 I/O、网络等。
  4. cAdvisor: 内嵌于 Kubelet 中,负责收集节点上运行的容器的资源使用情况,如 CPU 使用率、内存使用量、网络流量等。
  5. Grafana: 数据可视化平台,从 Prometheus 拉取数据并以图表、仪表盘的形式展示,同时提供强大的告警功能。

通常,我们会使用 Helm 等工具一键部署 Prometheus Operator,它会包含上述所有组件(cAdvisor 数据由 Kubelet 暴露,Prometheus 直接抓取)。

二、 关键监控指标

要有效监控 Kubernetes 集群的资源利用率,我们需要关注以下核心指标:

1. 节点(Node)级别

节点是集群的物理或虚拟计算单元,其健康状况至关重要。

  • CPU 利用率: node_cpu_seconds_total (通过计算增量获得),反映节点整体 CPU 负载。
  • 内存利用率: node_memory_MemTotal_bytesnode_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_bytesnode_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),特别是 FailedPending 状态的 Pod 数量。
  • OOMKilled 次数: kube_pod_container_status_last_terminated_reasonOOMKilled,表示容器因内存不足被杀死。

3. 工作负载(Workload)级别

对 Deployment, StatefulSet, DaemonSet 等工作负载的监控,确保应用按预期运行。

  • 期望副本数与实际副本数: kube_deployment_spec_replicaskube_deployment_status_replicas_available,确保副本数量符合预期。
  • 就绪 Pod 数量: kube_deployment_status_replicas_ready,表示有多少 Pod 已经准备好接收流量。

三、 Grafana 仪表盘配置

  1. 安装 Grafana: 如果尚未安装,可以通过 Helm 或 Docker 部署 Grafana 实例。

  2. 添加 Prometheus 数据源: 在 Grafana UI 中,进入 Configuration -> Data Sources -> Add data source,选择 Prometheus,并填写 Prometheus Server 的 URL。

  3. 导入社区仪表盘: 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 数据源即可导入。
  4. 自定义仪表盘: 如果现有仪表盘无法满足需求,可以创建新的仪表盘,添加 GraphStatTable 等面板,并使用 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)

四、 告警规则设置

告警是监控的最终目的,它能在问题发生时及时通知运维人员。Grafana 提供了强大的告警功能。

  1. 创建告警规则:

    • 在 Grafana 仪表盘的任一面板上,点击面板标题 -> Edit -> Alert 标签页。
    • 或者,在 Grafana 左侧菜单栏,进入 Alerting -> Alert rules -> New alert rule
    • Name: 告警规则的名称,清晰描述其作用。
    • Query: 选择要监控的 Prometheus 查询,例如一个 Pod 内存使用率的 PromQL。
    • Conditions: 设置触发告警的条件。这是最关键的部分。
      • WHEN: max() of query(A, 5m, now) IS ABOVE 80。表示当查询 A 在过去 5 分钟内的最大值超过 80 时触发告警。
      • 可以添加多个条件(AND/OR)来构建更复杂的逻辑。
    • NO DATA Options: 当查询没有数据时如何处理,例如 No DataAlertingOK。通常建议设置为 No Data
    • FOR: 持续时间。例如,FOR 5m 意味着条件必须持续 5 分钟才触发告警,避免瞬时波动引发误报。
    • Notifications: 配置通知通道。
  2. 配置通知通道(Notification Channels):

    • 在 Grafana 左侧菜单栏,进入 Alerting -> Contact points
    • 可以添加 Email、Slack、钉钉、企业微信、Webhook 等多种通知方式。
    • 填写相应的配置信息(如邮箱地址、Webhook URL、API Key 等)。
  3. 常见告警规则示例:

    • 高 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: WarningCritical
    • 高内存利用率(节点级别)

      • Query: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes
      • Condition: A IS ABOVE 0.85 (即 85% 内存利用率)
      • FOR: 10m
    • Pod 频繁重启

      • Query: sum(increase(kube_pod_container_status_restarts_total{namespace="$namespace"}[10m])) by (pod)
      • Condition: A IS ABOVE 3 (10 分钟内重启超过 3 次)
      • FOR: 0m (立即告警)
    • Pod 状态异常(Pending/Failed)

      • Query: sum(kube_pod_status_phase{phase="Failed",namespace="$namespace"})
      • Condition: A IS ABOVE 0 (存在一个或多个 Failed 状态的 Pod)
      • FOR: 1m
    • 容器 OOMKilled

      • Query: count(kube_pod_container_status_last_terminated_reason{reason="OOMKilled",namespace="$namespace"})
      • Condition: A IS ABOVE 0
      • FOR: 0m
    • 磁盘空间不足(节点级别)

      • Query: node_filesystem_avail_bytes / node_filesystem_size_bytes
      • Condition: A IS BELOW 0.1 (可用空间低于 10%)
      • FOR: 15m

五、 总结

通过结合 Prometheus 和 Grafana,我们可以构建一个强大而灵活的 Kubernetes 集群监控系统。从节点到 Pod,从资源利用率到应用状态,全方位的监控能够帮助我们及时发现并解决问题,确保业务的稳定运行。配置好合适的关键指标和告警规则,将大大提升运维效率,降低系统风险。持续优化仪表盘和告警策略,是保障集群健康的重要实践。

DevOps老王 KubernetesGrafana监控

评论点评