如何在 DigitalOcean Kubernetes 上设置 Prometheus、Grafana 和 Alertmanager 监控堆栈

2025-06-08

如何在 DigitalOcean Kubernetes 上设置 Prometheus、Grafana 和 Alertmanager 监控堆栈

介绍

除了跟踪和日志记录之外,监控和警报也是 Kubernetes 可观测性堆栈的重要组成部分。为 DigitalOcean Kubernetes 集群设置监控功能,可以跟踪资源使用情况并分析和调试应用程序错误。

监控系统通常由一个包含指标数据的时间序列数据库和一个可视化层组成。此外,警报层负责创建和管理警报,并根据需要将其传递给集成和外部服务。最后,一个或多个组件生成或公开指标数据,这些数据将由堆栈存储、可视化和处理,以用于警报。

一种流行的监控解决方案是开源的PrometheusGrafanaAlertmanager堆栈,与kube-state-metricsnode_exporter一起部署,以公开集群级 Kubernetes 对象指标以及 CPU 和内存使用情况等机器级指标。

在 Kubernetes 集群上部署此监控堆栈需要配置各个组件、清单、Prometheus 指标和 Grafana 仪表板,这可能需要一些时间。DigitalOcean社区开发者教育团队发布的《 DigitalOcean Kubernetes 集群监控快速入门》包含 Prometheus-Grafana-Alertmanager 集群监控堆栈的完整清单,以及一组预配置的警报和 Grafana 仪表板。它可以帮助您快速启动并运行,并为构建可观测性堆栈奠定坚实的基础。

在本教程中,我们将在 DigitalOcean Kubernetes 上部署这个预配置的堆栈,访问 Prometheus、Grafana 和 Alertmanager 接口,并描述如何自定义它。

先决条件

在开始之前,您需要一个可用的DigitalOcean Kubernetes 集群,并在本地开发环境中安装以下工具:

  • 命令kubectl行界面已安装在您的本地计算机上,并配置为连接到您的集群。您可以kubectl 在其官方文档中了解有关安装和配置的更多信息。
  • 本地计算机上安装的git版本控制系统。要了解如何在 Ubuntu 18.04 上安装 git,请参阅如何在 Ubuntu 18.04 上安装 Git
  • 本地计算机上已安装Coreutils base64工具。如果您使用的是 Linux 系统,该工具很可能已安装。如果您使用的是 OS X 系统,则可以使用openssl base64默认安装的 。

注意:集群监控快速入门仅在 DigitalOcean Kubernetes 集群上测试过。要在其他 Kubernetes 集群中使用本快速入门,可能需要对清单文件进行一些修改。

第 1 步 - 克隆 GitHub 存储库并配置环境变量

首先,使用 git 将 DigitalOcean Kubernetes Cluster Monitoring GitHub 存储库克隆到本地计算机上:

git clone git@github.com:do-community/doks-monitoring.git
Enter fullscreen mode Exit fullscreen mode

然后,导航到 repo:

cd doks-monitoring
Enter fullscreen mode Exit fullscreen mode

您应该看到以下目录结构:

ls
Enter fullscreen mode Exit fullscreen mode
Output
LICENSE
README.md
changes.txt
manifest
Enter fullscreen mode Exit fullscreen mode

manifest目录包含所有监控堆栈组件的 Kubernetes 清单,包括服务帐户部署StatefulSetConfigMaps等。要了解有关这些清单文件以及如何配置它们的更多信息,请跳至配置监控堆栈

如果您只是想让一切启动并运行,请首先设置APP_INSTANCE_NAMENAMESPACE环境变量,这些变量将用于为堆栈的组件配置唯一名称,并配置将部署堆栈的命名空间:

export APP_INSTANCE_NAME=sammy-cluster-monitoring
export NAMESPACE=default
Enter fullscreen mode Exit fullscreen mode

在本教程中,我们设置APP_INSTANCE_NAMEsammy-cluster-monitoring,它将添加到所有监控堆栈 Kubernetes 对象名称的前面。您应该用一个唯一的描述性前缀来替换您的监控堆栈。我们还将命名空间设置为。如果您想将监控堆栈部署到以外的命名default空间,请确保首先在集群中创建它:default

kubectl create namespace "$NAMESPACE"
Enter fullscreen mode Exit fullscreen mode

您应该看到以下输出:

Output
namespace/sammy created
Enter fullscreen mode Exit fullscreen mode

在这种情况下,NAMESPACE环境变量设置为sammy。在本教程的其余部分,我们将假定NAMESPACE已设置为default

现在,使用该base64命令对安全的 Grafana 密码进行 base64 编码。请务必将 替换为您选择的密码<span class="highlight">your_grafana_password</span>

export GRAFANA_GENERATED_PASSWORD="$(echo -n 'your_grafana_password' | base64)"
Enter fullscreen mode Exit fullscreen mode

如果您使用的是 macOS,则可以替换openssl base64默认安装的命令。

此时,您已获取堆栈的 Kubernetes 清单并配置了所需的环境变量,因此现在可以将配置的变量替换到 Kubernetes 清单文件中并在 Kubernetes 集群中创建堆栈。

第 2 步 - 创建监控堆栈

DigitalOcean Kubernetes 监控快速入门 repo 包含以下监控、抓取和可视化组件的清单:

  • Prometheus是一个时间序列数据库和监控工具,其工作原理是轮询指标端点,并抓取和处理这些端点公开的数据。它允许您使用时间序列数据查询语言PromQL查询这些数据。Prometheus 将以StatefulSet 的形式部署到集群中,该 StatefulSet包含 2 个副本,并使用DigitalOcean Block Storage 的持久卷。此外,一组预配置的 Prometheus 警报、规则和作业将存储为ConfigMap。要了解更多信息,请跳至配置监控堆栈中的Prometheus部分。
  • Alertmanager通常与 Prometheus 一起部署,构成堆栈的警报层,处理 Prometheus 生成的警报,并对其进行去重、分组和路由到电子邮件或PagerDuty等集成。Alertmanager 将作为包含 2 个副本的 StatefulSet 安装。要了解有关 Alertmanager 的更多信息,请参阅Prometheus 文档中的“警报”部分。
  • Grafana是一款数据可视化和分析工具,可让您为指标数据构建仪表板和图表。Grafana 将以 StatefulSet 的形式安装,其中包含一个副本。此外,由kubernetes-mixin生成的一组预配置仪表板将存储为 ConfigMap。
  • kube-state-metrics是一个附加代理,它监听 Kubernetes API 服务器并生成有关 Kubernetes 对象(例如 Deployment 和 Pod)状态的指标。这些指标以纯文本形式在 HTTP 端点上提供,并由 Prometheus 使用。kube-state-metrics 将安装为具有一个副本的可自动伸缩Deployment 。
  • node-exporter是一个 Prometheus 导出器,运行在集群节点上,并向 Prometheus 提供操作系统和硬件指标(例如 CPU 和内存使用情况)。这些指标也以纯文本形式在 HTTP 端点上提供,并由 Prometheus 使用。node-exporter 将作为DaemonSet安装

默认情况下,除了由 node-exporter、kube-state-metrics 和上面列出的其他组件生成的抓取指标外,Prometheus 还将配置为从以下组件抓取指标:

  • kube-apiserver,Kubernetes API 服务器
  • kubelet,与 kube-apiserver 交互以管理节点上的 Pod 和容器的主要节点代理。
  • cAdvisor是一个节点代理,可以发现正在运行的容器并收集其 CPU、内存、文件系统和网络使用情况指标。

要了解有关配置这些组件和 Prometheus 抓取作业的更多信息,请跳至配置监控堆栈。现在,我们将上一步中定义的环境变量替换到仓库的清单文件中,并将各个清单连接到单个主文件中。

首先使用awkenvsubst填写仓库清单文件中的APP_INSTANCE_NAMENAMESPACE和变量。替换变量值后,这些文件将被合并并保存到名为 的主清单文件中GRAFANA_GENERATED_PASSWORD<span class="highlight">sammy-cluster-monitoring</span>_manifest.yaml

awk 'FNR==1 {print "---"}{print}' manifest/* \
 | envsubst '$APP_INSTANCE_NAME $NAMESPACE $GRAFANA_GENERATED_PASSWORD' \
 > "${APP_INSTANCE_NAME}_manifest.yaml"
Enter fullscreen mode Exit fullscreen mode

您应该考虑将此文件存储在版本控制中,以便跟踪监控堆栈的更改并回滚到以前的版本。如果这样做,请务必admin-password从文件中清除该变量,以免将 Grafana 密码签入版本控制。

现在您已经生成了主清单文件,请使用它kubectl apply -f来应用清单并在您​​配置的命名空间中创建堆栈:

kubectl apply -f "${APP_INSTANCE_NAME}_manifest.yaml" --namespace "${NAMESPACE}"
Enter fullscreen mode Exit fullscreen mode

您应该看到类似以下内容的输出:

Output
serviceaccount/alertmanager created
configmap/sammy-cluster-monitoring-alertmanager-config created
service/sammy-cluster-monitoring-alertmanager-operated created
service/sammy-cluster-monitoring-alertmanager created

. . .

clusterrolebinding.rbac.authorization.k8s.io/prometheus created
configmap/sammy-cluster-monitoring-prometheus-config created
service/sammy-cluster-monitoring-prometheus created
statefulset.apps/sammy-cluster-monitoring-prometheus created
Enter fullscreen mode Exit fullscreen mode

您可以使用 跟踪堆栈的部署进度kubectl get all。所有堆栈组件完成后RUNNING,您可以通过 Grafana Web 界面访问预配置的 Grafana 仪表板。

第3步 - 访问Grafana并探索指标数据

Grafana 服务清单将 Grafana 公开为ClusterIP服务,这意味着它只能通过集群内部 IP 地址访问。要在 Kubernetes 集群外部访问 Grafana,您可以使用kubectl patch就地将服务更新为面向公众的类型(例如NodePortLoadBalancer),或者kubectl port-forward将本地端口转发到 Grafana Pod 端口。在本教程中,我们将转发端口,因此您可以直接跳到转发本地端口以访问 Grafana 服务。以下关于外部公开 Grafana 的部分仅供参考。

使用负载均衡器公开 Grafana 服务(可选)

如果您想使用外部公共 IP 为 Grafana 创建 DigitalOcean 负载均衡器,请使用kubectl patch将现有的 Grafana 服务就地更新为LoadBalancer服务类型:

kubectl patch svc "$APP_INSTANCE_NAME-grafana" \
  --namespace "$NAMESPACE" \
  -p '{"spec": {"type": "LoadBalancer"}}'
Enter fullscreen mode Exit fullscreen mode

kubectlpatch命令允许您就地更新 Kubernetes 对象,而无需重新部署这些对象。您还可以直接修改主清单文件,type: LoadBalancerGrafana 服务规范添加参数。要了解有关kubectl patchKubernetes 服务类型的更多信息,您可以查阅Kubernetes 官方文档中的“使用 kubectl patch 就地更新 API 对象”“服务”资源。

运行上述命令后,您应该看到以下内容:

Output
service/sammy-cluster-monitoring-grafana patched
Enter fullscreen mode Exit fullscreen mode

创建负载均衡器并为其分配公网 IP 可能需要几分钟时间。您可以使用以下命令并添加以下-w标志来跟踪其进度,以监视更改:

kubectl get service "$APP_INSTANCE_NAME-grafana" -w
Enter fullscreen mode Exit fullscreen mode

一旦创建了 DigitalOcean 负载均衡器并分配了外部 IP 地址,您就可以使用以下命令获取其外部 IP:

SERVICE_IP=$(kubectl get svc $APP_INSTANCE_NAME-grafana \
  --namespace $NAMESPACE \
  --output jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo "http://${SERVICE_IP}/"
Enter fullscreen mode Exit fullscreen mode

您现在可以通过导航到 来访问 Grafana UI http://<span class="highlight">SERVICE_IP</span>/

转发本地端口以访问 Grafana 服务

如果您不想在外部公开 Grafana 服务,您也可以3000使用将本地端口直接转发到集群中的 Grafana Pod kubectl port-forward

kubectl port-forward --namespace ${NAMESPACE} ${APP_INSTANCE_NAME}-grafana-0 3000
Enter fullscreen mode Exit fullscreen mode

您应该看到以下输出:

Output
Forwarding from 127.0.0.1:3000 -> 3000
Forwarding from [::1]:3000 -> 3000
Enter fullscreen mode Exit fullscreen mode

这会将本地端口转发3000containerPort 3000Grafana Pod <span class="highlight">sammy-cluster-monitoring</span>-grafana-0。要了解有关将端口转发到 Kubernetes 集群的更多信息,请参阅使用端口转发访问集群中的应用程序

在您的 Web 浏览器中访问http://localhost:3000。您应该看到以下 Grafana 登录页面:

Grafana登录页面

要登录,请使用默认用户名admin(如果您没有修改admin-user参数)和您在步骤 1 中配置的密码。

您将被带到以下主页仪表板

Grafana主页

在左侧导航栏中,选择“仪表板”按钮,然后单击“管理”

Grafana 仪表板选项卡

您将进入以下仪表板管理界面,其中列出了dashboards-configmap.yaml清单中配置的仪表板:

Grafana仪表板列表

kubernetes-mixin这些仪表板由开源项目 kubernetes-mixin生成,该项目允许您创建一套标准化的集群监控 Grafana 仪表板和 Prometheus 警报。要了解更多信息,请参阅kubernetes-mixin GitHub 仓库 kubernetes-mixin

单击Kubernetes / Nodes仪表板,该仪表板可直观显示给定节点的 CPU、内存、磁盘和网络使用情况:

Grafana 节点仪表板

描述如何使用这些仪表板超出了本教程的范围,但您可以查阅以下资源以了解更多信息:

下一步,我们将按照类似的流程连接并探索Prometheus监控系统。

第4步 - 访问Prometheus和Alertmanager

要连接到 Prometheus Pod,我们可以使用kubectl port-forward来转发本地端口。如果您已经完成了 Grafana 的探索,可以点击 来关闭端口转发隧道CTRL-C。或者,您可以打开一个新的 shell 并创建一个新的端口转发连接。

首先列出default命名空间中正在运行的 Pod:

kubectl get pod -n default
Enter fullscreen mode Exit fullscreen mode

您应该看到以下 Pod:

Output
sammy-cluster-monitoring-alertmanager-0                      1/1     Running   0          17m
sammy-cluster-monitoring-alertmanager-1                      1/1     Running   0          15m
sammy-cluster-monitoring-grafana-0                           1/1     Running   0          16m
sammy-cluster-monitoring-kube-state-metrics-d68bb884-gmgxt   2/2     Running   0          16m
sammy-cluster-monitoring-node-exporter-7hvb7                 1/1     Running   0          16m
sammy-cluster-monitoring-node-exporter-c2rvj                 1/1     Running   0          16m
sammy-cluster-monitoring-node-exporter-w8j74                 1/1     Running   0          16m
sammy-cluster-monitoring-prometheus-0                        1/1     Running   0          16m
sammy-cluster-monitoring-prometheus-1                        1/1     Running   0          16m
Enter fullscreen mode Exit fullscreen mode

我们将把本地端口转发9090到Pod9090的端口<span class="highlight">sammy-cluster-monitoring</span>-prometheus-0

kubectl port-forward --namespace ${NAMESPACE} sammy-cluster-monitoring-prometheus-0 9090
Enter fullscreen mode Exit fullscreen mode

您应该看到以下输出:

Output
Forwarding from 127.0.0.1:9090 -> 9090
Forwarding from [::1]:9090 -> 9090
Enter fullscreen mode Exit fullscreen mode

这表明本地端口9090已成功转发到 Prometheus Pod。

在您的 Web 浏览器中访问http://localhost:9090。您应该看到以下 Prometheus Graph页面:

Prometheus 图表页面

在这里,您可以使用 Prometheus 查询语言 PromQL 来选择和聚合存储在其数据库中的时间序列指标。要了解有关 PromQL 的更多信息,请参阅Prometheus 官方文档中的“查询 Prometheus” 。

在Expression字段中,输入kubelet_node_name并点击Execute。您应该看到一个时间序列列表,其中包含kubelet_node_name报告 Kubernetes 集群中节点的指标。您可以在指标标签中看到哪个节点生成了该指标,以及哪个作业抓取了该指标:

Prometheus查询结果

最后,在顶部导航栏中,点击“状态”,然后点击“目标”,查看 Prometheus 已配置的抓取目标列表。您应该会看到与步骤 2开头描述的监控端点列表相对应的目标列表。

要了解有关 Prometheus 的更多信息以及如何查询集群指标,请查阅官方Prometheus 文档

要连接到管理 Prometheus 生成的警报的 Alertmanager,我们将遵循与连接 Prometheus 类似的过程。通常,您可以通过单击Prometheus 顶部导航栏中的“警报”来探索 Alertmanager 警报。

要连接到 Alertmanager Pod,我们将再次使用kubectl port-forward转发本地端口。如果您已完成对 Prometheus 的探索,可以点击 来关闭端口转发隧道CTRL-C,或者打开新的 shell 来创建新的连接。

我们将把本地端口转发9093到Pod9093的端口<span class="highlight">sammy-cluster-monitoring</span>-alertmanager-0

kubectl port-forward --namespace ${NAMESPACE} sammy-cluster-monitoring-alertmanager-0 9093
Enter fullscreen mode Exit fullscreen mode

您应该看到以下输出:

Output
Forwarding from 127.0.0.1:9093 -> 9093
Forwarding from [::1]:9093 -> 9093
Enter fullscreen mode Exit fullscreen mode

这表明本地端口9093已成功转发到 Alertmanager Pod。

在您的 Web 浏览器中访问http://localhost:9093。您将看到以下 Alertmanager Alerts页面:

Alertmanager 警报页面

从这里,您可以探索如何触发警报,并可选择将其静音。要了解有关 Alertmanager 的更多信息,请参阅Alertmanager 官方文档

在下一步中,您将学习如何选择性地配置和扩展一些监控堆栈组件。

第 6 步 - 配置监控堆栈(可选)

可以修改 DigitalOcean Kubernetes Cluster Monitoring Quickstart 存储库中包含的清单以使用不同的容器映像、不同数量的 Pod 副本、不同的端口和自定义配置文件。

在此步骤中,我们将提供每个清单用途的高级概述,然后演示如何通过修改主清单文件将 Prometheus 扩展到 3 个副本。

首先,导航到manifestsrepo 中的子目录,并列出目录的内容:

cd manifest
ls
Enter fullscreen mode Exit fullscreen mode
Output
alertmanager-0serviceaccount.yaml
alertmanager-configmap.yaml
alertmanager-operated-service.yaml
alertmanager-service.yaml
. . .
node-exporter-ds.yaml
prometheus-0serviceaccount.yaml
prometheus-configmap.yaml
prometheus-service.yaml
prometheus-statefulset.yaml
Enter fullscreen mode Exit fullscreen mode

您可以在这里找到不同监控堆栈组件的清单。要了解有关清单中特定参数的更多信息,请点击链接并查阅 YAML 文件中的注释:

警报管理器

格拉法纳

kube 状态指标

节点导出器

普罗米修斯

示例:扩展 Prometheus

为了演示如何修改监控堆栈,我们将 Prometheus 副本的数量从 2 扩展到 3。

<span class="highlight">sammy-cluster-monitoring</span>_manifest.yaml使用您选择的编辑器打开主清单文件:

nano sammy-cluster-monitoring_manifest.yaml
Enter fullscreen mode Exit fullscreen mode

向下滚动到清单的 Prometheus StatefulSet 部分:

Output
. . .
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
  name: sammy-cluster-monitoring-prometheus
  labels: &Labels
    k8s-app: prometheus
    app.kubernetes.io/name: sammy-cluster-monitoring
    app.kubernetes.io/component: prometheus
spec:
  serviceName: "sammy-cluster-monitoring-prometheus"
  replicas: 2
  podManagementPolicy: "Parallel"
  updateStrategy:
    type: "RollingUpdate"
  selector:
    matchLabels: *Labels
  template:
    metadata:
      labels: *Labels
    spec:
. . .
Enter fullscreen mode Exit fullscreen mode

将副本数从 2 更改为 3:

Output
. . .
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
  name: sammy-cluster-monitoring-prometheus
  labels: &Labels
    k8s-app: prometheus
    app.kubernetes.io/name: sammy-cluster-monitoring
    app.kubernetes.io/component: prometheus
spec:
  serviceName: "sammy-cluster-monitoring-prometheus"
  replicas: 3
  podManagementPolicy: "Parallel"
  updateStrategy:
    type: "RollingUpdate"
  selector:
    matchLabels: *Labels
  template:
    metadata:
      labels: *Labels
    spec:
. . .
Enter fullscreen mode Exit fullscreen mode

完成后,保存并关闭文件。

使用以下方式应用更改kubectl apply -f

kubectl apply -f sammy-cluster-monitoring_manifest.yaml --namespace default
Enter fullscreen mode Exit fullscreen mode

您可以使用 跟踪进度kubectl get pods。使用相同的技术,您可以更新许多 Kubernetes 参数以及此可观察性堆栈的大部分配置。

结论

在本教程中,您在 DigitalOcean Kubernetes 集群中安装了 Prometheus、Grafana 和 Alertmanager 监控堆栈,并配备了一组标准的仪表板、Prometheus 规则和警报。

您也可以选择使用Helm Kubernetes 包管理器部署此监控堆栈。要了解更多信息,请参阅如何使用 Helm 和 Prometheus 设置 DigitalOcean Kubernetes 集群监控。另一种启动并运行此堆栈的方法是使用 DigitalOcean Marketplace Kubernetes 监控堆栈解决方案(目前处于测试阶段)。

DigitalOcean Kubernetes 集群监控快速入门代码库主要基于 Google Cloud Platform 的点击部署 Prometheus 解决方案,并对其进行了修改。完整修改清单可在快速入门代码库的changes.md文件中找到。


CC 4.0许可证

本作品采用Creative Commons Attribution-NonCommercial-ShareAlike 4.0 国际许可协议进行许可

鏂囩珷鏉ユ簮锛�https://dev.to/digitalocean/how-to-set-up-a-prometheus-grafana-and-alertmanager-monitoring-stack-on-digitalocean-kubernetes-268j
PREV
什么是不可变基础设施?
NEXT
如何在一台 Ubuntu 18.04 服务器上将 Nginx 配置为 Web 服务器和 Apache 的反向代理