使用 Grafana 与 Prometheus 监控 Kubernetes:分步指南
Kubernetes 已成为现代应用部署的基础层,但其动态、分布式的特性使得全面可观测性成为运维成功的必要条件。你需要了解节点的健康状况、Pod 的性能表现以及集群的状态,以确保可靠性并避免代价高昂的停机。本指南提供了一条明确、循序渐进的道路,帮助你掌握如何使用 Grafana 和 Prometheus 监控 Kubernetes,将原始指标转化为可操作的洞察,从而主动管理你的基础设施。
你将学到什么
通过本指南,你将了解如何使用行业标准的 kube-prometheus-stack 在你的 Kubernetes 集群上部署一套完整、可用于生产环境的监控栈。你将能够将 Grafana 连接到 Prometheus,导入预构建的仪表盘以获得即时可见性,并带着清晰的计划离开,以便根据你的特定需求定制告警和可视化。最重要的收获是:kube-prometheus-stack Helm Chart 是实现全栈 Kubernetes 监控最快、最可靠的方法。
Kubernetes 的行业标准监控栈
Prometheus 和 Grafana 的组合是 Kubernetes 监控的事实标准。根据行业数据,估计有 75% 使用 Kubernetes 的组织采用 Prometheus 和 Grafana 来满足其可观测性需求。这不仅仅是一种趋势,更是对这一开源工具包强大功能和灵活性的证明。
- Prometheus 是一个云原生计算基金会(CNCF)的毕业项目,专为可靠性和可扩展性而设计。它通过按指定间隔从各种目标(如你的应用 Pod 或 Kubernetes 节点)抓取指标,并将其存储在时序数据库中。然后,你可以使用 PromQL(Prometheus 查询语言)查询这些数据,这是一种强大且灵活的语言,用于聚合和分析指标。
- Grafana 是可视化层。它与 Prometheus 无缝集成,将原始抓取的数据转化为美观、实时的仪表盘和图表。这种可视化表示使得一眼就能发现趋势、检测异常和排查性能问题变得容易得多。Grafana 还可以作为其他数据源的统一用户界面,但对于 Kubernetes 而言,Prometheus 是其最重要的合作伙伴。
设置前提条件
在开始之前,请确保已安装并配置好以下工具。本指南假设你有一个可用的 Kubernetes 集群,无论是像 Minikube 这样的本地开发环境,还是云中的生产集群。
- 一个正在运行的 Kubernetes 集群: 你需要一个集群来部署监控栈。对于本地测试,Minikube 或 Kind 非常合适。
- Helm: Kubernetes 包管理器对于部署
kube-prometheus-stack至关重要。请确保你的本地机器上安装了 Helm v3.2+。 - kubectl: Kubernetes 命令行工具必须配置为与你的集群通信。
分步部署:使用 kube-prometheus-stack
为 Kubernetes 监控部署 Prometheus 和 Grafana 最高效且推荐的方法是使用 kube-prometheus-stack Helm Chart。此 Chart 由 Prometheus 社区维护,并将所有必要组件捆绑到一个易于管理的单一包中。它包括:
- Prometheus Operator: 管理 Prometheus 和 Alertmanager 实例。
- Prometheus: 核心指标服务器。
- Alertmanager: 处理 Prometheus 发送的告警。
- Grafana: 可视化平台。
- Node Exporter: 从你的 Kubernetes 节点收集节点级指标(CPU、内存、磁盘)。
- kube-state-metrics: 生成关于 Kubernetes 对象(如 Pod、Deployment 和 Service)状态的指标。
1. 添加 Prometheus 社区 Helm 仓库
首先,添加官方 Helm 仓库并更新它,以确保你获得最新的 Chart 版本。
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
2. 安装监控栈
你可以使用单个 Helm 命令安装监控栈,并通过各种参数进行自定义。此示例创建一个 monitoring 命名空间,并为 Prometheus 和 Grafana 数据启用持久化存储。
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace \
--set grafana.service.type=NodePort \
--set grafana.service.nodePort=30094 \
--set grafana.adminPassword=admin \
--set prometheus.prometheusSpec.storageSpec.volumeClaimTemplate.spec.accessModes=["ReadWriteOnce"] \
--set prometheus.prometheusSpec.storageSpec.volumeClaimTemplate.spec.resources.requests.storage=50Gi \
--set prometheus.prometheusSpec.retention=30d
grafana.adminPassword=admin:设置 Grafana 的管理员密码。在生产环境中请更改此设置。--set grafana.service.type=NodePort:通过 NodePort 将 Grafana 暴露在集群外部,以便于访问。prometheus.prometheusSpec.retention=30d:将 Prometheus 数据保留期设置为 30 天,这对于长期趋势分析至关重要。
3. 验证安装
检查 monitoring 命名空间中的所有 Pod 是否正在运行。
kubectl get pods -n monitoring
输出应显示多个状态为 Running 的 Pod,包括 Grafana、Prometheus、Alertmanager、node-exporter 和 kube-state-metrics 的 Pod。
将 Grafana 连接到你的 Prometheus 数据源
kube-prometheus-stack Helm Chart 通常会自动将 Prometheus 配置为 Grafana 中的数据源。但是,最好验证一下连接。
访问 Grafana 界面
要访问 Grafana Web 界面,你可以使用端口转发进行本地测试,或者在生产环境中使用 LoadBalancer 或 Ingress 暴露服务。
选项 A:端口转发(用于快速本地访问)
这是临时访问仪表盘的最简单方法。
kubectl port-forward -n monitoring svc/prometheus-grafana 3000:80
现在,打开浏览器并访问 http://localhost:3000。
⚠️ 重要提示: 端口转发仅适用于本地测试和开发。对于永久性的生产环境设置,你应该使用类型为
LoadBalancer的 Service 或 Ingress Controller 来暴露 Grafana。
选项 B:LoadBalancer(推荐用于云环境)
如果你在 UpCloud、AWS 或 GCP 等云提供商上运行,你可以简单地将 Grafana Service 修补为使用 LoadBalancer。
kubectl patch svc prometheus-grafana -n monitoring -p '{"spec": {"type": "LoadBalancer"}}'
然后,获取外部 IP 地址:
kubectl get svc -n monitoring prometheus-grafana
在 http://<EXTERNAL-IP>:80 访问 Grafana。
登录
使用默认凭据登录:
- 用户名:
admin - 密码: 你在安装期间设置的密码(例如
admin或prom-operator)。
登录后,导航到 配置 > 数据源,确认存在一个 Prometheus 数据源并且正在工作。点击它并使用 测试 按钮确保连接正常。
构建仪表盘:从预构建到自定义
将 Grafana 连接到 Prometheus 后,你可以开始可视化你的 Kubernetes 指标。获得有价值洞察的最快方法是导入来自 Grafana 社区的预构建仪表盘。
导入预构建仪表盘
Grafana 提供了大量的社区仪表盘库,你可以使用其唯一 ID 导入它们。
- 将鼠标悬停在侧边栏的
+图标上,然后选择 导入。 - 在“查找并导入仪表盘”字段中输入仪表盘 ID。两个强烈推荐的仪表盘是:
- 1860:Node Exporter Full – 提供关于集群节点的详细指标,包括 CPU、内存、磁盘和网络。
- 8588:Kubernetes Deployment Statefulset Daemonset – 提供你的 Kubernetes 工作负载的视图。
- 点击 加载,然后选择你的 Prometheus 数据源并点击 导入。
这些仪表盘将立即为你提供集群健康状况的全面视图,而无需编写任何 PromQL 查询。
使用 PromQL 创建自定义仪表盘
虽然预构建的仪表盘是一个很好的起点,但你通常需要创建针对特定应用定制的自定义视图。这就是 PromQL 发挥作用的地方。
要创建新的仪表盘,请点击 + 图标并选择 新建仪表盘。然后,点击 添加可视化 并选择你的 Prometheus 数据源。
以下是用于 Kubernetes 监控的一些基本 PromQL 查询:
- 每个 Pod 的 CPU 使用率:
sum(rate(container_cpu_usage_seconds_total{namespace!="kube-system", pod!=""}[5m])) by (pod) - 每个 Pod 的内存使用率:
sum(container_memory_working_set_bytes{namespace!="kube-system", pod!=""}) by (pod) / 1024 / 1024 / 1024 - 按阶段划分的 Pod 状态:
此查询非常适合 Stat 面板,让你一目了然地查看所有 Pod 是否都在运行。sum(kube_pod_status_phase) by (phase)
配置告警和通知
监控只是成功的一半;当出现问题时,你还需要收到通知。这就是 Alertmanager 的角色,它包含在 kube-prometheus-stack 中。
设置告警规则
你可以配置 Alertmanager 将通知发送到各种渠道,例如 Slack、电子邮件或 PagerDuty。一个常见且有效的设置是将告警发送到专用的 Slack 频道。
- 首先,在你的 Slack 工作区中创建一个传入 Webhook。
- 然后,你需要修改 Alertmanager 配置。你可以通过在 Helm 升级期间提供自定义的
values.yaml文件或直接编辑 Secret 来实现。 - 在你的
values.yaml文件中更新alertmanager部分,添加指向你的 Slack Webhook URL 的路由和接收器:
alertmanager:
config:
route:
receiver: 'slack-notifications'
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receivers:
- name: 'slack-notifications'
slack_configs:
- api_url: 'https://hooks.slack.com/services/your/webhook/url'
send_resolved: true
title: '{{ .CommonLabels.alertname }} ({{ .Status | toUpper }})'
text: >-
{{ range .Alerts }}
*告警:* {{ .Labels.alertname }}
*严重级别:* {{ if .Labels.severity }}{{ .Labels.severity }}{{ else }}无{{ end }}
*摘要:* {{ if .Annotations.summary }}{{ .Annotations.summary }}{{ else }}无{{ end }}
*描述:* {{ if .Annotations.description }}{{ .Annotations.description }}{{ else }}无{{ end }}
{{- end }}
使用 helm upgrade 应用这些更改后,告警将被发送到你的 Slack 频道。
生产环境监控的最佳实践
为确保你的监控栈在生产环境中健壮且可扩展,请遵循以下关键最佳实践。
- 配置持久化存储: 在生产环境中部署时,始终为 Prometheus 和 Grafana 启用持久化存储。这可以确保你的指标数据和仪表盘配置在 Pod 重启和集群升级后仍然存在。在
kube-prometheus-stack中,这由 Helm Chart 中的persistence和storageSpec设置控制。 - 优化查询性能: 高基数查询可能会拖慢你的仪表盘和 Prometheus 本身。为了保持性能,始终在源头聚合你的 PromQL 查询。例如,不要查询
container_cpu_usage_seconds_total,而是按命名空间聚合它:sum by (namespace) (rate(container_cpu_usage_seconds_total[5m]))。这减少了 Grafana 需要处理的数据量。 - 设置适当的保留期: Prometheus 的默认保留期是 15 天。根据你的需求进行调整。更长的保留期(例如 30-60 天)对于长期趋势分析很有用,但需要更多的存储空间。
- 将配置作为代码管理: 随着你的监控需求不断变化,你可能会自定义仪表盘和告警规则。将你的仪表盘导出为 JSON,并与告警规则一起存储在版本控制(例如 Git)中。这种被称为 GitOps 的实践,使你的监控设置可重现且可审计。
- 调整抓取间隔: Prometheus 的默认抓取间隔是 30 秒。对于关键、高频率的指标,你可能希望更频繁地抓取,但请注意,这会增加 Prometheus 和集群 API 服务器的负载。你可以在 Helm values 中自定义这些间隔。
常见问题解答
1. 使用 Grafana 和 Prometheus 监控 Kubernetes 最简单的方法是什么?
最简单且最推荐的方法是使用 kube-prometheus-stack Helm Chart。它将 Prometheus、Grafana、Alertmanager、node-exporter 和 kube-state-metrics 捆绑到一个包中,你只需几个命令即可部署。
2. 监控 Kubernetes 是否必须使用 kube-state-metrics?
是的,kube-state-metrics 是一个关键组件,它生成关于 Kubernetes 对象状态的指标,例如就绪 Pod 的数量或 Deployment 的状态。没有它,你将无法了解更高级别 Kubernetes 资源的健康状况。
3. 如何让我的 Kubernetes 仪表盘加载得更快?
仪表盘加载缓慢通常是由低效的 PromQL 查询引起的。一个关键的修复方法是聚合查询以降低基数。例如,不要显示每个 Pod 的数据,而是使用类似 sum by (namespace) (rate(...)) 的查询在命名空间级别进行汇总。
4. 从我的 Kubernetes 监控中获取告警的最佳方式是什么? Prometheus 与 Alertmanager 配合使用,后者可以将通知发送到各种渠道。一种流行且简单的方法是通过传入 Webhook 将 Alertmanager 配置为向 Slack 频道发送告警。这提供了实时、可操作的告警。
5. 我是否需要手动在每个节点上安装 Node Exporter?
不需要。当你部署 kube-prometheus-stack Helm Chart 时,它会自动部署一个 Node Exporter DaemonSet。这确保了 Node Exporter Pod 在你的集群中的每个节点上运行,从而使 Prometheus 能够收集节点级指标(如 CPU、内存和磁盘使用情况),而无需任何手动干预。
来源
- UpCloud Global. (2025). Monitoring on UpCloud with Prometheus: Part 3.
- Ubuntu Documentation. (2026). How to use Prometheus with Canonical Kubernetes.
- Sfeir Institute. (2026). Create Effective Grafana Dashboards for Kubernetes Monitoring.
- Ory. (2025). Monitoring.
- GitHub - AkramGalal. (2025). deploying-prometheus-grafana-K8s-using-helm.
- Go Packages. (2025). kube-prometheus.
- GitHub - dotdc. (2026). grafana-dashboards-kubernetes.
- Scaleway. (2025). Kubernetes Kapsule cluster monitoring with Prometheus & Grafana.
- Mirantis. (2025). How to Set Up Prometheus & Grafana in K8s with Alertmanager & Slack Alerts.
- Microsoft Learn. (2025). Using ConfigMap to customize Prometheus metric collection in Azure Monitor.
- GitHub - Rurutia1027. (2025). Hands-on-Lab.K8s-Monitoring.
— Editorial Team
暂无评论。