grafana&prometheus生產級容器化監控-1:生產級容器化

本文是grafana/prometheus生產級容器化實踐系列文章的第一篇。

目錄:

(1).grafana/prometheus簡單回顧

(2).grafana/prometheus生產級實踐

1.容器化多個prometheus實例

2.exporter組件

3.業務服務

4.grafana

(3).grafana/prometheus生產級容器化配置

1.注意事項

2.容器化步驟

3.關鍵配置

(4).相關文章

(1).grafana/prometheus簡單回顧

prometheus是時序數據庫,相比傳統數據庫更適合存儲監控類數據;是一套開源的系統監控報警框架。它啟發於 Google 的 borgmon 監控系統;同時也是雲原生時代監控的事實標準。

Grafana是一個跨平臺的開源的度量分析和可視化工具,可以通過將採集的數據查詢然後可視化的展示,並及時通知,支持多種數據源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB。一般都使用prometheus作為其數據源。

每一個prometheus實例都有一個prometheus.xml配置,裡邊定義了抓取規則,從滿足哪些條件的服務獲取metircs數據,默認60秒抓一次;然後在grafana上製作dashboard,在dashboard中定義查詢語句將監控數據展示為監控圖表。

(2).grafana/prometheus生產級實踐

grafana&prometheus生產級容器化監控-1:生產級容器化

原始圖片位於:

https://github.com/hepyu/k8s-app-config/blob/master/product/standard/grafana-prometheus-pro/images/grafana-prometheus%E7%94%9F%E4%BA%A7%E7%BA%A7%E5%AE%9E%E8%B7%B5.jpg

如上圖所示:

1.容器化多個prometheus實例

由於當數據量很大(metrics很多)或者grafana選擇的時間跨度很大時,prometheus的吞吐性能會很有問題,再加上會有很多人通過grafana查看各業務數據,如果生產環境只部署一個prometheus,肯定是有問題的,prometheus會經常性崩潰。

同時,這樣也可以設置不同的數據保存時間,比如對於mq來說,我希望保留更長時間的數據。

2.exporter組件

prometheus-expoerter組件是一個數據收集和聚合的組件,以exporter-rocketmq為例,prometheus通過prometheus.xml中定義的抓取規則定時從exporter-rocketmq拉取監控數據,exporter-rocketmq收到請求後,再從rocketmq集群獲取監控數據,分析處理後聚合成metircs的格式返回給prometheus存儲。

本文中的rocketmq-exporter沒有使用官方的exporter,是根據筆者公司的情況自行開發,後續會另行發文/開源。

3.業務服務

prometheus不僅僅作為基礎組件的監控數據存儲,同樣的,我們可以在業務服務中使用,去監控一些業務指標,比如筆者曾經開發的oss上傳基礎服務,筆者十分關心文件上傳數,上傳文件大小/時間,以及相關的p90等指標。幫助筆者發現/確認問題,事實上很有幫助,比如曾經發現有1G大小的文件被上傳等異常現象。

成本強相關的服務(不侷限於此)非常適合這樣處理。

可以理解為監控打點。

下圖為oss上傳服務的上傳文件大小的監控截圖:

grafana&prometheus生產級容器化監控-1:生產級容器化

下圖為oss上傳服務架構圖:

原圖參見:

https://github.com/hepyu/k8s-app-config/blob/master/product/standard/grafana-prometheus-pro/images/caf-cdn%E6%96%B9%E6%A1%88.jpg

grafana&prometheus生產級容器化監控-1:生產級容器化

相關文章參見:

4.grafana

主要說明3部分,grafana-web, provisioning-datasources, provisioning-dashboards

grafana-web:

通過豐富圖表展示監控數據,這些圖表有dashboard定義。

provisioning-datasources:

位於:

https://github.com/hepyu/k8s-app-config/tree/master/product/standard/grafana-prometheus-pro/grafana/provisioning/datasources

這個目錄下只有一個文件datasource.yml,定義grafana獲取查詢數據的數據源,可以定義多個數據源,不同的圖表/dashboard可以使用不同的數據源。

datasources:
- name: prometheus-mq-rocketmq
type: prometheus
access: proxy
orgId: 1
url: http://prometheus-mq-rocketmq:9090
isDefault: false
jsonData:
tlsAuth: false
tlsAuthWithCACert: false

provisioning-dashboards:

位於:

https://github.com/hepyu/k8s-app-config/tree/master/product/standard/grafana-prometheus-pro/grafana/provisioning/dashboards

這個目錄下有一個provision.yml配置文件,和不同監控組件的dashboard目錄。

provision.yml定義了dashboard位置,用於grafana啟動時加載。

providers:
- name: 'storage-mysql'
orgId: 1
folder: 'storage-mysql'
folderUid: ''

type: file
options:
path: /var/lib/grafana/k8s-app-config/product/standard/grafana-prometheus-pro/grafana/provisioning/dashboards/storage-mysql
- name: 'mq-rocketmq'
orgId: 1
folder: 'mq-rocketmq'
folderUid: 'mq-rocketmq'
type: file
options:
path: /var/lib/grafana/k8s-app-config/product/standard/grafana-prometheus-pro/grafana/provisioning/dashboards/mq-rocketmq

建議使用provisioning-dashboards方式去定義dashboard,這樣的dashboard在grafana界面是不允許修改的,更加安全,防止誤操作。

(3).grafana/prometheus生產級容器化配置

筆者提供了一個grafana/prometheus生產級的容器化配置,完全按照本文方式實現,位於:

https://github.com/hepyu/k8s-app-config/tree/master/product/standard/grafana-prometheus-pro

1.注意事項

a.本配置使用的是local-pv,生產使用要換成雲存儲,本配置提供nfs的配置(已註釋)。

b.imagePullSecret是註釋掉的,生產要打開,因為鏡像倉庫都是有secret的。

c.注意先建立pv目錄和掛載,注意目錄的權限,否則prometehus, grafana容器化失敗,給775或777。

2.容器化步驟

kubectl apply -f grafana-prometheus-image-repo-secret.yaml(生產環境需要改成自己的秘鑰,本地部署不要執行)

kubectl apply -f grafana-prometheus-namespace.yaml

分別進入子目錄執行:kubectl apply -f .

容器化完成後的樣例:

grafana&prometheus生產級容器化監控-1:生產級容器化

grafana&prometheus生產級容器化監控-1:生產級容器化

不過現在dashboard是沒有數據顯示的,如何將各類基礎中間件納入grafana/prometheus監控,請關注後續文章。

3.關鍵配置

下述關鍵配置位於文件:

https://github.com/hepyu/k8s-app-config/blob/master/product/standard/grafana-prometheus-pro/grafana/grafana-statefulset.yaml​

下邊的配置保證grafana啟動前先把dashboards和datasources配置下載到本地。

initContainers:
- name: dashboards-clear
#存到你公司自己的鏡像倉庫,不要用docker官方倉庫
image: alpine/git:1.0.7
command: ['sh', '-c', 'rm -rf inc-k8s-app-config']
volumeMounts:
- name: pv-metrics-grafana
mountPath: /git
- name: dashboards-sync
#存到你公司自己的鏡像倉庫,不要用docker官方倉庫
image: alpine/git:1.0.7
command: ['sh', '-c', 'git clone ']
volumeMounts:
- name: pv-metrics-grafana
mountPath: /git

下圖配置指定了grafana啟動時從哪裡加載dashboards和datasources,即之前git clone下的目錄。

env:

#開啟percona的dashboards,用於mysql監控dashboard顯示,關閉,我們通過provisioning方式實現dashboard導入.

env:
#開啟percona的dashboards,用於mysql監控dashboard顯示,關閉,我們通過provisioning方式實現dashboard導入.
#- name: GF_INSTALL_PLUGINS
# value: "percona-percona-app"
- name: GF_PATHS_PROVISIONING
value: "/var/lib/grafana"

(4).相關文章

1.

2.

grafana&prometheus生產級容器化監控-1:生產級容器化


分享到:


相關文章: