基於 Prometheus 的邊緣計算監控實踐

監控作為邊緣計算基礎設施的重要組成部分,是邊緣穩定性的基本保障。本文主要介紹火山引擎邊緣計算的監控實踐,分享火山引擎如何進行監控技術選型以及構建監控服務體系。主要內容如下:

邊緣計算監控初衷

基於 Prometheus 的監控系統

落地實踐

總結

01 邊緣計算監控初衷

監控作為邊緣計算基礎設施的重要組成部分,是邊緣穩定性的基本保障。在面對低時延、高頻寬、異構匯聚等特點的邊緣環境時,如何更加清晰的展現出邊緣叢集的執行狀態,應對邊緣環境複雜多變的線上挑戰?為此,火山引擎邊緣計算需要構建一套完善的邊緣計算監控和服務體系。

02 基於 Prometheus 的監控系統

火山引擎邊緣計算採用了雲原生架構,而 Prometheus 作為雲原生時代的指標監控利器,有其先天的優勢。相較於其他監控方案,Prometheus 具有以下優點:

原生支援 Kubernetes(以下簡稱 K8s) 監控,具有 K8s 物件服務發現能力,而且核心元件提供了 Prometheus 的採集介面;

基於 HTTP 的 pull 方式採集時序資料,可以滿足邊緣多叢集的監控需求;

無依賴儲存,支援 local 和 remote 儲存模式;

提供有資料查詢語言 PromQL,使用者可以直接透過 PromQL 從 Prometheus 裡查詢到需要的聚合資料。

支援多種多樣的圖表和介面展示,比如 Grafana 等。

基於 Prometheus 的監控系統的架構如圖所示,這裡詳細分享一下資料來源和 Prometheus Server 兩部分。

基於 Prometheus 的邊緣計算監控實踐

資料來源

在監控系統中,資料來源部分包含:

node-exporter

:採集物理節點指標;

kube-state-metrics

:採集k8s相關指標,包括資源使用情況,以及各種物件的狀態資訊;

cadvisor

:採集容器相關指標;

apiserver, etcd, scheduler, k8s-lvm,gpu 等核心元件的監控資料;

其他自定義 metrics,透過在 pod yaml 檔案 annotations 新增 prometheus。io/scrape: “true” 可實現自動抓取提供的 metrics;

Prometheus Server

Prometheus Server 是 Prometheus 最核心的模組。它主要包含抓取、儲存和查詢這3個功能:

抓取

:Prometheus Server 透過服務發現元件,週期性地從 Exporter 中透過 HTTP 輪詢的形式拉取監控指標資料。

儲存

:抓取到的監控資料透過一定的規則清理和資料整理(抓取前使用服務發現提供的 relabel_configs 方法,抓取後使用作業內的 metrics_relabel_configs 方法),把得到的結果儲存到新的時間序列中進行持久化。

查詢

:Prometheus 持久化資料以後,客戶端就可以透過 PromQL 語句對資料進行查詢了。

03 落地實踐

整體監控架構

邊緣計算基於 Prometheus、M3DB、自研 Metrix 等構建起一套監控架構,架構圖如下:

基於 Prometheus 的邊緣計算監控實踐

整個邊緣計算監控架構主要由資料採集、Prometheus、M3DB、Grafana、Metrix 幾個核心模組構成。

資料採集

Prometheus 對接元件監控資訊通常使用 exporter。exporter 不會主動推送監控資料到 server 端,而是等待 server 端定時來收集資料,即所謂的主動監控。邊緣計算使用的 exporter 包含:node_exporter、xlb_exporter、kubevirt-exporter 等。然後透過 Endpoints 物件定義需要監控的裝置IP及埠,Prometheus Pod 根據 ServiceMonitor 配置向分佈在各裝置上的 exporter 拉取 metrics 資料;

Prometheus

Prometheus Pod 將採集上來的資料根據 record-rules 進行 relabel、預聚合等操作,然後將所有資料打上 externalLabels(例如 cluster: bdcdn-bccu)remote write 寫入遠端的 M3DB;

M3DB

M3DB 是分散式時序資料庫,實現了 Pometheus 的 remote_read 和 remote_write 介面,同時支援 PromQL 等查詢語言。我們使用了 M3DB 作為儲存邊緣計算相關的監控資料,用於對接報警及展示。

Metrix 和 Grafana

透過 PromQL 語句向 M3DB 查詢資料,對接報警系統 Metrix 和檢視展示。

監控元件

透過以 Prometheus 為主的若干元件實現 K8s 全元件監控及業務監控,元件列表如下:

監控元件

功能點

prometheus

一套開源的監控&報警&時間序列資料庫的組合;

prometheus-adapter

轉換成 prometheus 的監控;

grafana

一個開源的度量分析與視覺化套件;

cAdvisor

機器上的資源及容器進行實時監控和效能資料採集,包括 CPU 使用情況、記憶體使用情況、網路吞吐量及檔案系統使用情況。現在已經整合到 kubelet 裡了;

node-exporter

收集 *NIX 系統中硬體、系統指標;

eventrouter

事件採集,可以採集叢集中的 event 到 es 中;

blackbox-exporter

主動監測主機與服務狀態;

儲存 M3DB

分散式時序資料庫;

Metrix

自研產品,用於報警;

儲存後端

儲存後端主要是 M3DB。M3DB 是原生的分散式時序資料庫,提供高度靈活和效能的聚合服務、查詢引擎等。M3DB 能夠透過提供不同的元件進行分離,讓分散式時序資料庫進行很好的擴充套件。

分散式數序資料儲存

(M3DB):提供可水平擴充套件的時序資料儲存和反向索引;

一個 Sidecar 程式

(M3Coordinator):可以使 M3DB 作為 Prometheus 的遠端儲存使用;

分散式查詢引擎

(M3Query):支援 PromQL, Graphit 和 自研的 M3Query 語法;

聚合服務

(M3Aggregator):對資料進行聚合和降級,以實現對不同指標執行不同儲存策略。

基於 Prometheus 的邊緣計算監控實踐

監控指標

K8s 的資源指標分類:

資源指標

:metrics-server 內建 API;

自定義指標

:透過 Prometheus 來採集,需要元件 k8s-prometheus-adapter;

基於 Prometheus 的邊緣計算監控實踐

(1)metrics-server:API server

kubectl api-versions 中預設不包含 metrics。k8s。io/v1beta1;

使用時需要新增 kube-aggregator 字首;

可以使用 kubectl top nodes 來獲取資訊。

(2)自定義指標

如 node_exporter 用來暴露 node 資訊,當然還有其他的 exporter;

PromQL 查詢語句,不能直接被 K8s 直接解析,需要透過 kube-state-metrics 元件轉 k8s-promethues-adpater 轉為 Custom Metrics API;

(3)HPA --- 基於資源值指標的伸縮

指定 Deployment、ReplicaSet 或 ReplicationController,並建立已經定義好資源的自動伸縮器。使用自動伸縮器可以根據需要自動增加或減少系統中部署的 pod 數量。

Metrics Server

:叢集級別的核心資源使用聚合器,透過各個節點的 /stats/summary 介面提供的資料來收集節點和 Pod 的 CPU 和記憶體使用情況。Summary API 是一種記憶體高效的 API,用於將資料從 kubelet/cAdvisor 傳遞到 Metrics Server。

API Server

:聚合 Metrics Server 提供的核心資源指標,透過 metrics。k8s。io/v1beta1 API提供給 HPA 做自動擴縮。

基於 Prometheus 的邊緣計算監控實踐

同時,我們採用 Grafana 將採集的資料進行查詢和視覺化。透過對系統拆解,分別在物理機、網路、K8s、儲存等層級做了監控匯聚及展示。以上是整個邊緣計算監控服務體系的主要模組。

04 總結

回顧一下本文介紹的主要內容:

首先,介紹了邊緣計算場景下的監控,包括邊緣計算監控場景面臨的挑戰及監控的重要性;

然後,介紹瞭如何實現邊緣計算的監控,基於 Prometheus 的監控系統;

最後,介紹了邊緣計算監控的落地實踐場景,包括監控架構及監控元件、儲存後端、監控指標等;

基於 Prometheus 構建的監控系統,不僅滿足了多樣化業務對監控的需求,還提升了火山引擎邊緣計算對邊緣叢集的管控、運維能力。而 Prometheus 作為新生代的開源監控系統,已成為雲原生體系的事實標準,也證明了其設計很受歡迎。