循序渐进kubernetes之使用 Prometheus 和 Grafana 的实践指南

发布于:2025-06-25 ⋅ 阅读:(23) ⋅ 点赞:(0)


在容器化应用和微服务架构的浪潮中,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 集群提供了一套强大且灵活的监控解决方案。以下为其主要优势:

  1. Prometheus
  • 开源且由社区驱动:Prometheus 是被广泛采用的开源监控解决方案,拥有庞大的社区,持续获得改进、支持以及众多插件与集成。
  • 多维数据模型:采用多维度数据模型,使用指标名称与键值对标识时间序列数据,具备高度灵活性,便于进行复杂查询。
  • 强大的查询语言(PromQL):PromQL 支持复杂查询与聚合,便于从收集到的指标中提取有价值的信息。
  • 高效的存储机制:内置高性能的时间序列数据库,具备良好的扩展性与读写性能,适用于大规模数据采集。
  • 告警系统:内置告警机制,可基于指标定义告警规则,并通过 Alertmanager 将告警发送至邮件、Slack、Webhook 等多个接收端。
  • 服务发现机制:支持多种服务发现方式,特别是对 Kubernetes 的原生支持,能自动发现与监控新部署的服务。
  1. Grafana
  • 丰富的可视化能力:提供多种图表类型,包括折线图、柱状图、直方图与热力图,可构建多样化的可视化仪表板。
  • 可定制仪表板:仪表板高度可定制,可根据不同团队或组织需求构建专属视图。
  • 多数据源支持:除 Prometheus 外,还支持 Elasticsearch、InfluxDB、Graphite 等多种数据源,适用于集中式监控平台。
  • 告警系统:内置告警功能,可对面板设置告警规则,并通过邮件、Slack、PagerDuty 等渠道发送通知。
  • 模板化功能:支持模板变量,可实现仪表板的重用与动态交互,提升仪表板的灵活性与适应性。
  • 用户管理与共享功能:支持身份认证与基于角色的访问控制,便于管理仪表板权限,亦支持分享与嵌入仪表板。
  • 插件与扩展支持:拥有丰富的插件生态,涵盖数据源、可视化组件与应用扩展,便于功能增强与场景定制。
  1. 结合使用的优势
  • 全面的监控解决方案:Prometheus 负责指标采集与存储,Grafana 负责数据可视化与分析,构成完整的监控体系。
  • 良好的可扩展性:Prometheus 可处理百万级时间序列,Grafana 可管理大量仪表板与数据源,适应大规模基础设施。
  • 实时监控与告警:Prometheus 提供实时数据采集,Grafana 提供实时展示,告警系统能及时发现问题。
  • 部署便捷:通过 Helm 等工具可简化部署流程,在 Kubernetes 中快速完成 Prometheus 与 Grafana 的部署与配置。
  • 高扩展性:两者均支持插件与自定义集成,能灵活适配不同系统与场景需求。

总结

通过 Helm 在 Kubernetes 中部署 Prometheus 与 Grafana 非常简便,能快速构建功能强大的监控系统。通过设置 NodePort 暴露服务,可从集群外部访问仪表板。该方案支持性能监控、指标可视化与告警配置,有助于确保应用稳定运行、集群高效运维。


网站公告

今日签到

点亮在社区的每一天
去签到