如何在DigitalOcean上使用Prometheus、Grafana和Alertmanager设置Kubernetes监控堆栈
状态: 已弃用
本文已弃用,不再维护。
原因
本教程中的步骤仍然有效,但会产生一个现在不必要地难以维护的配置。
请参阅
本文可能仍可用作参考,但可能未遵循最佳实践。 我们强烈建议使用更新的文章。
介绍
除了跟踪和日志记录之外,监控和警报也是 Kubernetes 可观察性堆栈的重要组成部分。 为您的 DigitalOcean Kubernetes 集群设置监控可让您跟踪资源使用情况并分析和调试应用程序错误。
监控系统通常由包含度量数据的时间序列数据库和可视化层组成。 此外,警报层创建和管理警报,并在必要时将它们移交给集成和外部服务。 最后,一个或多个组件生成或公开度量数据,这些数据将由堆栈存储、可视化和处理以用于警报。
一种流行的监控解决方案是开源的 Prometheus、Grafana 和 Alertmanager 堆栈,与 kube-state-metrics 和 一起部署X174X]node_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 https://github.com/do-community/doks-monitoring.git
然后,导航到 repo:
cd doks-monitoring
您应该看到以下目录结构:
ls
OutputLICENSE README.md changes.txt manifest
manifest
目录包含所有监控堆栈组件的 Kubernetes 清单,包括 Service Accounts、Deployments、StatefulSets、ConfigMaps[ X194X]等。 要了解有关这些清单文件以及如何配置它们的更多信息,请跳至 配置监控堆栈 。
如果您只是想启动并运行,首先设置 APP_INSTANCE_NAME
和 NAMESPACE
环境变量,这将用于为堆栈组件配置唯一名称并配置 堆栈将部署到的命名空间:
export APP_INSTANCE_NAME=sammy-cluster-monitoring export NAMESPACE=default
在本教程中,我们将 APP_INSTANCE_NAME
设置为 sammy-cluster-monitoring
,这将添加所有监控堆栈 Kubernetes 对象名称。 您应该为您的监控堆栈替换一个唯一的描述性前缀。 我们还将命名空间设置为 default
。 如果您想将监控堆栈部署到命名空间 other 而不是 default
,请确保首先在集群中创建它:
kubectl create namespace "$NAMESPACE"
您应该看到以下输出:
Outputnamespace/sammy created
在这种情况下,NAMESPACE
环境变量设置为 sammy
。 在本教程的其余部分,我们将假设 NAMESPACE
已设置为 default
。
现在,使用 base64
命令对安全的 Grafana 密码进行 base64 编码。 请务必将您选择的密码替换为 your_grafana_password
:
export GRAFANA_GENERATED_PASSWORD="$(echo -n 'your_grafana_password' | base64)"
如果您使用的是 macOS,您可以替换默认安装的 openssl base64
命令。
此时,您已经获取了堆栈的 Kubernetes 清单并配置了所需的环境变量,因此您现在可以将配置的变量替换为 Kubernetes 清单文件并在您的 Kubernetes 集群中创建堆栈。
第 2 步 — 创建监控堆栈
DigitalOcean Kubernetes Monitoring Quickstart repo 包含以下监控、抓取和可视化组件的清单:
- Prometheus 是一个时间序列数据库和监控工具,它通过轮询指标端点并抓取和处理这些端点公开的数据来工作。 它允许您使用时间序列数据查询语言 PromQL 来查询这些数据。 Prometheus 将作为具有 2 个副本的 StatefulSet 部署到集群中,这些副本使用 Persistent Volumes 和 DigitalOcean Block Storage。 此外,一组预配置的 Prometheus 警报、规则和作业将存储为 ConfigMap。 要了解有关这些的更多信息,请跳至配置监控堆栈的 Prometheus 部分。
- Alertmanager,通常与 Prometheus 一起部署,形成堆栈的警报层,处理 Prometheus 生成的警报,并对它们进行重复数据删除、分组和路由到电子邮件或 PagerDuty 等集成。 Alertmanager 将安装为具有 2 个副本的 StatefulSet。 要了解有关 Alertmanager 的更多信息,请参阅 Prometheus 文档中的 Alerting 。
- Grafana 是一种数据可视化和分析工具,可让您为指标数据构建仪表板和图表。 Grafana 将作为带有一个副本的 StatefulSet 安装。 此外,kubernetes-mixin 生成的一组预先配置的 Dashboard 将存储为 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 抓取作业的更多信息,请跳至 配置监控堆栈 。 我们现在将在上一步中定义的环境变量替换到 repo 的清单文件中,并将各个清单连接到一个主文件中。
首先使用 awk
和 envsubst
填写存储库清单文件中的 APP_INSTANCE_NAME
、NAMESPACE
和 GRAFANA_GENERATED_PASSWORD
变量。 代入变量值后,文件将被合并并保存到名为 sammy-cluster-monitoring_manifest.yaml
的主清单文件中。
awk 'FNR==1 {print "---"}{print}' manifest/* \ | envsubst '$APP_INSTANCE_NAME $NAMESPACE $GRAFANA_GENERATED_PASSWORD' \ > "${APP_INSTANCE_NAME}_manifest.yaml"
您应该考虑将此文件存储在版本控制中,以便您可以跟踪监控堆栈的更改并回滚到以前的版本。 如果这样做,请务必从文件中清除 admin-password
变量,以免将 Grafana 密码检查到版本控制中。
现在您已经生成了主清单文件,使用 kubectl apply -f
应用清单并在您配置的命名空间中创建堆栈:
kubectl apply -f "${APP_INSTANCE_NAME}_manifest.yaml" --namespace "${NAMESPACE}"
您应该会看到类似于以下内容的输出:
Outputserviceaccount/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
您可以使用 kubectl get all
跟踪堆栈的部署进度。 一旦所有堆栈组件都是 RUNNING
,您就可以通过 Grafana Web 界面访问预配置的 Grafana 仪表板。
第 3 步 — 访问 Grafana 并探索指标数据
Grafana 服务清单将 Grafana 公开为 ClusterIP
服务,这意味着它只能通过集群内部 IP 地址访问。 要在 Kubernetes 集群之外访问 Grafana,您可以使用 kubectl patch
将服务就地更新为面向公众的类型,例如 NodePort
或 LoadBalancer
或 [X170X ] 将本地端口转发到 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"}}'
kubectl patch
命令允许您就地更新 Kubernetes 对象以进行更改,而无需重新部署对象。 您也可以直接修改主清单文件,在 Grafana Service spec 中添加 type: LoadBalancer
参数。 要了解更多关于 kubectl patch
和 Kubernetes 服务类型的信息,您可以参考 Kubernetes 官方文档中的 使用 kubectl 补丁 和 Services 就地更新 API 对象资源。
运行上述命令后,您应该看到以下内容:
Outputservice/sammy-cluster-monitoring-grafana patched
创建负载均衡器并为其分配公共 IP 可能需要几分钟时间。 您可以使用以下带有 -w
标志的命令来跟踪其进度以观察更改:
kubectl get service "$APP_INSTANCE_NAME-grafana" -w
创建 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}/"
您现在可以通过导航到 http://SERVICE_IP/
来访问 Grafana UI。
转发本地端口访问 Grafana 服务
如果不想对外暴露 Grafana Service,也可以使用 kubectl port-forward
将本地端口 3000
直接转发到集群中的 Grafana Pod。
kubectl port-forward --namespace ${NAMESPACE} ${APP_INSTANCE_NAME}-grafana-0 3000
您应该看到以下输出:
OutputForwarding from 127.0.0.1:3000 -> 3000 Forwarding from [::1]:3000 -> 3000
这会将本地端口 3000
转发到 Grafana Pod sammy-cluster-monitoring-grafana-0
的 containerPort
3000
。 要了解有关将端口转发到 Kubernetes 集群的更多信息,请参阅 使用端口转发访问集群中的应用程序。
在您的网络浏览器中访问 http://localhost:3000
。 您应该看到以下 Grafana 登录页面:
要登录,请使用默认用户名 admin
(如果您尚未修改 admin-user
参数)和您在步骤 1 中配置的密码。
您将被带到以下 Home Dashboard:
在左侧导航栏中,选择Dashboards按钮,然后点击Manage:
您将进入以下仪表板管理界面,其中列出了 dashboards-configmap.yaml 清单中配置的仪表板:
这些仪表板由 kubernetes-mixin
生成,这是一个开源项目,允许您创建一组标准化的集群监控 Grafana 仪表板和 Prometheus 警报。 要了解更多信息,请参阅 kubernetes-mixin GitHub 存储库 。
单击 Kubernetes / Nodes 仪表板,它可以可视化给定节点的 CPU、内存、磁盘和网络使用情况:
描述如何使用这些仪表板超出了本教程的范围,但您可以查阅以下资源以了解更多信息:
- 要了解有关分析系统性能的 USE 方法的更多信息,您可以查阅 Brendan Gregg 的 The Utilization Saturation and Errors (USE) Method 页面。
- Google 的 SRE Book 是另一个有用的资源,特别是第 6 章:监控分布式系统。
- 要了解如何构建自己的 Grafana 仪表板,请查看 Grafana 的 入门 页面。
在下一步中,我们将按照类似的流程连接并探索 Prometheus 监控系统。
第 4 步 - 访问 Prometheus 和 Alertmanager
要连接到 Prometheus Pods,我们可以使用 kubectl port-forward
转发本地端口。 如果您完成了对 Grafana 的探索,您可以通过点击 CTRL-C
关闭端口转发隧道。 或者,您可以打开一个新的 shell 并创建一个新的端口转发连接。
首先列出 default
命名空间中正在运行的 Pod:
kubectl get pod -n default
您应该看到以下 Pod:
Outputsammy-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
我们要将本地端口 9090
转发到 sammy-cluster-monitoring-prometheus-0
Pod 的端口 9090
:
kubectl port-forward --namespace ${NAMESPACE} sammy-cluster-monitoring-prometheus-0 9090
您应该看到以下输出:
OutputForwarding from 127.0.0.1:9090 -> 9090 Forwarding from [::1]:9090 -> 9090
这表明本地端口 9090
正在成功转发到 Prometheus Pod。
在您的网络浏览器中访问 http://localhost:9090
。 您应该会看到以下 Prometheus Graph 页面:
从这里您可以使用 PromQL(Prometheus 查询语言)来选择和聚合存储在其数据库中的时间序列指标。 要了解有关 PromQL 的更多信息,请参阅 Prometheus 官方文档中的 Querying Prometheus。
在 Expression 字段中,输入 kubelet_node_name
并点击 Execute。 您应该会看到一个时间序列列表,其指标为 kubelet_node_name
,用于报告 Kubernetes 集群中的节点。 您可以在指标标签中查看哪个节点生成了指标以及哪个作业刮取了指标:
最后,在顶部导航栏中,点击 Status 然后点击 Targets 可以看到 Prometheus 已经配置为抓取的目标列表。 您应该会看到与 Step 2 开头描述的监控端点列表相对应的目标列表。
要了解有关 Prometheus 以及如何查询集群指标的更多信息,请参阅 Prometheus 官方文档 。
要连接到管理 Prometheus 生成的警报的 Alertmanager,我们将遵循与连接到 Prometheus 类似的过程。 . 一般来说,您可以通过单击 Prometheus 顶部导航栏中的 Alerts 来探索 Alertmanager Alerts。
要连接到 Alertmanager Pod,我们将再次使用 kubectl port-forward
转发本地端口。 如果您完成了对 Prometheus 的探索,您可以通过点击 CTRL-C
来关闭端口转发隧道,或者打开一个新的 shell 来创建一个新的连接。 .
我们要将本地端口 9093
转发到 sammy-cluster-monitoring-alertmanager-0
Pod 的端口 9093
:
kubectl port-forward --namespace ${NAMESPACE} sammy-cluster-monitoring-alertmanager-0 9093
您应该看到以下输出:
OutputForwarding from 127.0.0.1:9093 -> 9093 Forwarding from [::1]:9093 -> 9093
这表明本地端口 9093
正在成功转发到 Alertmanager Pod。
在您的网络浏览器中访问 http://localhost:9093
。 您应该看到以下 Alertmanager Alerts 页面:
从这里,您可以探索触发警报并可选择将其静音。 要了解有关 Alertmanager 的更多信息,请参阅 官方 Alertmanager 文档 。
在下一步中,您将学习如何有选择地配置和扩展一些监控堆栈组件。
第 6 步 — 配置监控堆栈(可选)
DigitalOcean Kubernetes 集群监控快速入门存储库中包含的清单可以修改为使用不同的容器镜像、不同数量的 Pod 副本、不同的端口和自定义配置文件。
在这一步中,我们将简要概述每个清单的用途,然后演示如何通过修改主清单文件将 Prometheus 扩展到 3 个副本。
首先,导航到 repo 中的 manifests
子目录,并列出目录的内容:
cd manifest ls
Outputalertmanager-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
在这里,您将找到不同监控堆栈组件的清单。 要了解有关清单中特定参数的更多信息,请单击链接并查阅 YAML 文件中包含的注释:
警报管理器
- alertmanager-0serviceaccount.yaml:Alertmanager 服务帐户,用于为 Alertmanager Pod 提供 Kubernetes 身份。 要了解有关服务帐户的更多信息,请参阅 为 Pod 配置服务帐户。
- alertmanager-configmap.yaml:一个 ConfigMap,包含一个最小的 Alertmanager 配置文件,称为
alertmanager.yml
。 配置 Alertmanager 超出了本教程的范围,但您可以通过查阅 Alertmanager 文档的 Configuration 部分了解更多信息。 - alertmanager-operated-service.yaml:Alertmanager
mesh
Service,用于当前 2-replica 高可用配置中 Alertmanager Pod 之间的路由请求。 - alertmanager-service.yaml:Alertmanager
web
服务,用于访问 Alertmanager Web 界面,您可能在上一步中已完成。 - alertmanager-statefulset.yaml:Alertmanager StatefulSet,配置2个副本。
格拉法纳
- dashboards-configmap.yaml:包含预配置的 JSON Grafana 监控仪表板的 ConfigMap。 从头开始生成一组新的仪表板和警报超出了本教程的范围,但要了解更多信息,您可以参考 kubernetes-mixin GitHub 存储库 。
- grafana-0serviceaccount.yaml:Grafana 服务帐号。
- grafana-configmap.yaml:一个 ConfigMap,包含一组默认的最小 Grafana 配置文件。
- grafana-secret.yaml:包含 Grafana 管理员用户和密码的 Kubernetes Secret。 要了解有关 Kubernetes Secrets 的更多信息,请参阅 Secrets。
- grafana-service.yaml:定义 Grafana 服务的清单。
- grafana-statefulset.yaml:Grafana StatefulSet,配置1个副本,不可扩展。 扩展 Grafana 超出了本教程的范围。 要了解如何创建高可用性 Grafana 设置,您可以参考 Grafana 官方文档中的 如何设置 Grafana 以实现高可用性。
kube-state-metrics
- kube-state-metrics-0serviceaccount.yaml:kube-state-metrics 服务帐户和 ClusterRole。 要了解有关 ClusterRoles 的更多信息,请参阅 Kubernetes 文档中的 Role 和 ClusterRole。
- kube-state-metrics-deployment.yaml:主要的 kube-state-metrics 部署清单,使用 addon-resizer 配置了 1 个可动态扩展的副本。
- kube-state-metrics-service.yaml:服务暴露
kube-state-metrics
部署。
节点导出器
- node-exporter-0serviceaccount.yaml:节点导出服务帐户。
- node-exporter-ds.yaml:节点导出器 DaemonSet 清单。 由于 node-exporter 是一个 DaemonSet,因此 node-exporter Pod 在集群中的每个节点上运行。
- 普罗米修斯
- prometheus-0serviceaccount.yaml:Prometheus 服务账号,ClusterRole 和 ClusterRoleBinding。
- prometheus-configmap.yaml:一个包含三个配置文件的ConfigMap:
alerts.yaml
:包含由kubernetes-mixin
(也用于生成 Grafana 仪表板)生成的一组预配置警报。 要了解有关配置警报规则的更多信息,请参阅 Prometheus 文档中的 Alerting Rules。prometheus.yaml
:Prometheus 的主配置文件。 Prometheus 已预先配置为抓取 Step 2 开头列出的所有组件。 配置 Prometheus 超出了本文的范围,但要了解更多信息,您可以参考 Prometheus 官方文档中的 Configuration。rules.yaml
:一组 Prometheus 记录规则,使 Prometheus 能够计算经常需要或计算量大的表达式,并将其结果保存为一组新的时间序列。 这些也是由kubernetes-mixin
生成的,配置它们超出了本文的范围。 想了解更多,可以参考 Prometheus 官方文档中的【X31X】录制规则【X50X】。
- prometheus-service.yaml:暴露 Prometheus StatefulSet 的 Service。
- prometheus-statefulset.yaml:Prometheus StatefulSet,配置2个副本。 此参数可以根据您的需要进行缩放。
示例:扩展 Prometheus
为了演示如何修改监控堆栈,我们将 Prometheus 副本的数量从 2 个扩展到 3 个。
使用您选择的编辑器打开 sammy-cluster-monitoring_manifest.yaml
主清单文件:
nano sammy-cluster-monitoring_manifest.yaml
向下滚动到清单的 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: . . .
将副本数从 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: . . .
完成后,保存并关闭文件。
使用 kubectl apply -f
应用更改:
kubectl apply -f sammy-cluster-monitoring_manifest.yaml --namespace default
您可以使用 kubectl get pods
跟踪进度。 使用相同的技术,您可以更新许多 Kubernetes 参数和此可观察性堆栈的大部分配置。
结论
在本教程中,您在 DigitalOcean Kubernetes 集群中安装了 Prometheus、Grafana 和 Alertmanager 监控堆栈,其中包含一组标准的仪表板、Prometheus 规则和警报。
您还可以选择使用 Helm Kubernetes 包管理器部署此监控堆栈。 要了解更多信息,请参阅 如何使用 Helm 和 Prometheus 设置 DigitalOcean Kubernetes 集群监控 。 启动和运行类似堆栈的另一种方法是使用 DigitalOcean Marketplace Kubernetes 监控堆栈解决方案 ,目前处于测试阶段。
DigitalOcean Kubernetes 集群监控快速入门存储库在很大程度上基于 Google Cloud Platform 的 click-to-deploy Prometheus 解决方案 并对其进行了修改。 原始存储库的修改和更改的完整清单可以在快速入门存储库的 changes.md 文件 中找到。