介紹
除了跟踪和日志记录之外,监控和警报是 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.
一个流行的监控解决方案是开源的 Prometheus、Grafana 和 Alertmanager 堆栈,与 kube-state-metrics 和 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。
- 在本地计算机上安装Coreutilsbase64工具。如果您使用的是Linux机器,则很可能已经安装了此工具。如果您使用的是OS X,则可以使用默认安装的
openssl base64
。
<$>[注意]
注意:集群监控快速入门仅在DigitalOcean Kubernetes集群上进行了测试。要将快速入门用于其他Kubernetes集群,可能需要对清单文件进行一些修改。
<$>
步驟1 — 複製 GitHub 存儲庫並配置環境變量
首先,使用 git 將 DigitalOcean Kubernetes Cluster Monitoring GitHub 存儲庫 複製到本地機器上:
然後,進入存儲庫:
您應該會看到以下目錄結構:
OutputLICENSE
README.md
changes.txt
manifest
目錄 manifest
包含所有監控堆棧組件的 Kubernetes 清單,包括 服務帳戶、部署、有狀態集、配置地圖 等。要了解更多關於這些清單文件以及如何配置它們的信息,請跳轉到 配置監控堆棧。
如果您只是想讓事情運轉起來,請先設置APP_INSTANCE_NAME
和NAMESPACE
環境變量,這將用於配置堆棧組件的唯一名稱,並將Namespace配置到堆棧將部署到其中的位置:
在本教程中,我們將APP_INSTANCE_NAME
設置為sammy-cluster-monitoring
,這將在所有監控堆棧Kubernetes對象名稱前綴。您應該替換成您的監控堆棧的唯一描述性前綴。我們還將Namespace設置為default
。如果您想將監控堆棧部署到default之外的Namespace,請確保首先在您的集群中創建它:
您應該看到以下輸出:
Outputnamespace/sammy created
在這種情況下,NAMESPACE
環境變量設置為sammy
。在本教程的其餘部分中,我們將假設NAMESPACE
已經設置為default
。
現在,使用base64
命令將Grafana密碼進行base64編碼。請確保替換your_grafana_password
為您選擇的密碼:
如果您使用的是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 抓取工作的更多信息,請跳轉到配置監控堆棧。我們現在將在存儲庫的清單文件中替換前一步定義的環境變數,並將各個清單串聯成單個主文件。
開始使用 awk
和 envsubst
填充回資料夾的清單文件中的 APP_INSTANCE_NAME
、NAMESPACE
和 GRAFANA_GENERATED_PASSWORD
變量。在替換變量值後,將文件結合並保存為名為 sammy-cluster-monitoring_manifest.yaml
的主清單文件。
您應該考慮將此文件存儲在版本控制中,以便跟踪對監控堆棧的更改並回滾到以前的版本。如果這樣做,請務必從文件中清除 admin-password
變量,以免將您的 Grafana 密碼檢入版本控制。
現在您已經生成了主清單文件,使用 kubectl apply -f
將清單應用於配置的 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
,或使用 kubectl port-forward
將本地端口轉發到 Grafana Pod 端口。在本教程中,我們將轉發端口,因此您可以直接跳到轉發本地端口以訪問 Grafana 服務。以下部分介紹了外部公開 Grafana 的方式,僅供參考。
使用負載均衡器公開 Grafana 服務(可選)
如果您想要為 Grafana 創建一個帶有外部公共 IP 的 DigitalOcean 負載均衡器,請使用 kubectl patch
將現有的 Grafana 服務就地更新為 LoadBalancer
服務類型:
kubectl patch
命令允許您就地更新 Kubernetes 物件,以進行更改而無需重新部署物件。 您還可以直接修改主清單檔,將 type: LoadBalancer
參數添加到 Grafana 服務規格。 欲了解更多有關 kubectl patch
和 Kubernetes 服務類型的資訊,您可以參考官方 Kubernetes 文件中的 使用 kubectl patch 就地更新 API 物件 和 服務 資源。
執行上述命令後,您應該會看到以下內容:
Outputservice/sammy-cluster-monitoring-grafana patched
創建負載平衡器並為其分配公共 IP 可能需要幾分鐘的時間。 您可以使用以下帶有 -w
標誌的命令來跟踪其進度以查看更改:
一旦數位海洋負載平衡器被創建並分配了外部 IP 地址,您可以使用以下命令來獲取其外部 IP:
現在您可以通過訪問 http://SERVICE_IP/
來訪問 Grafana UI。
轉發本地端口以訪問 Grafana 服務
如果您不想将 Grafana 服务公开到外部,您也可以直接使用 kubectl port-forward
将本地端口 3000
转发到集群中的 Grafana Pod。
您应该会看到以下输出:
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
参数)和您在第一步中配置的密码。
您将被带到以下主页仪表板:
在左侧导航栏中,选择仪表板按钮,然后点击管理:
您将被带到以下仪表板管理界面,其中列出了在dashboards-configmap.yaml
清单中配置的仪表板:
這些儀表板是由kubernetes-mixin
生成的,這是一個開源項目,可以讓您創建一組標準化的集群監控Grafana儀表板和Prometheus警報。要了解更多信息,請參考kubernetes-mixin GitHub存儲庫。
點擊Kubernetes / Nodes儀表板,該儀表板可視化給定節點的CPU、內存、磁盤和網絡使用情況:
描述如何使用這些儀表板不在本教程的範圍內,但您可以參考以下資源以獲取更多信息:
- 要了解有關使用USE方法分析系統性能的信息,可以參考布倫丹·格雷格(Brendan Gregg)的使用率飽和和錯誤(USE)方法頁面。
- Google的SRE書籍是另一個有用的資源,特別是第6章:監控分散式系統。
- 要了解如何構建您自己的Grafana儀表板,請查看Grafana的入門頁面。
在下一步中,我們將遵循類似的流程連接到並探索Prometheus監控系統。
步驟4 — 存取 Prometheus 和 Alertmanager
要連接到 Prometheus Pods,我們可以使用 kubectl port-forward
來轉發本地端口。如果您已完成探索 Grafana,您可以通過按下 CTRL-C
來關閉端口轉發隧道。或者,您可以打開一個新的 shell 並創建一個新的端口轉發連接。
首先列出 default
命名空間中運行的 Pods:
您應該看到以下 Pods:
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
:
您應該看到以下輸出:
OutputForwarding 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
:
您應該看到以下輸出:
OutputForwarding 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
子目錄,並列出該目錄的內容:
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
-
alertmanager-0serviceaccount.yaml
: Alertmanager服務帳戶,用於為Alertmanager Pod提供Kubernetes身份。要了解更多有關服務帳戶的信息,請參閱為Pod配置服務帳戶。 -
alertmanager-configmap.yaml
:包含最小 Alertmanager 配置文件的 ConfigMap,名為alertmanager.yml
。配置 Alertmanager 超出本教程範圍,但您可以通過參考 Alertmanager 文檔中的配置部分來了解更多。 -
alertmanager-operated-service.yaml
:Alertmanagermesh
服務,用於在當前的 2 個副本高可用配置中在 Alertmanager Pods 之間路由請求。 -
alertmanager-service.yaml
: 用於訪問 Alertmanager Web 介面的 Alertmanagerweb
服務,您可能已在上一步驟中完成。 -
alertmanager-statefulset.yaml
: 配置為 2 個副本的 Alertmanager StatefulSet。
Grafana
-
dashboards-configmap.yaml
:包含预先配置的 JSON Grafana 监控仪表板的 ConfigMap。从头开始生成新的仪表板和警报超出了本教程的范围,但要了解更多信息,您可以参考 kubernetes-mixin GitHub 存储库。 -
grafana-0serviceaccount.yaml
:Grafana 服务账户。 -
grafana-configmap.yaml
:包含一組預設的最小 Grafana 配置文件的 ConfigMap。 -
grafana-secret.yaml
:包含 Grafana 管理員用戶名和密碼的 Kubernetes 秘密。要了解有關 Kubernetes 秘密的更多信息,請參考秘密。 -
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 Service Account 和 ClusterRole。要了解更多關於 ClusterRoles 的信息,請參考 Kubernetes 文檔中的 角色和 ClusterRole。 -
kube-state-metrics-deployment.yaml
:主要的 kube-state-metrics 部署清單,配置了 1 個使用addon-resizer
的動態可擴展副本。 -
kube-state-metrics-service.yaml
:暴露 kube-state-metrics 部署的服務。
node-exporter
-
node-exporter-0serviceaccount.yaml
: Node-exporter 服務帳戶。 -
node-exporter-ds.yaml
: Node-exporter DaemonSet 清單。由於 node-exporter 是一個 DaemonSet,因此在叢集中的每個節點上運行一個 node-exporter Pod。
###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
主要清單文件:
滾動到清單的 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 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
文件中找到對原存儲庫的所有修改和更改清單。