文章目录
在容器化应用和微服务架构的浪潮中,Kubernetes 已成为容器编排的首选平台。然而,随着集群规模和复杂度的增加,监控集群的健康状况、性能和资源使用变得至关重要。本文将通过结合实际实验步骤和参考资料(如 Anvesh Muppeda 的文章《A Hands-On Guide to Kubernetes Monitoring Using Prometheus & Grafana》),为你提供一个详细的实践指南,展示如何使用 Prometheus 和 Grafana 搭建一个强大的 Kubernetes 监控系统。我们将涵盖环境准备、工具安装、配置和仪表板创建的全过程,并补充实验中的不足部分,以确保你能够成功实现监控目标。
为什么需要监控 Kubernetes?
Kubernetes 集群管理着大量的容器化工作负载,涉及节点、Pod、服务和网络等多个组件。缺乏有效的监控可能导致以下问题:
- 性能瓶颈:无法及时发现 CPU、内存或磁盘的高使用率。
- 故障排查困难:应用崩溃或网络问题难以定位。
- 资源浪费:过度分配的资源导致成本上升。
Prometheus 和 Grafana 是 Kubernetes 监控的黄金组合:
- Prometheus:一个开源的时间序列监控和告警工具,擅长收集和查询指标,特别适合动态的云原生环境。它通过拉取(pull)方式从目标端点(如 Kubernetes 组件或应用)抓取指标,并支持强大的 PromQL 查询语言。
- Grafana:一个开源的可视化平台,通过直观的仪表板将 Prometheus 收集的指标转化为图表,帮助用户快速洞察集群状态。
通过本教程,你将学会如何在 Kubernetes 集群中部署 Prometheus 和 Grafana,配置数据源,并创建仪表板来监控关键指标,如 CPU 使用率、内存消耗和 Pod 状态。
前提条件
在开始实验之前,确保你的环境满足以下要求:
- Kubernetes 集群:一个运行中的 Kubernetes 集群(版本 1.16 或更高)。本实验使用的是单节点集群(k8sm01.lab.com 和 k8sw01.lab.com,运行 Kubernetes v1.31.8
- kubectl:已安装并配置好与集群通信的 kubectl 客户端。
- Helm:Kubernetes 的包管理器,用于简化 Prometheus 和 Grafana 的部署。安装 Helm 可参考循序渐进掌握Helm
- 节点信息:通过以下命令确认节点 IP 和状态:
kubectl get nodes -o wide
输出示例:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8sm01.lab.com Ready control-plane 40d v1.31.8 172.20.32.247 <none> Ubuntu 24.04 LTS 6.8.0-59-generic containerd://1.7.27
k8sw01.lab.com Ready <none> 40d v1.31.8 172.20.46.105 <none> Ubuntu 24.04 LTS 6.8.0-31-generic containerd://1.7.27
实验步骤:部署 Prometheus 和 Grafana
以下步骤基于实验记录,并参考了 Anvesh Muppeda 的文章,补充了配置细节和最佳实践。
步骤 1:添加 Prometheus Helm 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
这将确保你获取最新的 kube-prometheus-stack 图表,该图表包含 Prometheus、Grafana、Alertmanager 和其他监控组件。
步骤 2:创建自定义值文件
为了自定义 Prometheus 和 Grafana 的服务类型,我们创建了一个 custom-values.yaml 文件:
prometheus:
service:
type: NodePort
grafana:
service:
type: NodePort
- NodePort:将 Prometheus 和 Grafana 的服务暴露到节点的特定端口(30000-32767 范围内),适合本地测试或无 LoadBalancer 的环境。
- 补充说明:在生产环境中,建议使用 LoadBalancer 或 Ingress 来提供更安全和灵活的外部访问方式。
步骤 3:部署 kube-prometheus-stack
使用 Helm 部署 kube-prometheus-stack,并应用自定义值文件,同时设置 Prometheus 的最大启动时间为 300 秒(避免启动超时)
helm upgrade --install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
-f /home/kubeadmin/charts/prometheus/custom-values.yaml \
--set prometheus.prometheusSpec.maximumStartupDurationSeconds=300
命令解析:
- upgrade --install:如果 release 不存在则安装,已存在则升级。
- -f:指定自定义值文件。
- –set:动态覆盖 Helm 图表的参数。
输出示例:
Release "kube-prometheus-stack" has been upgraded. Happy Helming!
NAME: kube-prometheus-stack
LAST DEPLOYED: Wed Jun 11 15:57:08 2025
NAMESPACE: default
STATUS: deployed
REVISION: 5
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
kubectl --namespace default get pods -l "release=kube-prometheus-stack"
Get Grafana 'admin' user password by running:
kubectl --namespace default get secrets kube-prometheus-stack-grafana -o jsonpath="{.data.admin-password}" | base64 -d ; echo
Access Grafana local instance:
export POD_NAME=$(kubectl --namespace default get pod -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=kube-prometheus-stack" -oname)
kubectl --namespace default port-forward $POD_NAME 3000
Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.
以上输出包含:
- 查看组件状态的方法
- 获取 Grafana admin 密码的方式
- 如何通过本地端口转发访问 Grafana
- 提供官方文档链接用于配置 Prometheus 和 Alertmanager
步骤 4:验证部署
检查 Pod 是否正常运行:
kubectl --namespace default get pods -l "release=kube-prometheus-stack"
检查服务是否创建成功:
kubectl get services
输出示例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-prometheus-stack-grafana NodePort 10.108.113.206 80:31713/TCP 2d
kube-prometheus-stack-prometheus NodePort 10.96.32.0 9090:30090/TCP,8080:32599/TCP 2d
...
这里EXTERNAL-I为空,为了能让外部能透过Nodeip访问集群服务,接下来我们将配置外部ip
步骤 5:配置外部 IP
为了通过节点 IP 访问 Grafana,实验中通过 kubectl patch 为 Prometheus和Grafana 服务添加了外部 IP:
- Prometheus:
kubectl patch service kube-prometheus-stack-prometheus -p '{"spec":{"externalIPs":["172.20.32.247"]}}'
- Grafana:
kubectl patch service kube-prometheus-stack-grafana -p '{"spec":{"externalIPs":["172.20.46.105"]}}'
- 补充建议:在生产环境中,使用 Ingress 控制器(如 Nginx Ingress)并结合 DNS 解析来提供更可靠的访问方式。
再次确认:
kubectl get service |grep NodePort
kube-prometheus-stack-grafana NodePort 10.108.113.206 172.20.46.105 80:31713/TCP 5d
kube-prometheus-stack-prometheus NodePort 10.96.32.0 172.20.32.247 9090:30090/TCP,8080:32599/TCP 5d
最终,我们能透过node ip以及Node Port 分别访问Prometheus和Grafana:
- Prometheus: http://172.20.32.247:9090
- Grafana: http://146.190.55.222:80
步骤6:访问 Prometheus:
使用上面的链接访问 Prometheus UI;
http://:
步骤7:访问Grafana
使用上面的链接范文Grafana UI:
http://:
步骤8:获取 Grafana 管理员密码:
kubectl --namespace default get secrets kube-prometheus-stack-grafana -o jsonpath="{.data.admin-password}" | base64 -d ; echo
输出:
prom-operator
这是Grafana的默认密码
输入登入密码后将进入主画面
默认dashboard:
使用这些仪表板,我们可以轻松监控我们的 Kubernetes 集群。
添加dashboard
我们也可以灵活地从零开始创建自己的仪表板,或从 Grafana 库中导入多个仪表板。
要导入 Grafana 仪表板,请按照以下步骤操作:
步骤1:访问grafana libary:
步骤2:步骤 2:选择要添加的仪表板 ID。
假设使用 K8s/Storage/Volumes/Namespace 仪表板。
复制 K8s/Storage/Volumes/Namespace 仪表板的 ID,即 11455。
步骤 3:在 Grafana 中导入选定的仪表板
进入仪表板部分,并点击“Import”选项。
现在输入目标新仪表板的 ID,即 11455。
点击“Load”以导入新仪表板并进行访问。
这些步骤使我们能够轻松集成来自 Grafana 库的任何仪表板。
Prometheus 架构
Prometheus 是一个强大且具备可靠性与可扩展性的监控与告警工具集。理解其架构有助于充分发挥其潜力。Prometheus 架构由几个关键组件组成:
Prometheus Server
Prometheus Server 是核心组件,负责以下功能:
- Data Scraping:定期从已配置的目标抓取指标数据,这些目标通常是以指定格式公开指标的 HTTP 端点。
- Data Storage:使用时间序列数据库将所有抓取到的样本数据本地存储。Prometheus 在时间序列数据的存储与检索方面具有高效性。
- Querying:通过 Prometheus Query Language(PromQL)查询时间序列数据,支持复杂的聚合与计算操作。
Prometheus 组件
- Prometheus Server:主要组件,执行大部分任务,包括从目标抓取指标、存储数据,并提供强大的查询接口。
- Pushgateway:用于从短生命周期作业(short-lived jobs)中推送指标的中间服务,这类作业无法被 Prometheus 直接抓取。适用于批处理任务和其他有固定生命周期的进程。
- Exporters:用于将第三方系统的指标以 Prometheus 格式公开。例如,Node Exporter 收集节点的硬件与操作系统指标,其他 Exporter 可用于数据库、Web 服务器等系统。
- Alertmanager:处理由 Prometheus Server 生成的告警。具备去重、分组及将告警路由至多种接收端(如 Email、Slack、PagerDuty 等通知系统)的能力。
- Service Discovery:Prometheus 支持多种服务发现机制,用于自动发现抓取目标。包括静态配置、基于 DNS 的服务发现,以及与云服务商和 Kubernetes 等编排系统的集成。
- PromQL:Prometheus 使用的强大查询语言,用于检索和操作时间序列数据,支持算术运算、聚合、过滤等多种操作。
Prometheus 工作流程示例
- Service Discovery:通过服务发现机制识别需要抓取指标的目标。例如,在 Kubernetes 环境中,可自动发现 Pod、Service 和 Node。
- Scraping:以设定的时间间隔从已发现的目标抓取指标数据。每个目标为一个公开指标的端点,格式通常为纯文本,符合 Prometheus 要求。
- Storing:抓取到的指标数据存储在 Prometheus 的时间序列数据库中,并通过指标名称与标签进行索引。
- Querying:使用 PromQL 对数据进行查询,可用于分析、可视化或告警目的。
- Alerting:当满足预定义的告警规则时,Prometheus 生成告警并发送至 Alertmanager。
- Alertmanager:对收到的告警进行处理,包括去重、分组(如有需要),并将通知发送至已配置的接收端。
理解 Kubernetes 对象
Helm Chart 会部署多个 Kubernetes 对象,以搭建 Prometheus 和 Grafana。
kubectl get all
NAME READY STATUS RESTARTS AGE
pod/alertmanager-kube-prometheus-stack-alertmanager-0 2/2 Running 0 3h1m
pod/kube-prometheus-stack-grafana-746fbdb8d8-8828c 3/3 Running 2 (176m ago) 3h5m
pod/kube-prometheus-stack-kube-state-metrics-779d68fc98-cn76s 1/1 Running 1 (173m ago) 3h5m
pod/kube-prometheus-stack-operator-75dbf947f8-ml6np 1/1 Running 0 3h5m
pod/kube-prometheus-stack-prometheus-node-exporter-5q9hh 1/1 Running 0 7d
pod/kube-prometheus-stack-prometheus-node-exporter-qp8jh 1/1 Running 6 (3h5m ago) 7d
pod/prometheus-kube-prometheus-stack-prometheus-0 2/2 Running
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 7d
service/kube-prometheus-stack-alertmanager ClusterIP 10.104.62.70 <none> 9093/TCP,8080/TCP 7d
service/kube-prometheus-stack-grafana NodePort 10.108.113.206 172.20.46.105 80:31713/TCP 7d
service/kube-prometheus-stack-kube-state-metrics ClusterIP 10.111.47.32 <none> 8080/TCP 7d
service/kube-prometheus-stack-operator ClusterIP 10.101.246.253 <none> 443/TCP 7d
service/kube-prometheus-stack-prometheus NodePort 10.96.32.0 172.20.32.247 9090:30090/TCP,8080:32599/TCP 7d
service/kube-prometheus-stack-prometheus-node-exporter ClusterIP 10.98.97.143 <none> 9100/TCP 7d
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 45d
service/prometheus-operated ClusterIP None <none> 9090/TCP 6d22h
service/python-service ClusterIP 10.100.143.65 <none> 81/TCP 34d
service/test-db-test-chart ClusterIP 10.103.232.31 <none> 80/TCP 25d
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/kube-prometheus-stack-prometheus-node-exporter 2 2 2 2 2 kubernetes.io/os=linux 7d
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/kube-prometheus-stack-grafana 1/1 1 1 7d
deployment.apps/kube-prometheus-stack-kube-state-metrics 1/1 1 1 7d
deployment.apps/kube-prometheus-stack-operator 1/1 1 1 7d
NAME DESIRED CURRENT READY AGE
replicaset.apps/kube-prometheus-stack-grafana-746fbdb8d8 1 1 1 7d
replicaset.apps/kube-prometheus-stack-kube-state-metrics-779d68fc98 1 1 1 7d
replicaset.apps/kube-prometheus-stack-operator-75dbf947f8 1 1 1 7d
replicaset.apps/my-mysql-nginx-665dd5679b 1 1 1 25d
replicaset.apps/my-web-app-54899d8676 1 1 1 24d
replicaset.apps/nfs-client-nfs-subdir-external-provisioner-65856f56d7 1 1 1 21d
replicaset.apps/test-db-test-chart-7c4794c5bd 1 1 1 25d
NAME READY AGE
statefulset.apps/alertmanager-kube-prometheus-stack-alertmanager 1/1 7d
statefulset.apps/prometheus-kube-prometheus-stack-prometheus 1/1 6d22h
以下是所使用的每种对象类型的简要说明:
Deployments:
Deployment 确保在任何时刻都有指定数量的 Pod 副本在运行,负责管理 Pod 的创建、更新与删除。在本部署中,Deployment 用于以下组件:
- Grafana:管理 Grafana 实例,确保其始终可用。
- Kube-State-Metrics:用于暴露 Kubernetes 集群层级的指标。
示例:
kube-prometheus-stack-grafana 1/1 1 1 7d23h
kube-prometheus-stack-kube-state-metrics 1/1 1 1 7d23h
StatefulSets:
StatefulSets 用于管理需要持久化存储和持久网络标识的有状态应用。其确保 Pod 按特定顺序部署,并具备唯一且持久的标识符。在此配置中,StatefulSets 用于:
Prometheus:确保 Prometheus 实例具有用于存储指标数据的持久化存储。
Alertmanager:管理 Alertmanager 实例。
示例:
NAME READY AGE
alertmanager-kube-prometheus-stack-alertmanager 1/1 8d
prometheus-kube-prometheus-stack-prometheus 1/1 7d22h
DaemonSets
确保某个 Pod 的副本在集群中的所有(或部分)节点上运行。常用于日志收集和监控代理。在此配置中,DaemonSets 用于:
Node Exporter:收集节点的硬件与操作系统指标。
示例:
kubectl get daemonset
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-prometheus-stack-prometheus-node-exporter 2 2 2 2 2 kubernetes.io/os=linux 8d
解除安装
使用以下指令卸载 Prometheus Stack:
$ helm uninstall kube-prometheus-stack
使用 Prometheus 与 Grafana 的优势
结合使用 Prometheus 与 Grafana,为 Kubernetes 集群提供了一套强大且灵活的监控解决方案。以下为其主要优势:
- Prometheus
- 开源且由社区驱动:Prometheus 是被广泛采用的开源监控解决方案,拥有庞大的社区,持续获得改进、支持以及众多插件与集成。
- 多维数据模型:采用多维度数据模型,使用指标名称与键值对标识时间序列数据,具备高度灵活性,便于进行复杂查询。
- 强大的查询语言(PromQL):PromQL 支持复杂查询与聚合,便于从收集到的指标中提取有价值的信息。
- 高效的存储机制:内置高性能的时间序列数据库,具备良好的扩展性与读写性能,适用于大规模数据采集。
- 告警系统:内置告警机制,可基于指标定义告警规则,并通过 Alertmanager 将告警发送至邮件、Slack、Webhook 等多个接收端。
- 服务发现机制:支持多种服务发现方式,特别是对 Kubernetes 的原生支持,能自动发现与监控新部署的服务。
- Grafana
- 丰富的可视化能力:提供多种图表类型,包括折线图、柱状图、直方图与热力图,可构建多样化的可视化仪表板。
- 可定制仪表板:仪表板高度可定制,可根据不同团队或组织需求构建专属视图。
- 多数据源支持:除 Prometheus 外,还支持 Elasticsearch、InfluxDB、Graphite 等多种数据源,适用于集中式监控平台。
- 告警系统:内置告警功能,可对面板设置告警规则,并通过邮件、Slack、PagerDuty 等渠道发送通知。
- 模板化功能:支持模板变量,可实现仪表板的重用与动态交互,提升仪表板的灵活性与适应性。
- 用户管理与共享功能:支持身份认证与基于角色的访问控制,便于管理仪表板权限,亦支持分享与嵌入仪表板。
- 插件与扩展支持:拥有丰富的插件生态,涵盖数据源、可视化组件与应用扩展,便于功能增强与场景定制。
- 结合使用的优势
- 全面的监控解决方案:Prometheus 负责指标采集与存储,Grafana 负责数据可视化与分析,构成完整的监控体系。
- 良好的可扩展性:Prometheus 可处理百万级时间序列,Grafana 可管理大量仪表板与数据源,适应大规模基础设施。
- 实时监控与告警:Prometheus 提供实时数据采集,Grafana 提供实时展示,告警系统能及时发现问题。
- 部署便捷:通过 Helm 等工具可简化部署流程,在 Kubernetes 中快速完成 Prometheus 与 Grafana 的部署与配置。
- 高扩展性:两者均支持插件与自定义集成,能灵活适配不同系统与场景需求。
总结
通过 Helm 在 Kubernetes 中部署 Prometheus 与 Grafana 非常简便,能快速构建功能强大的监控系统。通过设置 NodePort 暴露服务,可从集群外部访问仪表板。该方案支持性能监控、指标可视化与告警配置,有助于确保应用稳定运行、集群高效运维。