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

狀態:已棄用

本文已被棄用,不再維護。

原因

本教程中的步驟仍然有效,但將產生一個現在不必要難以維護的配置。

請參考

本文可能仍然作為參考有用,但可能不符合最佳實踐。我們強烈建議使用更新的文章。

介紹

除了跟踪和日志记录之外,监控和警报是 Kubernetes 可观察性堆栈的基本组件之一。为您的 DigitalOcean Kubernetes 集群设置监控可以让您跟踪资源使用情况,并分析和调试应用程序错误。

A monitoring system usually consists of a time-series database that houses metric data and a visualization layer. In addition, an alerting layer creates and manages alerts, handing them off to integrations and external services as necessary. Finally, one or more components generate or expose the metric data that will be stored, visualized, and processed for alerts by the stack.

一个流行的监控解决方案是开源的 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
  • 在本地计算机上安装Coreutilsbase64工具。如果您使用的是Linux机器,则很可能已经安装了此工具。如果您使用的是OS X,则可以使用默认安装的openssl base64

<$>[注意]
注意:集群监控快速入门仅在DigitalOcean Kubernetes集群上进行了测试。要将快速入门用于其他Kubernetes集群,可能需要对清单文件进行一些修改。
<$>

步驟1 — 複製 GitHub 存儲庫並配置環境變量

首先,使用 git 將 DigitalOcean Kubernetes Cluster Monitoring GitHub 存儲庫 複製到本地機器上:

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

然後,進入存儲庫:

  1. cd doks-monitoring

您應該會看到以下目錄結構:

  1. ls
Output
LICENSE README.md changes.txt manifest

目錄 manifest 包含所有監控堆棧組件的 Kubernetes 清單,包括 服務帳戶部署有狀態集配置地圖 等。要了解更多關於這些清單文件以及如何配置它們的信息,請跳轉到 配置監控堆棧

如果您只是想讓事情運轉起來,請先設置APP_INSTANCE_NAMENAMESPACE環境變量,這將用於配置堆棧組件的唯一名稱,並將Namespace配置到堆棧將部署到其中的位置:

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

在本教程中,我們將APP_INSTANCE_NAME設置為sammy-cluster-monitoring,這將在所有監控堆棧Kubernetes對象名稱前綴。您應該替換成您的監控堆棧的唯一描述性前綴。我們還將Namespace設置為default。如果您想將監控堆棧部署到default之外的Namespace,請確保首先在您的集群中創建它:

  1. kubectl create namespace "$NAMESPACE"

您應該看到以下輸出:

Output
namespace/sammy created

在這種情況下,NAMESPACE環境變量設置為sammy。在本教程的其餘部分中,我們將假設NAMESPACE已經設置為default

現在,使用base64命令將Grafana密碼進行base64編碼。請確保替換your_grafana_password為您選擇的密碼:

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

如果您使用的是macOS,您可以替換openssl base64命令,該命令默認已安裝。

此時,您已經獲取了堆棧的Kubernetes清單並配置了所需的環境變量,因此您現在可以將配置的變量替換到Kubernetes清單文件中並在您的Kubernetes集群中創建該堆棧。

第二步 — 建立監控堆棧

数字海洋 Kubernetes 监控快速入门存储库包含以下监控、抓取和可视化组件的清单:

  • Prometheus 是一款时间序列数据库和监控工具,通过轮询指标端点、抓取和处理这些端点暴露的数据来工作。它允许您使用 PromQL,即一种时间序列数据查询语言,查询这些数据。Prometheus 将部署到集群中作为一个 StatefulSet,具有 2 个副本,使用数字海洋 块存储持久卷。此外,预先配置的一组 Prometheus 警报、规则和作业将被存储为一个 ConfigMap。要了解更多信息,请跳转到配置监控堆栈的 Prometheus 部分。
  • Alertmanager通常與Prometheus一起部署,形成堆疊的警報層,處理由Prometheus生成的警報,並將其進行去重、分組和路由到像電子郵件或PagerDuty之類的集成。Alertmanager將安裝為一個具有2個副本的StatefulSet。要了解有關Alertmanager的更多信息,請參閱Prometheus文檔中的警報
  • Grafana是一個數據可視化和分析工具,允許您為您的指標數據構建儀表板和圖形。Grafana將作為具有一個副本的StatefulSet安裝。此外,由kubernetes-mixin生成的預配置的一組儀表板將存儲為一個ConfigMap。
  • kube-state-metrics是一個附加的代理,它監聽Kubernetes API服務器並生成有關Kubernetes對象的狀態(如Deployments和Pods)的指標。這些指標作為純文本在HTTP端點上提供,並由Prometheus消耗。kube-state-metrics將作為一個具有一個副本的自動可擴展的Deployment安裝。
  • node-exporter是一個在集群節點上運行的Prometheus導出器,提供如CPU和內存使用率之類的OS和硬件指標給Prometheus。這些指標也作為純文本在HTTP端點上提供,並由Prometheus消耗。node-exporter將作為一個DaemonSet安裝。

預設情況下,除了從node-exporter、kube-state-metrics和上面列出的其他組件生成的指標進行抓取外,Prometheus 將被配置為從以下組件進行指標抓取:

  • kube-apiserver,Kubernetes API 伺服器
  • kubelet,與 kube-apiserver 互動以管理節點上的 Pods 和容器的主要節點代理。
  • cAdvisor,一個節點代理,發現運行的容器並收集它們的 CPU、記憶體、文件系統和網路使用指標。

要了解有關配置這些組件和 Prometheus 抓取工作的更多信息,請跳轉到配置監控堆棧。我們現在將在存儲庫的清單文件中替換前一步定義的環境變數,並將各個清單串聯成單個主文件。

開始使用 awkenvsubst 填充回資料夾的清單文件中的 APP_INSTANCE_NAMENAMESPACEGRAFANA_GENERATED_PASSWORD 變量。在替換變量值後,將文件結合並保存為名為 sammy-cluster-monitoring_manifest.yaml 的主清單文件。

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

您應該考慮將此文件存儲在版本控制中,以便跟踪對監控堆棧的更改並回滾到以前的版本。如果這樣做,請務必從文件中清除 admin-password 變量,以免將您的 Grafana 密碼檢入版本控制。

現在您已經生成了主清單文件,使用 kubectl apply -f 將清單應用於配置的 Namespace 中並在其中創建堆棧:

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

您應該會看到類似以下的輸出:

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

您可以使用 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 服務(可選)

如果您想要為 Grafana 創建一個帶有外部公共 IP 的 DigitalOcean 負載均衡器,請使用 kubectl patch 將現有的 Grafana 服務就地更新為 LoadBalancer 服務類型:

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

kubectl patch 命令允許您就地更新 Kubernetes 物件,以進行更改而無需重新部署物件。 您還可以直接修改主清單檔,將 type: LoadBalancer 參數添加到 Grafana 服務規格。 欲了解更多有關 kubectl patch 和 Kubernetes 服務類型的資訊,您可以參考官方 Kubernetes 文件中的 使用 kubectl patch 就地更新 API 物件服務 資源。

執行上述命令後,您應該會看到以下內容:

Output
service/sammy-cluster-monitoring-grafana patched

創建負載平衡器並為其分配公共 IP 可能需要幾分鐘的時間。 您可以使用以下帶有 -w 標誌的命令來跟踪其進度以查看更改:

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

一旦數位海洋負載平衡器被創建並分配了外部 IP 地址,您可以使用以下命令來獲取其外部 IP:

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

現在您可以通過訪問 http://SERVICE_IP/ 來訪問 Grafana UI。

轉發本地端口以訪問 Grafana 服務

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

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

您应该会看到以下输出:

Output
Forwarding from 127.0.0.1:3000 -> 3000 Forwarding from [::1]:3000 -> 3000

这将会将本地端口 3000 转发到 Grafana Pod sammy-cluster-monitoring-grafana-0containerPort 3000。要了解如何将端口转发到 Kubernetes 集群,请参阅 使用端口转发访问集群中的应用

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

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

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

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

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

這些儀表板是由kubernetes-mixin生成的,這是一個開源項目,可以讓您創建一組標準化的集群監控Grafana儀表板和Prometheus警報。要了解更多信息,請參考kubernetes-mixin GitHub存儲庫

點擊Kubernetes / Nodes儀表板,該儀表板可視化給定節點的CPU、內存、磁盤和網絡使用情況:

描述如何使用這些儀表板不在本教程的範圍內,但您可以參考以下資源以獲取更多信息:

在下一步中,我們將遵循類似的流程連接到並探索Prometheus監控系統。

步驟4 — 存取 Prometheus 和 Alertmanager

要連接到 Prometheus Pods,我們可以使用 kubectl port-forward 來轉發本地端口。如果您已完成探索 Grafana,您可以通過按下 CTRL-C 來關閉端口轉發隧道。或者,您可以打開一個新的 shell 並創建一個新的端口轉發連接。

首先列出 default 命名空間中運行的 Pods:

  1. kubectl get pod -n default

您應該看到以下 Pods:

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

我們將本地端口 9090 轉發到 sammy-cluster-monitoring-prometheus-0 Pod 的端口 9090

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

您應該看到以下輸出:

Output
Forwarding from 127.0.0.1:9090 -> 9090 Forwarding from [::1]:9090 -> 9090

這表明本地端口 9090 已成功轉發到 Prometheus Pod。

在網絡瀏覽器中訪問 http://localhost:9090。您應該看到以下 Prometheus 圖表 頁面:

從這裡,您可以使用 PromQL,即 Prometheus 查詢語言,來選擇和聚合存儲在其數據庫中的時間序列指標。要了解更多有關 PromQL 的信息,請參閱官方 Prometheus 文檔中的 Prometheus 查詢

Expression 欄位中輸入 kubelet_node_name,然後點擊 執行。您應該會看到一個時間序列列表,其中包含度量標準為 kubelet_node_name,報告您的 Kubernetes 集群中的節點。您可以在指標標籤中看到生成該指標的節點以及採集該指標的作業:

最後,在頂部導航欄中,點擊 狀態,然後點擊 目標,以查看 Prometheus 已配置為採集的目標列表。您應該會看到一個與在 步驟 2 開頭描述的監控端點列表對應的目標列表。

要了解有關 Prometheus 的更多信息以及如何查詢您的集群指標,請參閱官方的 Prometheus 文檔

要連接到由 Prometheus 生成的警報管理器 Alertmanager,我們將遵循類似於連接到 Prometheus 的過程。總的來說,您可以通過在 Prometheus 頂部導航欄中點擊 警報 來探索 Alertmanager 警報。

要連接到 Alertmanager Pods,我們將再次使用 kubectl port-forward 來轉發本地端口。如果您已完成探索 Prometheus,可以通過按下 CTRL-C 來關閉端口轉發隧道,或者打開新的 shell 以建立新的連接。

我們將本地端口9093轉發到sammy-cluster-monitoring-alertmanager-0 Pod的端口9093

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

您應該看到以下輸出:

Output
Forwarding from 127.0.0.1:9093 -> 9093 Forwarding from [::1]:9093 -> 9093

這表示本地端口9093成功轉發到Alertmanager Pod。

在網頁瀏覽器中訪問http://localhost:9093。您應該會看到以下Alertmanager 警報頁面:

從這裡,您可以探索觸發警報並選擇性地將其靜音。要了解有關Alertmanager的更多信息,請參閱官方Alertmanager文檔

在下一步中,您將學習如何選擇性配置和擴展一些監控堆疊組件。

步驟6 — 配置監控堆疊(可選)

數字海洋Kubernetes集群監控快速入門存儲庫中包含的清單可以修改為使用不同的容器映像,不同數量的Pod副本,不同端口和自定義配置文件。

在此步驟中,我們將提供每個清單的高級概述,然後演示如何通過修改主清單文件將Prometheus擴展到3個副本。

開始時,請導航至存儲庫中的manifests子目錄,並列出該目錄的內容:

  1. cd manifest
  2. ls
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

在這裡,您將找到不同監控堆疊組件的清單。要了解清單中特定參數的更多信息,請點擊鏈接並參考YAML文件中包含的註釋:

Alertmanager

Grafana

kube-state-metrics

node-exporter

###Prometheus

  • prometheus-0serviceaccount.yaml: Prometheus 服務帳戶、ClusterRole 和 ClusterRoleBinding。

  • prometheus-configmap.yaml:包含三個配置文件的 ConfigMap:

    • alerts.yaml:包含由 kubernetes-mixin 生成的預配置警報集(該工具還用於生成 Grafana 儀表板)。要了解有關配置警報規則的更多信息,請參閱 Prometheus 文檔中的警報規則
    • prometheus.yaml:Prometheus 的主配置文件。 Prometheus 已預配置為採集第 2 步開始列出的所有組件。配置 Prometheus 超出了本文範圍,但要了解更多信息,您可以參考官方 Prometheus 文檔中的配置
    • rules.yaml:一組 Prometheus 錄製規則,使 Prometheus 能夠計算經常需要或計算成本高昂的表達式,並將其結果保存為新的時間序列集。這些也是由 kubernetes-mixin 生成的,配置它們超出了本文範圍。要了解更多,您可以參考官方 Prometheus 文檔中的錄製規則
  • prometheus-service.yaml:公開 Prometheus StatefulSet 的服務。

  • prometheus-statefulset.yaml:已配置為 2 個副本的 Prometheus StatefulSet。此參數可根據您的需求進行擴展。

示例:擴展 Prometheus

為了演示如何修改監控堆棧,我們將將 Prometheus 副本數量從 2 個擴展到 3 個。

使用您選擇的編輯器打開 sammy-cluster-monitoring_manifest.yaml 主要清單文件:

  1. 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應用更改:

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

您可以使用kubectl get pods跟踪進度。使用相同的技術,您可以更新許多Kubernetes參數以及此觀測堆棧的大部分配置。

結論

在本教程中,您使用標準儀表板、Prometheus規則和警報將Prometheus、Grafana和Alertmanager監控堆棧安裝到您的DigitalOcean Kubernetes集群中。

您也可以選擇使用Helm Kubernetes包管理器部署此監控堆棧。要了解更多信息,請參閱如何使用Helm和Prometheus設置DigitalOcean Kubernetes集群監控。啟用類似的堆棧的另一種方法是使用DigitalOcean Marketplace Kubernetes監控堆棧解決方案,目前處於測試版。

數位海洋 Kubernetes 集群監控快速入門存儲庫在很大程度上基於並修改自Google Cloud Platform的點擊即部署 Prometheus 解決方案。您可以在快速入門存儲庫的changes.md文件中找到對原存儲庫的所有修改和更改清單。

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-kubernetes-monitoring-stack-with-prometheus-grafana-and-alertmanager-on-digitalocean