Prometheus 监控 Kubernetes Cluster 最新极简教程

译文 2025-08-15 12:15:19

Kubernetes 是在生产中运行容器化工作负载的最流行的编排器。它为您提供了一套完整的工具,用于部署、扩展和管理容器。

不过,仅靠 Kubernetes 不足以运维应用程序。您还需要了解集群利用率、性能和发生的任何错误。 Prometheus 是一个开源监控系统,它收集时序指标到 TSDB,让您可以回答这些问题。

在本文中 ,您将学习如何在 Kubernetes 集群中设置和使用 Prometheus。我们将介绍安装 Prometheus、查询数据、设置可视化仪表板和管理警报规则的基础知识。 在开始之前,您需要 Kubectl、Helm 和 Kubernetes 集群。

我们将涵盖:

  • 什么是 Prometheus
  • 为什么使用 Prometheus 监控 Kubernetes
  • 什么是 kube-prometheus-stack
  • 如何在 Kubernetes 集群设置 Prometheus 监控
  • Kubernetes Prometheus 最佳实践

什么是 Prometheus

Prometheus 是 CNCF 旗下的开源监控和警报工具包。它有一个强大的时间序列数据库,旨在实现存储和查询指标数据的最佳性能。

它采用基于拉取的指标收集方法,定期主动从应用程序端点和服务器获取数据。通过这种方式,它可以实时洞察被监控系统的运行状况和性能,从而允许通过各种机制(例如 K8s 服务发现)动态发现目标。

为什么使用 Prometheus 进行 Kubernetes 监控

使用 Prometheus 进行 Kubernetes 监控的原因有很多:

  • 内置对 K8s 服务发现的支持 – 在 K8s 集群中部署和扩展新服务和 Pod 时自动发现和监控它们
  • 丰富的数据模型 – 根据 Pod 标签、命名空间、服务名称等各种属性对指标进行精细分类和查询
  • 与可视化工具集成 – 与 Grafana 无缝集成,使用户能够创建自定义仪表板和可视化,以更深入地了解 K8s 指标
  • 可扩展性和性能 – Prometheus 以最小的资源开销处理大量数据,使其成为 Kubernetes 的理想选择
  • 久经考验的可靠性 – 它已被许多各种规模的组织用于监控 Kubernetes 环境,可应对不断变化的 K8s 环境
  • 社区支持 – Prometheus 和 Kubernetes 都是 CNCF 的一部分,CNCF 拥有庞大的社区以及强大的文档和教程
  • 开源 – Prometheus 是开源的,使其成为监控 Kubernetes 的灵活选择

什么是 kube-prometheus-stack

kube-prometheus-stack Helm chart 是在 Kubernetes 集群中启动完整 Prometheus 堆栈的最简单方法。它将多个不同的组件捆绑在一个自动化部署中:

  • Prometheus - Prometheus 是一个时间序列数据库,用于抓取、存储和公开 Kubernetes 环境及其应用程序中的指标。
  • Node-Exporter - Prometheus 的工作原理是从称为导出器的各种可配置来源抓取数据 。 Node-Exporter 是一个导出器,它从 Kubernetes 集群中的节点收集资源利用率数据。kube-prometheus-stack chart 会自动部署此导出器,并配置您的 Prometheus 实例以抓取它。
  • Kube-State-Metrics – Kube-State-Metrics 是另一个向 Prometheus 提供数据的导出器。它公开有关 Kubernetes 集群中 API 对象的信息,例如 Pod 和容器。
  • Grafana – 虽然您可以直接查询 Prometheus,但这通常是乏味且重复的。 Grafana 是一个可观测性平台,可与多个数据源配合使用,包括 Prometheus 数据库。您可以使用它来创建显示 Prometheus 数据的仪表板。
  • Alertmanager – Alertmanager 是一个独立的 Prometheus 组件,可在指标发生变化时提供通知。例如,你可以使用它在 CPU 利用率飙升时接收电子邮件,或者在 Pod 被逐出时接收 Slack 通知。

单独部署、配置和维护所有这些组件对管理员来说可能是负担。Kube-Prometheus-Stack 提供了一个自动化解决方案,可以为您执行所有艰苦的工作。

如何在 Kubernetes 集群上设置 Prometheus 监控

让我们看看如何在实践中将 Prometheus 与 Kubernetes 集群一起设置和使用。

1. 安装 kube-prometheus-stack

首先,在 Helm 客户端中注册 chart 存储库:

$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
"prometheus-community" has been added to your repositories

接下来,更新存储库列表以发现 chart:

$ helm repo update

现在,您可以运行以下命令将 chart 部署到集群中的新命名空间中:

$ helm install kube-prometheus-stack \
  --create-namespace \
  --namespace kube-prometheus-stack \
  prometheus-community/kube-prometheus-stack
NAME: kube-prometheus-stack
LAST DEPLOYED: Tue Jan  3 14:26:18 2023
NAMESPACE: kube-prometheus-stack
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
  kubectl --namespace kube-prometheus-stack get pods -l "release=kube-prometheus-stack"

chart 的组件可能需要几分钟才能启动。运行以下命令以检查它们的进度:

$ kubectl -n kube-prometheus-stack get pods
NAME                                                       READY   STATUS    RESTARTS      AGE
alertmanager-kube-prometheus-stack-alertmanager-0          2/2     Running   1 (66s ago)   83s
kube-prometheus-stack-grafana-5cd658f9b4-cln2c             3/3     Running   0             99s
kube-prometheus-stack-kube-state-metrics-b64cf5876-52j8l   1/1     Running   0             99s
kube-prometheus-stack-operator-754ff78899-669k6            1/1     Running   0             99s
kube-prometheus-stack-prometheus-node-exporter-vdgrg       1/1     Running   0             99s
prometheus-kube-prometheus-stack-prometheus-0              2/2     Running   0             83s

一旦所有 Pod 都显示为 Running, 您的监控堆栈就可以使用了。导出器暴露的数据将被 Prometheus 自动抓取。

现在,您可以开始查询指标了。

2. 查询 Prometheus

Prometheus 包含一个 Web UI,您可以使用它来查询数据。这不会自动公开。您可以使用 Kubectl 端口转发将本地流量重定向到集群中的服务来访问它:

$ kubectl port-forward -n kube-prometheus-stack svc/kube-prometheus-stack-prometheus 9090:9090
Forwarding from 127.0.0.1:9090 -> 9090
Forwarding from [::1]:9090 -> 9090

此命令将流量重定向到 localhost:9090 到 Prometheus 服务。在 Web 浏览器中访问此 URL 将显示 Prometheus UI:

屏幕顶部的“表达式”输入是将查询作为 PromQL 表达式输入的地方。开始输入以显示可用指标的自动提示。

尝试选择 node_memory_Active_bytes 指标,该指标显示集群中每个节点的内存消耗。按“执行”按钮运行查询。结果将显示在 Table 中:

node_memory_Active_bytes

大多数指标使用 Graph 更容易查看。

切换到屏幕顶部的“Graph”选项卡,查看一段时间内指标的可视化效果。您可以使用图表上方的控件来更改显示的时间段。

Graph

PromQL 查询允许对您的数据进行详细查询。然而,在 Prometheus UI 中手动运行单个查询是一种低效的监控形式。

接下来,让我们使用 Grafana 在实时仪表板上方便地可视化指标。

3. 使用 Grafana 仪表盘

启动新的 Kubectl 端口转发会话以访问 Grafana UI。使用端口 80 作为目标,因为这是 Grafana 服务绑定到的端口。

您可以在以下示例中将其映射到不同的本地端口,例如 8080:

$ kubectl port-forward -n kube-prometheus-stack svc/kube-prometheus-stack-grafana 8080:80
Forwarding from 127.0.0.1:8080 -> 3000
Forwarding from [::1]:8080 -> 3000

接下来,在浏览器中访问 http://localhost:8080。您将看到 Grafana 登录页面。默认用户帐户是 admin, 密码为 prom-operator

Grafana 登录

登录后,您将首先进入 Grafana 欢迎屏幕:

Grafana 欢迎屏幕

使用侧边栏切换到“仪表板”屏幕。它的图标是四个排列成类似玻璃板的正方形。在这里可以找到所有已保存的仪表板,包括 Kube-Prometheus-Stack 部署附带的预构建仪表板。

Grafana 仪表板

4. 探索 Grafana 预构建的仪表板

包含几个仪表板,其中包含从 Node-Exporter、Kube-State-Metrics 以及各种 Kubernetes 和 Prometheus 组件中抓取的指标。以下是一些值得注意的:

使用 Kubernetes / Compute Resources / Cluster 监控集群利用率。

此仪表板概述了整个集群的资源利用率。标题统计数据显示在顶部,更详细的信息显示在下面的面板中。

Kubernetes / Compute Resources / Cluster

使用 Node Exporter / Nodes 查看节点资源消耗。

Node-Exporter 收集的数据由此仪表板提供。它显示了每个节点的详细资源利用率信息。您可以使用仪表板顶部的“实例”下拉列表更改所选节点。

Node Exporter / Nodes

使用 Kubernetes / Compute Resources / Pod 查看单个 Pod 的资源消耗。

此仪表板显示单个 Pod 的资源请求、限制、配额和利用率。你可以从屏幕顶部的下拉列表中选择要查看的命名空间和 Pod。

Kubernetes / Compute Resources / Pod

可以使用屏幕右上角的控件在所有 Grafana 仪表板上自定义时间范围。您可以使用时间范围选择器旁边的按钮刷新数据或更改自动刷新间隔。

5.使用 Alertmanager 配置警报

监控必须自动化才能有效。当重要指标超出预期时,例如当内存消耗出现峰值时,您需要收到警报。否则,您必须不断检查仪表板或运行查询以确定是否需要采取措施。

Prometheus 包含 Alertmanager,可在指标触发警报时向您发送通知。Alertmanager 支持多个接收器,这些接收器充当警报的目的地,例如电子邮件、Slack、消息应用程序和您自己的 Webhook。

Kube-Prometheus-Stack 的捆绑 Alertmanager 是通过在使用 Helm 部署时合并自定义 chart values 来配置的。首先,准备一个 YAML 文件,该文件将 Alertmanager 设置嵌套在顶级 alertmanager 键下。下面是一个将所有警报发送到 Webhook URL 的示例:

alertmanager:
  config:
    global:
      resolve_timeout: 5m
    route:
      receiver: demo-webhook
      group_wait: 5s
      group_interval: 10s
      repeat_interval: 1h
    receivers:
      - name: "null"
      - name: demo-webhook
        webhook_configs:
          - url: http://example.com/webhook
            send_resolved: true

路由部分指定警报应定向到 demo-webhook 接收器。这配置为 在每次触发或解决警报时向 http://example.com/webhook 发送 POST 请求。请求的有效负载在 Alertmanager 文档中进行了描述 。请注意,需要额外的 “null” 接收器是为了规避一些 Alertmanager 版本的 bug。

将 YAML 文件保存到工作目录中的 alertmanager-config.yaml 中。接下来,运行以下命令重新部署 Prometheus 堆栈并应用您的 Alertmanager 设置:

$ helm upgrade --reuse-values \
  -f alertmanager-config.yaml \
  -n kube-prometheus-stack \
  kube-prometheus-stack
  prometheus-community/kube-prometheus-stack

别担心 - 您不会丢失任何现有数据。该命令执行部署的就地升级。

部署完成后,Alertmanager 可能需要几分钟才能重新加载其配置。然后,随着警报的触发,您将开始接收对 Webhook URL 的请求。

要发送测试警报,请首先启动到 Alertmanager 实例的端口转发会话:

$ kubectl port-forward -n kube-prometheus-stack svc/kube-prometheus-stack-alertmanager 9093:9093

接下来,运行以下命令以模拟从特定命名空间中的 Kubernetes 服务触发警报:

$ curl -H 'Content-Type: application/json' -d '[{"labels":{"alertname":"alert-demo","namespace":"demo","service":"demo"}}]' http://127.0.0.1:9093/api/v1/alerts

片刻之后,您应该会收到对 Webhook URL 的请求。请求正文将描述警报的详细信息。

Kubernetes Prometheus 最佳实践

将 Prometheus 与 Kubernetes 一起使用时,应考虑以下事项:

  1. 对 K8s 使用 Prometheus operator
  2. 配置 service monitors
  3. 利用 K8s 标签和注释
  4. 利用 Prometheus 的持久存储
  5. 设置 Alertmanager
  6. 监控 Prometheus 性能
  7. 保护您的 Prometheus 实例
  8. 定期更新

1. 对 K8s 使用 Prometheus operator

使用 Prometheus operator 部署 Prometheus 将有助于自动管理 Prometheus 实例及其配置。

这将允许您使用 K8s CRD 以声明方式定义您的监控要求。

2. 配置 service monitors

service monitors 用于根据标签和注释动态发现和配置 K8s 集群内部的监控目标。

3. 利用 K8s 标签和注释

标签和注释是组织 K8s 集群内资源的关键,可以更轻松地定义要监控的内容。为您的 K8s 资源使用有意义的标签,并将这些标签用于动态和灵活的监控设置,是使您的集成有价值的关键。

4. 利用 Prometheus 的持久存储

Prometheus 使用时间序列数据库来存储您的数据。如果没有持久存储,如果重新启动 Prometheus Pod,则可能会丢失收集的所有数据。这里的最佳实践是在 K8s 中使用持久卷 (PV),以确保您的 Prometheus 数据在重新启动后保留。

5. 设置 Alertmanager

Prometheus 的 Alertmanager 负责对客户端应用程序发送的警报进行重复数据删除、分组和路由。您应该将其配置为有效管理警报,还可以利用它根据警报的严重性或您定义的其他方面将这些警报发送到电子邮件、Slack 甚至其他通知渠道。

6. 监控 Prometheus 性能

即使在这种情况下使用 Prometheus 来监控与 K8s 集群相关的方面,监控其性能也至关重要,以确保它不会成为瓶颈。如果您的目标数量较多或指标较高,请根据需要调整分配给 Prometheus 的资源。

7. 保护您的 Prometheus 实例

当涉及到基础设施组件时,您应该始终注意保护它们,Prometheus 也不例外。防止未经授权访问您的监控数据至关重要,因此您应该使用 K8s RBAC 来控制访问,并为 Prometheus 的端点和 Web 界面启用 HTTPS。

8. 定期更新

使 Prometheus 和 Operator 保持最新状态可确保您在 Prometheus 实例中拥有最新的安全补丁、功能和性能改进。

要点

良好的可观测性对于运行生产工作负载的 Kubernetes 集群至关重要。你需要了解资源利用率,查看 Pod 的调度位置,并跟踪应用程序发出的错误和日志。

Kube-Prometheus-Stack 是为集群设置监控的便捷途径。它为您配置 Prometheus、Grafana、Alertmanager 和重要指标导出器,从而减少维护开销。基本安装附带有用的预构建仪表板,您可以使用从自己的应用程序中抓取的自定义查询和指标进行扩展。为 Prometheus 检测系统是一个复杂的主题,但您可以通过探索官方客户端库来开始,以从代码中导出指标。

作者:James Walker 是 Heron Web 的创始人,这是一家总部位于英国的软件开发工作室,为中小企业提供定制解决方案。他拥有使用 DevOps、CI/CD、Docker 和 Kubernetes 管理完整的端到端 Web 开发工作流程的经验。James 还是一名技术作家,撰写了大量关于软件开发生命周期、当前行业趋势以及 DevOps 概念和技术的文章。


原文链接:https://spacelift.io/blog/prometheus-kubernetes


译者:巴辉特,开源监控项目 Open-Falcon、Nightingale 创始人,极客时间专栏《运维监控系统实战笔记》作者,快猫星云联合创始人。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
OpenSource
开源版
Flashcat
Flashcat