如何在 DigitalOcean 上使用 Prometheus、Grafana 和 Alertmanager 建立 Kubernetes 监控栈

金钱(警告)

** 状态:** 被贬值

此文章已被删除,不再保留。

理由

本教程中的步骤仍然有效,但会产生现在不必要地难以维护的配置。

相反,看

本文可能仍然有用作为参考,但可能不遵循最佳实践,我们强烈建议使用更新的文章。

美元

介绍

除了跟踪和日志,监控和警报是 Kubernetes 可观察性堆栈的重要组成部分,为您的 DigitalOcean Kubernetes 集群设置监控可让你跟踪资源使用情况,并分析和调试应用程序错误。

监控系统通常由一个包含计量数据和可视化层的时间序列的数据库组成,此外,一个警报层会创建和管理警报,根据需要将它们传递给集成和外部服务。

一个流行的监控解决方案是开放源代码 Prometheus, GrafanaAlertmanager堆栈,与 cube-state-metricsnode_exporter一起部署,以暴露集群级的Kubernetes对象指标以及机器级的指标,如CPU和内存使用率。

将此监控堆栈部署到 Kubernetes 集群中需要配置单个组件、宣言、 Prometheus 指标和 Grafana 仪表板,这可能需要一些时间。 DigitalOcean Kubernetes 集群监控快速启动,由 DigitalOcean 社区开发者教育团队发布,包含完全定义的 Prometheus-Grafana-Alertmanager 集群监控堆栈的宣言,以及一组预配置的警报和 Grafana 仪表板。

在本教程中,我们将部署此预配置的堆栈在DigitalOcean Kubernetes上,访问Prometheus,Grafana和Alertmanager界面,并描述如何定制它。

前提条件

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

您可以阅读有关安装和配置kubectl的更多信息(在其官方文档中)。

  • git版本控制系统安装在您的本地机器上。 要了解如何在 Ubuntu 18.04 上安装 git,请参阅 How To Install Git on Ubuntu 18.04
  • Coreutils base64工具安装在您的本地机器上。 如果您正在使用 Linux 机器,这很可能已经安装了。 如果您正在使用 OS X,您可以使用 openssl64 base,这是默认安装的。

<$>[注] 注: 集群监控 Quickstart 仅在 DigitalOcean Kubernetes 集群上进行了测试。

步骤 1 – 克隆 GitHub 存储库并配置环境变量

首先,将 DigitalOcean Kubernetes 集群监控(GitHub 存储库)(https://github.com/do-community/doks-monitoring)克隆到您的本地计算机上,使用 git:

1git clone https://github.com/do-community/doks-monitoring.git

然后,导航到 Repo:

1cd doks-monitoring

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

1ls
1[secondary_label Output]
2LICENSE
3README.md
4changes.txt
5manifest

显示目录包含所有监控堆栈组件的Kubernetes显示,包括 服务帐户, 部署, StatefulSets, ConfigMaps等。

如果您只想让东西运行,请先设置APP_INSTANCE_NAMENAMESPACE环境变量,这些变量将用于为堆栈的组件配置一个独特的名称,并配置将堆栈部署的 Namespace:

1export APP_INSTANCE_NAME=sammy-cluster-monitoring
2export NAMESPACE=default

在本教程中,我们将APP_INSTANCE_NAME设置为sammy-cluster-monitoring,这将预订所有监控堆 Kubernetes 对象名称。您应该为您的监控堆置一个独特的描述性前缀。我们还将名称空间设置为默认。如果您想将监控堆放到名称空间 ** 除默认之外,请确保您首先在集群中创建它:

1kubectl create namespace "$NAMESPACE"

你应该看到以下结果:

1[secondary_label Output]
2namespace/sammy created

在这种情况下,NAMESPACE环境变量被设置为sammy。在本教程的其余时间里,我们将假定NAMESPACE已设置为默认

现在,使用base64命令来 base64 编码一个安全的 Grafana 密码. 请确保为your_grafana_password取代您所选择的密码:

1export GRAFANA_GENERATED_PASSWORD="$(echo -n 'your_grafana_password' | base64)"

如果您正在使用 macOS,您可以替代默认安装的openssl base64命令。

此时,您已经抓住了堆栈的 Kubernetes 显示,并配置了所需的环境变量,因此您现在已经准备好将配置的变量替换为 Kubernetes 显示文件,并在您的 Kubernetes 集群中创建堆栈。

步骤 2 – 创建监控堆栈

DigitalOcean Kubernetes Monitoring Quickstart repo 包含以下监控、扫描和可视化组件的宣言:

  • Prometheus**是一个时间序列数据库和监测工具,它通过投票测量结束点发挥作用,并删除和处理这些结束点所暴露的数据。 它允许您使用promQL,一个时间序列数据查询语言查询此数据. 普罗米修斯将作为SpectifulSet被部署入集群,并配有2个使用[活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口 此外,一套预设的"普罗米修斯警报"(Prometheus Alerts, Rules)和"乔布斯"(Jobs)将存储为"ConfigMap"(https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/). 要了解更多这方面的情况, 请跳到 配置监测堆栈 的 [Prometheus] (https://andsky.com/tech/tutorials/how-to-set-up-a-prometheus-grafana-and-alertmanager-monitoring-stack-on-digitalocean-kubernetes#prometheus ) 部分。
  • ** 通常与Prometheus一起部署的Alertmanager** 构成堆栈的提示层,处理由Prometheus生成的提醒并解开,分组,并引导它们到电子邮件或[PagerDuty]等集成(https://www.pagerduty.com/). 警报管理器将安装为国产Set,配有2个复制品. 为了了解更多关于"警报管理员"的信息,请从"普罗米修斯"(Prometheus)文档中查阅Alerting.
  • Grafana是一个数据可视化和分析工具,它允许您为自己的度量数据构建仪表板和图表. Grafana将安装为国文套装,带有一副复制品. 此外,由kubernetes-mixin生成的被预配置的Dashboards集会被存储为ConfigMap.
  • kube-state-meters是一个附加代理,它听取了Kubernetes API服务器,并生成了关于部署和Pod等Kubernetes天体状态的度量衡. 这些度量衡在HTTP端点上作为平正文字使用并被普罗米修斯所消耗. kube-state-度量衡将安装为可自动缩放的[部署] (https://kubernetes.io/docs/concepts/workloads/controllers/deployment/)并有1个复制件.
  • node-exporter,是Prometheus的出口国,运行在集群节点上,为Prometheus提供OS等OS和硬件度量. 这些度量衡也作为HTTP端点上的平正文字被普罗米修斯所消耗. 节点出口器将安装为 [DeamonSet] (https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/). (英语)

默认情况下,除了通过节点出口器、立方体状态指数和上述其他组件生成的扫描指数外,Prometheus 将配置为从以下组件中扫描指数:

要了解更多有关配置这些组件和 Prometheus 扫描任务的信息,请转到 配置监控堆栈

开始使用awkenvsubst来填写APP_INSTANCE_NAME,NAMESPACEGRAFANA_GENERATED_PASSWORD变量,然后在 Repo 的 manif 文件中。

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

您应该考虑将此文件存储在版本控制中,以便您可以跟踪监控堆栈的更改,然后返回以前的版本. 如果您这样做,请确保从文件中清除admin-password变量,以便您不会检查您的Grafana密码进入版本控制。

现在你已经生成了主宣言文件,使用kubectl应用 -f来应用宣言,并在您配置的名称空间中创建堆栈:

1kubectl apply -f "${APP_INSTANCE_NAME}_manifest.yaml" --namespace "${NAMESPACE}"

你应该看到类似于以下的输出:

 1[secondary_label Output]
 2serviceaccount/alertmanager created
 3configmap/sammy-cluster-monitoring-alertmanager-config created
 4service/sammy-cluster-monitoring-alertmanager-operated created
 5service/sammy-cluster-monitoring-alertmanager created
 6
 7. . .
 8
 9clusterrolebinding.rbac.authorization.k8s.io/prometheus created
10configmap/sammy-cluster-monitoring-prometheus-config created
11service/sammy-cluster-monitoring-prometheus created
12statefulset.apps/sammy-cluster-monitoring-prometheus created

您可以使用kubectl get all来跟踪堆栈的部署进度.一旦堆栈的所有组件都运行,您可以通过Grafana Web 界面访问预配置的 Grafana 仪表板。

步骤 3 – 访问 Grafana 和探索指数数据

Grafana 服务宣言将 Grafana 暴露为一个ClusterIP服务,这意味着它只能通过集群内部 IP 地址访问。 要访问 Grafana 在您的 Kubernetes 集群之外,您可以使用kubectl 补丁将服务在现场更新到面向公众的类型,如NodePortLoadBalancer,或kubectl 端口向前将本地端口传送到 Grafana Pod 端口。

使用负载平衡器曝光 Grafana 服务(可选)

如果您想为 Grafana 创建一个具有外部公共 IP 的 DigitalOcean 负载平衡器,请使用kubectl 补丁将现有的 Grafana 服务更新到LoadBalancer 服务类型:

1kubectl patch svc "$APP_INSTANCE_NAME-grafana" \
2  --namespace "$NAMESPACE" \
3  -p '{"spec": {"type": "LoadBalancer"}}'

kubectl patch 命令允许您在位置更新 Kubernetes 对象以进行更改,而无需重新部署对象。您也可以直接修改主 manif 文件,将 type: LoadBalancer 参数添加到 Grafana Service spec。 有关 kubectl patch 和 Kubernetes 服务类型的更多信息,您可以参阅 Update API Objects in Place Using kubectl patchServices 资源在官方 Kubernetes 文档中。

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

1[secondary_label Output]
2service/sammy-cluster-monitoring-grafana patched

创建负载平衡器并分配给其公共 IP 可能需要几分钟,您可以使用以下命令与-w旗进行跟踪,以查看更改:

1kubectl get service "$APP_INSTANCE_NAME-grafana" -w

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

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

您现在可以通过导航到http://SERVICE_IP/来访问Grafana UI。

传递本地端口访问 Grafana 服务

如果您不希望对Grafana服务进行外部曝光,您也可以使用kubectl端口前进将本地端口3000直接传送到Grafana Pod。

1kubectl port-forward --namespace ${NAMESPACE} ${APP_INSTANCE_NAME}-grafana-0 3000

你应该看到以下结果:

1[secondary_label Output]
2Forwarding from 127.0.0.1:3000 -> 3000
3Forwarding from [::1]:3000 -> 3000

这将将本地端口3000转发到Grafana Podsammy-cluster-monitoring-grafana-0容器端口``3000

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

Grafana Login Page

要登录,请使用默认用户名admin(如果您尚未更改admin-user参数),以及您在步骤 1 中设置的密码。

您将被带到以下 ** Home 仪表板**:

Grafana Home Page

在左侧的导航栏中,选择 Dashboards按钮,然后单击 Manage:

Grafana Dashboard Tab

您将被带到以下仪表板管理界面,该界面列出了在 dashboards-configmap.yaml中配置的仪表板:

Grafana Dashboard List

这些仪表板由kubernetes-mixin生成,这是一个开源项目,允许您创建一个标准化的集群监控Grafana仪表板和Prometheus警报。

点击Kubernetes/Nodes仪表板,可视化特定节点的CPU、内存、磁盘和网络使用情况:

Grafana Nodes Dashboard

描述如何使用这些仪表板不在本教程的范围内,但您可以参阅以下资源来了解更多:

在下一步,我们将遵循类似的过程来连接并探索普罗米修斯监控系统。

步骤 4 – 访问 Prometheus 和 Alertmanager

要连接到 Prometheus Pods,我们可以使用kubectl 端口前进转发到本地端口. 如果您已经完成了对 Grafana 的探索,您可以通过点击CTRL-C来关闭端口前进隧道。

首先,在默认名称空间中列出运行 Pods:

1kubectl get pod -n default

你应该看到以下pods:

 1[secondary_label Output]
 2sammy-cluster-monitoring-alertmanager-0 1/1 Running 0 17m
 3sammy-cluster-monitoring-alertmanager-1 1/1 Running 0 15m
 4sammy-cluster-monitoring-grafana-0 1/1 Running 0 16m
 5sammy-cluster-monitoring-kube-state-metrics-d68bb884-gmgxt 2/2 Running 0 16m
 6sammy-cluster-monitoring-node-exporter-7hvb7 1/1 Running 0 16m
 7sammy-cluster-monitoring-node-exporter-c2rvj 1/1 Running 0 16m
 8sammy-cluster-monitoring-node-exporter-w8j74 1/1 Running 0 16m
 9sammy-cluster-monitoring-prometheus-0 1/1 Running 0 16m
10sammy-cluster-monitoring-prometheus-1 1/1 Running 0 16m

我们将将本地端口9090转移到sammy-cluster-monitoring-prometheus-0的端口9090:

1kubectl port-forward --namespace ${NAMESPACE} sammy-cluster-monitoring-prometheus-0 9090

你应该看到以下结果:

1[secondary_label Output]
2Forwarding from 127.0.0.1:9090 -> 9090
3Forwarding from [::1]:9090 -> 9090

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

在您的浏览器中访问 http://localhost:9090. 您应该看到以下 Prometheus ** 图表**页面:

Prometheus Graph Page

从这里,您可以使用PromQL,Prometheus查询语言,选择和汇总存储在其数据库中的时间序列指标。 有关PromQL的更多信息,请参阅Prometheus官方文件中的 Querying Prometheus

Expression字段中,键入 kubelet_node_name,然后点击 Execute. 你应该看到一个列表的时间序列与计量 kubelet_node_name 报告在你的Kubernetes集群中的节点。你可以看到哪个节点产生了计量和哪个工作在计量标签中扫描了计量:

Prometheus Query Results

最后,在顶部的导航栏中,点击 状态,然后点击 目标,以查看 Prometheus 已配置的目标列表。

要了解更多有关Prometheus和如何查询您的集群指标,请参阅官方的Prometheus文件(https://prometheus.io/docs/introduction/overview/)。

要连接到管理 Prometheus 生成的 Alerts 的 Alertmanager,我们将遵循类似于我们与 Prometheus 连接的过程。

要连接到 Alertmanager Pods,我们将再次使用kubectl 端口前进来转发本地端口. 如果您已经完成探索 Prometheus,您可以通过点击CTRL-C来关闭端口前进隧道或打开一个新的壳来创建新的连接。

我们将将本地端口9093转发到sammy-cluster-monitoring-alertmanager-0的端口9093:

1kubectl port-forward --namespace ${NAMESPACE} sammy-cluster-monitoring-alertmanager-0 9093

你应该看到以下结果:

1[secondary_label Output]
2Forwarding from 127.0.0.1:9093 -> 9093
3Forwarding from [::1]:9093 -> 9093

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

在您的浏览器中访问 http://localhost:9093. 您应该看到以下警报管理器 警报页面:

Alertmanager Alerts Page

从这里,您可以探索发射警报,并可选地对它们保持沉默. 有关 Alertmanager 的更多信息,请参阅 官方 Alertmanager 文档

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

步骤 6 — 配置监控堆栈(可选)

包含在 DigitalOcean Kubernetes 集群监控 Quickstart 存储库中的宣言可以进行修改,以使用不同的容器图像、不同数量的 Pod 复制品、不同的端口和自定义配置文件。

在此步骤中,我们将提供高层次的每个宣言的目的概述,然后通过修改主宣言文件来演示如何将Prometheus扩展到3个复制品。

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

1cd manifest
2ls
 1[secondary_label Output]
 2alertmanager-0serviceaccount.yaml
 3alertmanager-configmap.yaml
 4alertmanager-operated-service.yaml
 5alertmanager-service.yaml
 6. . .
 7node-exporter-ds.yaml
 8prometheus-0serviceaccount.yaml
 9prometheus-configmap.yaml
10prometheus-service.yaml
11prometheus-statefulset.yaml

在这里,您可以找到不同的监控堆栈组件的宣言. 要了解有关宣言中的特定参数的更多信息,请点击链接,并参阅 YAML 文件中包含的评论:

警报经理

伯爵

古巴国家指数

出口者

主題:Prometheus

  • `prometheus-0service account.yaml': 普罗米修斯服务账户 ClusterRole和 ClusterRoleBinding.
  • [prometheus-configmap.yaml'](https://github.com/do-community/doks-monitoring/blob/master/manifest/prometheus-configmap.yaml): 一个包含三个配置文件的配置图: -aerts.yaml': 包含由"kubernetes-mixin"(也用于生成Grafana仪表板)生成的预配置的一套警报. 为了更深入地了解设置提醒规则,请参考普罗米修斯文献中的提醒规则. -prometheus.yaml': 普罗米修斯的主配置文件. 普罗米修斯被预配置为刮去[第2步](https://andsky.com/tech/tutorials/how-to-set-up-a-prometheus-grafana-and-alertmanager-monitoring-stack-on-digitalocean-kubernetes#step-2-%E2%80%94-creating-the-monitoring-stack)开头列出的所有组件. 配置"普罗米修斯"超越了本条款的范围,但想多学多学,可以从官方"普罗米修斯"(Prometheus docs)处查阅[Confignation (https://prometheus.io/docs/prometheus/latest/configuration/configuration/). -Rules.yaml': 一套普罗米修斯录制规则,使普罗米修斯能够计算出经常需要或计算出昂贵的表达方式,并把它们的结果保存为一套新的时间序列. 这些也由 " kubernetes-mixin " 产生,其配置超出了本条的范围。 要了解更多情况,可以从官方普罗米修斯文档中查阅记录规则.
  • [`prometheus-service.yaml' (https://github.com/do-community/doks-monitoring/blob/master/manifest/prometheus-service.yaml): 揭发"普罗米修斯国产套装"的特工.
  • [`prometheus-statefulset.yaml'] (https://github.com/do-community/doks-monitoring/blob/master/manifest/prometheus-statefulset.yaml): Prometheus StatefulSet,配置有2个复制品. 此参数可以根据您的需要缩放 。 (英语)

标签: Prometheus Scaling

为了展示如何修改监控堆栈,我们将Prometheus复制品的数量从2缩小到3。

使用您所选择的编辑器打开sammy-cluster-monitoring_manifest.yaml主示文件:

1nano sammy-cluster-monitoring_manifest.yaml

滚到宣言的 Prometheus StatefulSet 部分:

 1[secondary_label Output]
 2. . .
 3apiVersion: apps/v1beta2
 4kind: StatefulSet
 5metadata:
 6  name: sammy-cluster-monitoring-prometheus
 7  labels: &Labels
 8    k8s-app: prometheus
 9    app.kubernetes.io/name: sammy-cluster-monitoring
10    app.kubernetes.io/component: prometheus
11spec:
12  serviceName: "sammy-cluster-monitoring-prometheus"
13  replicas: 2
14  podManagementPolicy: "Parallel"
15  updateStrategy:
16    type: "RollingUpdate"
17  selector:
18    matchLabels: *Labels
19  template:
20    metadata:
21      labels: *Labels
22    spec:
23. . .

将复制件数从 2 改为 3:

 1[secondary_label Output]
 2. . .
 3apiVersion: apps/v1beta2
 4kind: StatefulSet
 5metadata:
 6  name: sammy-cluster-monitoring-prometheus
 7  labels: &Labels
 8    k8s-app: prometheus
 9    app.kubernetes.io/name: sammy-cluster-monitoring
10    app.kubernetes.io/component: prometheus
11spec:
12  serviceName: "sammy-cluster-monitoring-prometheus"
13  replicas: 3
14  podManagementPolicy: "Parallel"
15  updateStrategy:
16    type: "RollingUpdate"
17  selector:
18    matchLabels: *Labels
19  template:
20    metadata:
21      labels: *Labels
22    spec:
23. . .

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

使用「kubectl 應用 -f」應用變更:

1kubectl apply -f sammy-cluster-monitoring_manifest.yaml --namespace default

您可以使用kubectl get pods来跟踪进度. 使用相同的技术,您可以更新许多Kubernetes参数和对这个可观性堆栈的大部分配置。

结论

在本教程中,您将 Prometheus、Grafana 和 Alertmanager 监控堆栈安装到您的 DigitalOcean Kubernetes 集群中,其中包含一组标准仪表板、Prometheus 规则和警报。

您还可以选择使用 Helm Kubernetes 包管理器部署此监控堆栈。 有关更多信息,请参阅 How to Set Up DigitalOcean Kubernetes Cluster Monitoring with Helm and Prometheus)。 使用 DigitalOcean Marketplace Kubernetes 监控堆栈解决方案以获得类似堆栈并运行的替代方法,目前处于测试阶段。

DigitalOcean Kubernetes Cluster Monitoring Quickstart 存储库主要基于并从 Google Cloud Platform 的 点击部署 Prometheus 解决方案中进行修改和修改。

Published At
Categories with 技术
comments powered by Disqus