介紹
越來越多的組織採用Kubernetes來管理其容器,需要一個解決方案來監控其分佈式系統的健康狀況。因此,您將進入Prometheus – 一個強大的開源工具,用於監控K8s空間中的容器化應用程式。
在本教程中,您將學習如何安裝和配置Prometheus堆棧,以監控您的DOKS集群中的所有Pod,以及Kubernetes集群狀態指標。然後,您將連接Prometheus與Grafana,以可視化所有指標並使用PromQL語言執行查詢。最後,您將為您的Prometheus實例配置持久性存儲,以持久保存所有DOKS集群和應用程式指標數據。
目錄
- 先決條件
- 步驟1 – 安裝Prometheus堆棧
- 步驟2 – 配置Prometheus和Grafana
- 步驟3 – PromQL(Prometheus查詢語言)
- 步驟4 – 使用Grafana可視化指標
- 步驟 5 – 配置 Prometheus 的持久性存儲
- 步驟 6 – 配置 Grafana 的持久性存儲
- 結論
先決條件
完成本教程,您將需要:
- A Git client to clone the Starter Kit repository.
- Helm 用於管理 Prometheus 堆棧的發布和升級。
- Kubectl 用於 Kubernetes 交互。
- Curl 用於測試示例(後端應用程式)。
- 在叢集中部署 Emojivoto 示例應用程式。
請確保 kubectl
上下文已配置為指向您的 Kubernetes 叢集。請參考 DOKS 設置教程中的 步驟 3 – 創建 DOKS 叢集。
步驟 1 – 安裝 Prometheus 堆疊
在此步驟中,您將安裝 kube-prometheus
堆疊,這是針對 Kubernetes 的一個具有見解的完整監控堆疊。它包括 Prometheus Operator、kube-state-metrics
、預先構建的清單、節點導出器、指標 API、Alerts Manager 和 Grafana。
您將使用 Helm 套件管理器來完成此任務。Helm 圖表可在此處查看。
首先,複製 Starter Kit 存儲庫並將目錄更改為您的本地副本。
接下來,添加 Helm 存儲庫並列出可用的圖表:
輸出類似於以下內容:
NAME CHART VERSION APP VERSION DESCRIPTION
prometheus-community/alertmanager 0.18.1 v0.23.0 The Alertmanager handles alerts sent by client ...
prometheus-community/kube-prometheus-stack 35.5.1 0.56.3 kube-prometheus-stack collects Kubernetes manif...
...
感興趣的圖表是 prometheus-community/kube-prometheus-stack
,它將在叢集上安裝 Prometheus、Promtail、Alertmanager 和 Grafana。請訪問kube-prometheus-stack頁面以獲取有關此圖表的更多詳細信息。
然後,使用您喜歡的編輯器(最好支持 YAML 驗證)打開並檢查提供在 Starter Kit 存儲庫中的04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml
文件。默認情況下,kubeSched
和etcd
指標已禁用 – 這些組件由DOKS
管理,且對Prometheus不可訪問。請注意,存儲設置為emptyDir
。這意味著如果 Prometheus pod 重新啟動,存儲將會丟失(您稍後將在配置 Prometheus 的持久存儲部分中修復此問題)。
[選擇性] 如果您遵循了“設置 DigitalOcean 管理的 Kubernetes 集群”指南中的第 4 步 – 添加用於可觀察性的專用節點,則需要編輯提供在 Starter Kit 存儲庫中的04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml
文件,並取消註釋 Grafana 和 Prometheus 的affinity
部分。
上述配置的解釋:
preferredDuringSchedulingIgnoredDuringExecution
– 調度器嘗試找到符合規則的節點。如果找不到匹配的節點,調度器仍然會調度 Pod。preference.matchExpressions
– 根据特定标准匹配特定节点的选择器。上述示例告诉调度器将工作负载(例如 Pod)放置在带有键 –preferred
和值 –observability
的节点上。
最后,使用 Helm
安装 kube-prometheus-stack
:
A specific version of the Helm chart is used. In this case 35.5.1
was picked, which maps to the 0.56.3
version of the application (see output from Step 2.). It’s a good practice to lock on a specific version. This helps to have predictable results and allows versioning control via Git.
–create-namespace \
现在,检查 Prometheus stack Helm 发布状态:
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
kube-prom-stack monitoring 1 2022-06-07 09:52:53.795003 +0300 EEST deployed kube-prometheus-stack-35.5.1 0.56.3
输出看起来类似于以下内容。注意 STATUS
列的值 – 应该为 deployed
。
查看 Prometheus 可用的 Kubernetes 资源:
NAME READY STATUS RESTARTS AGE
pod/alertmanager-kube-prom-stack-kube-prome-alertmanager-0 2/2 Running 0 3m3s
pod/kube-prom-stack-grafana-8457cd64c4-ct5wn 2/2 Running 0 3m5s
pod/kube-prom-stack-kube-prome-operator-6f8b64b6f-7hkn7 1/1 Running 0 3m5s
pod/kube-prom-stack-kube-state-metrics-5f46fffbc8-mdgfs 1/1 Running 0 3m5s
pod/kube-prom-stack-prometheus-node-exporter-gcb8s 1/1 Running 0 3m5s
pod/kube-prom-stack-prometheus-node-exporter-kc5wz 1/1 Running 0 3m5s
pod/kube-prom-stack-prometheus-node-exporter-qn92d 1/1 Running 0 3m5s
pod/prometheus-kube-prom-stack-kube-prome-prometheus-0 2/2 Running 0 3m3s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 3m3s
service/kube-prom-stack-grafana ClusterIP 10.245.147.83 <none> 80/TCP 3m5s
service/kube-prom-stack-kube-prome-alertmanager ClusterIP 10.245.187.117 <none> 9093/TCP 3m5s
service/kube-prom-stack-kube-prome-operator ClusterIP 10.245.79.95 <none> 443/TCP 3m5s
service/kube-prom-stack-kube-prome-prometheus ClusterIP 10.245.86.189 <none> 9090/TCP 3m5s
service/kube-prom-stack-kube-state-metrics ClusterIP 10.245.119.83 <none> 8080/TCP 3m5s
service/kube-prom-stack-prometheus-node-exporter ClusterIP 10.245.47.175 <none> 9100/TCP 3m5s
service/prometheus-operated ClusterIP None <none> 9090/TCP 3m3s
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/kube-prom-stack-prometheus-node-exporter 3 3 3 3 3 <none> 3m5s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/kube-prom-stack-grafana 1/1 1 1 3m5s
deployment.apps/kube-prom-stack-kube-prome-operator 1/1 1 1 3m5s
deployment.apps/kube-prom-stack-kube-state-metrics 1/1 1 1 3m5s
NAME DESIRED CURRENT READY AGE
replicaset.apps/kube-prom-stack-grafana-8457cd64c4 1 1 1 3m5s
replicaset.apps/kube-prom-stack-kube-prome-operator-6f8b64b6f 1 1 1 3m5s
replicaset.apps/kube-prom-stack-kube-state-metrics-5f46fffbc8 1 1 1 3m5s
NAME READY AGE
statefulset.apps/alertmanager-kube-prom-stack-kube-prome-alertmanager 1/1 3m3s
statefulset.apps/prometheus-kube-prom-stack-kube-prome-prometheus 1/1 3m3s
您应该已部署以下资源:prometheus-node-exporter
、kube-prome-operator
、kube-prome-alertmanager
、kube-prom-stack-grafana
和 kube-state-metrics
。输出类似于:
然后,您可以通过端口转发到本地机器连接到 Grafana(使用默认凭据:admin/prom-operator
– 请参阅 prom-stack-values-v35.5.1 文件):
您不应将 Grafana 暴露给公共网络(例如创建 Ingress 映射或 LB 服务)使用 默认登录/密码
。
Grafana安裝包含多個儀表板。在localhost:3000上打開網頁瀏覽器。一旦進入,您可以轉到儀表板 -> 瀏覽,並選擇不同的儀表板。
在下一部分,您將了解如何設置Prometheus來發現監控目標。作為示例,將使用Emojivoto
示例應用程序。您還將了解ServiceMonitor
是什麼。
您已經將Prometheus和Grafana部署到集群中。在此步驟中,您將了解如何使用ServiceMonitor
。 ServiceMonitor是告訴Prometheus如何發現新監控目標的首選方法之一。
在前提條件部分的第5步中創建的Emojivoto部署默認在端口8801
上通過Kubernetes服務提供了/metrics
端點。
接下來,您將發現負責為Prometheus公開指標數據的Emojivoto服務。所涉及的服務分別稱為emoji-svc
和voting-svc
(請注意,它使用的是emojivoto
命名空間):
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
emoji-svc ClusterIP 10.245.135.93 <none> 8080/TCP,8801/TCP 22h
voting-svc ClusterIP 10.245.164.222 <none> 8080/TCP,8801/TCP 22h
web-svc ClusterIP 10.245.61.229 <none> 80/TCP 22h
輸出類似於以下內容:
接下來,執行port-forward
以檢查指標:
暴露的指標可以通過在網頁瀏覽器中導航至localhost或通過curl:
輸出看起來類似以下內容:
go_gc_duration_seconds{quantile="0"} 5.317e-05
go_gc_duration_seconds{quantile="0.25"} 0.000105305
go_gc_duration_seconds{quantile="0.5"} 0.000138168
go_gc_duration_seconds{quantile="0.75"} 0.000225651
go_gc_duration_seconds{quantile="1"} 0.016986437
go_gc_duration_seconds_sum 0.607979843
go_gc_duration_seconds_count 2097
# TYPE go_gc_duration_seconds summary
要檢查voting-svc
服務的指標,請停止emoji-svc
的端口轉發,然後對第二個服務執行相同的步驟。
- 接下來,將Prometheus連接到Emojivoto指標服務。有幾種方法可以做到這一點:
- <static_config> – 允許指定目標列表和它們的共同標籤集。
- <kubernetes_sd_config> – 允許從Kubernetes的REST API檢索採集目標並始終與集群狀態同步。
Prometheus Operator – 通過CRDs簡化Kubernetes集群內的Prometheus監控。
接下來,您將使用Prometheus Operator公開的ServiceMonitor
CRD來定義新的監控目標。
首先,更改目錄(如果尚未這樣做)到Starter Kit Git存儲庫已克隆的位置:
接下來,使用您選擇的文本編輯器(最好支持YAML lint)打開Starter Kit存儲庫中提供的04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml
文件。請刪除周圍關於additionalServiceMonitors
部分的註釋。輸出看起來類似於:
- 上述配置的解釋:
selector -> matchExpressions
– 告訴ServiceMonitor
要監控哪個服務。它將針對所有具有標籤鍵app和值emoji-svc
和voting-svc
的服務。這些標籤可以通過運行以下命令獲取:kubectl get svc --show-labels -n emojivoto
namespaceSelector
– 在這裡,您希望匹配部署了Emojivoto
的命名空間。
endpoints -> port
– 引用要監控的服務的端口。
最後,使用Helm應用更改:
接下來,請檢查是否將Emojivoto
目標添加到Prometheus進行抓取。為Prometheus創建一個端口轉發,端口為9090
:
在localhost:9090上打開一個Web瀏覽器。然後,轉到Status -> Targets頁面,並檢查結果(請注意serviceMonitor/monitoring/emojivoto-monitor/0
路徑):
發現的目標中有2個條目,因為Emojivoto
部署包含2個公開度量端點的服務。
在接下来的步骤中,您将了解Prometheus查询语言(PromQL)以及一些简单示例,以帮助您入门并了解这种语言。
在这一步中,您将学习Prometheus查询语言(PromQL)的基础知识。PromQL可帮助您对来自DOKS集群中所有Pod和应用程序的各种指标执行查询。
PromQL是一种专为Prometheus构建的特定领域语言(DSL),允许您查询指标。整体表达式定义了最终值,而嵌套表达式表示参数和操作数的值。有关更深入的解释,请访问官方的PromQL页面。
接下来,您将检查其中一个Emojivoto
指标,即emojivoto_votes_total
,它表示投票的总数。这是一个计数器值,每次对Emojivoto
投票端点发出请求时都会增加。
首先,在端口9090
上为Prometheus创建一个端口转发:
接下来,打开表达式浏览器。
emojivoto_votes_total{container="voting-svc", emoji=":100:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 20
emojivoto_votes_total{container="voting-svc", emoji=":bacon:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 17
emojivoto_votes_total{container="voting-svc", emoji=":balloon:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 21
emojivoto_votes_total{container="voting-svc", emoji=":basketball_man:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 10
emojivoto_votes_total{container="voting-svc", emoji=":beach_umbrella:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 10
emojivoto_votes_total{container="voting-svc", emoji=":beer:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 11
在查询输入字段中粘贴emojivoto_votes_total
,然后按回车键。输出看起来类似于:
導航到 Emojivoto
應用程式,從首頁點擊 100 表情符號以進行投票。
emojivoto_votes_total{container="voting-svc", emoji=":100:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 21
emojivoto_votes_total{container="voting-svc", emoji=":bacon:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 17
emojivoto_votes_total{container="voting-svc", emoji=":balloon:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 21
emojivoto_votes_total{container="voting-svc", emoji=":basketball_man:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 10
emojivoto_votes_total{container="voting-svc", emoji=":beach_umbrella:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 10
emojivoto_votes_total{container="voting-svc", emoji=":beer:", endpoint="prom", instance="10.244.25.31:8801", job="voting-svc", namespace="emojivoto", pod="voting-74ff7f8b55-jl6qs", service="voting-svc"} 11
從第 3 步的查詢結果頁面導航並點擊 執行 按鈕。您應該會看到 100 表情符號的計數器增加了一個。輸出看起來類似於:
PromQL 將類似的數據分組到所謂的向量中。如上所示,每個向量都有一組屬性,可以使其彼此區分。您可以基於感興趣的屬性將結果分組。例如,如果您只關心來自 voting-svc
服務的請求,那麼請在查詢字段中輸入以下內容:
emojivoto_votes_total{container="voting-svc", emoji=":100:", endpoint="prom", instance="10.244.6.91:8801", job="voting-svc", namespace="emojivoto", pod="voting-6548959dd7-hssh2", service="voting-svc"} 492
emojivoto_votes_total{container="voting-svc", emoji=":bacon:", endpoint="prom", instance="10.244.6.91:8801", job="voting-svc", namespace="emojivoto", pod="voting-6548959dd7-hssh2", service="voting-svc"} 532
emojivoto_votes_total{container="voting-svc", emoji=":balloon:", endpoint="prom", instance="10.244.6.91:8801", job="voting-svc", namespace="emojivoto", pod="voting-6548959dd7-hssh2", service="voting-svc"} 521
輸出看起來類似於(請注意,它僅選擇與您標準相匹配的結果):
以上結果顯示了從發出指標的 Emojivoto
部署中每個 Pod 的總請求數(由 2 個部分組成)。
這只是對 PromQL 是什麼及其能力的非常簡單的介紹。但它可以做得更多,比如計算指標數量,在預定間隔內計算速率等。請訪問官方的 PromQL 頁面以了解語言的更多功能。
在下一步中,您將學習如何使用 Grafana 來可視化 Emojivoto
樣本應用程式的指標。
儘管 Prometheus 具有一些內置支持來可視化數據,但更好的方式是通過 Grafana 來完成,它是一個用於監控和觀測的開源平台,讓您可以可視化和探索集群的狀態。
官方網頁描述了它能夠:
查詢、可視化、警報和理解您的數據,無論它存儲在何處。
安裝 Grafana 無需任何額外步驟,因為步驟1 – 安裝 Prometheus 堆疊已經為您安裝了 Grafana。您只需像下面這樣進行端口轉發,立即訪問儀表板(默認凭證:admin/prom-monitor
):
要查看所有 Emojivoto
指標,您將使用 Grafana 中預安裝的默認儀表板之一。
轉到 Grafana 儀表板 部分。
接下來,搜索 General/Kubernetes/Compute Resources/Namespace(Pods) 儀表板並訪問它。
最後,選擇 Prometheus 數據源,添加 emojivoto
命名空間。
您可以在 Grafana 中玩弄並添加更多面板來可視化其他數據來源,並根據範圍將它們分組。此外,您可以從 Grafana kube-mixin 項目中探索可用的 Kubernetes 儀表板。
在下一步中,您將使用 DigitalOcean 块存儲配置 Prometheus 的持久存儲,以便在服務器重新啟動或集群失敗時保留您的 DOKS 和應用程序指標。
在此步驟中,您將學習如何啟用 Prometheus 的持久存儲,以便在服務器重新啟動或集群失敗時保留指標數據。
首先,您需要一個存儲類來進行操作。運行以下命令來檢查可用的存儲類。
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
do-block-storage (default) dobs.csi.digitalocean.com Delete Immediate true 4d2h
輸出應該類似於以下內容。請注意,您可以使用 DigitalOcean 块存儲。
接下來,更改目錄(如果尚未更改)到已克隆的 Starter Kit Git 存儲庫所在位置:
然後,使用您選擇的文本編輯器(最好支援YAML lint)打開Starter Kit存儲庫中提供的04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml
文件。搜索storageSpec
行,並取消對Prometheus所需部分的註釋。 storageSpec
定義應如下所示:
- 上述配置的說明:
volumeClaimTemplate
– 定義新的PVC。storageClassName
– 定義存儲類別(應與kubectl get storageclass
命令輸出中的值相同)。
resources
– 設置存儲請求值。 在這種情況下,為新卷請求了5 Gi的總容量。
最後,使用Helm應用設置:
完成上述步驟後,檢查PVC狀態:
NAME STATUS VOLUME CAPACITY ACCESS MODES AGE
kube-prome-prometheus-0 Bound pvc-768d85ff-17e7-4043-9aea-4929df6a35f4 5Gi RWO do-block-storage 4d2h
A new Volume should appear in the Volumes web page from your DigitalOcean account panel:
輸出看起來類似以下內容。STATUS
列應顯示Bound
。
在這一步,您將學習如何啟用 Grafana 的持久性存儲,以便在服務器重新啟動時或集群故障時保留圖形。您將定義一個使用 DigitalOcean 块存儲的 5 Gi 持久性卷索取(PVC)。下一步與 第 5 步 – 配置 Prometheus 的持久性存儲 相同。
首先,使用您選擇的文本編輯器(最好支持 YAML lint)打開提供的 Starter Kit 存儲庫中的 04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml
文件。Grafana 的持久性存儲部分應該如下所示:
接下來,使用 Helm 應用設置:
完成上述步驟後,檢查 PVC 狀態:
NAME STATUS VOLUME CAPACITY ACCESS MODES AGE
kube-prom-stack-grafana Bound pvc-768d85ff-17e7-4043-9aea-4929df6a35f4 5Gi RWO do-block-storage 4d2h
A new Volume should appear in the Volumes web page from your DigitalOcean account panel:
輸出看起來類似於以下內容。 STATUS
列應顯示 Bound
。
- 根據您的需求計算卷的大小,請遵循官方文檔建議和公式:
- Prometheus 每个样本平均只存储 1-2 个字节。因此,要计划 Prometheus 服务器的容量,您可以使用以下粗略公式:
needed_disk_space = retention_time_seconds * ingested_samples_per_second * bytes_per_sample
要降低摄入样本的速率,您可以减少抓取的时间序列数量(减少目标或每个目标的序列数量),或者您可以增加抓取间隔。然而,减少时间序列的数量可能更有效,因为在一个时间序列中对样本进行了压缩。