前面幾篇文章我們使用 Prometheus 采集了各種各樣的監(jiān)控數(shù)據(jù)指標(biāo),并使用 promQL
語句查詢出了一些數(shù)據(jù),在 Prometheus 的 Dashboard 中進行了展示,但是明顯可以感覺到 Prometheus 的圖表功能相對較弱,所以一般情況下我們會一個第三方的工具來展示這些數(shù)據(jù),也就是本篇文章要介紹的 Grafana。
簡介
Grafana 是一個跨平臺的度量分析和可視化工具,可以通過將采集的數(shù)據(jù)查詢和可視化展示,并及時警報。
Grafana 具有可插拔數(shù)據(jù)源模型,支持許多流行的時間序列數(shù)據(jù)庫,如 Graphite,Prometheus,Elasticsearch,OpenTSDB 和 InfluxDB。
特性
可以前往 https://play.grafana.org 體驗 Grafana 特性。
可視化
快速靈活的可視化以及多種選擇,使你可以以任何方式可視化數(shù)據(jù)。官方庫中具有豐富的儀表盤插件,比如熱圖、折線圖、圖表等多種展示方式。
動態(tài)儀表盤
使用模板變量創(chuàng)建動態(tài)且可重復(fù)使用的儀表板,這些模板變量顯示在儀表板頂部。
探索指標(biāo)
通過臨時查詢和動態(tài)明細(xì)瀏覽數(shù)據(jù)。拆分視圖并排比較不同的時間范圍,查詢和數(shù)據(jù)源。
探索日志
快速搜索所有日志或?qū)崟r流式傳輸(與 Loki 數(shù)據(jù)源配合使用效果最佳)。
警報
以可視方式定義最重要指標(biāo)的警報規(guī)則。Grafana 將不斷評估并向 Slack,PagerDuty,VictorOps 和 OpsGenie 等系統(tǒng)發(fā)送通知。
混合數(shù)據(jù)源
在同一張圖中混合使用不同的數(shù)據(jù)源!你可以為每個查詢指定數(shù)據(jù)源(適用于自定義數(shù)據(jù)源)。
注解
使用來自不同數(shù)據(jù)源的豐富事件注釋圖形。將鼠標(biāo)懸停在事件上會顯示完整的事件元數(shù)據(jù)和標(biāo)簽。
臨時過濾器
臨時過濾器允許您即時創(chuàng)建新的鍵/值過濾器,這些過濾器會自動應(yīng)用于使用該數(shù)據(jù)源的所有查詢。
安裝
部署文件
# config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: grafana
namespace: observability
labels:
app.kubernetes.io/name: grafana
app.kubernetes.io/instance: grafana
app.kubernetes.io/version: "7.0.5"
data:
grafana.ini: |
[analytics]
check_for_updates = true
[grafana_net]
url = https://grafana.net
[log]
mode = console
[paths]
data = /var/lib/grafana/data
logs = /var/log/grafana
plugins = /var/lib/grafana/plugins
provisioning = /etc/grafana/provisioning
datasources.yaml: |
apiVersion: 1
datasources:
- access: proxy
editable: true
isDefault: true
jsonData:
timeInterval: 5s
name: Prometheus
orgId: 1
type: prometheus
url: http://prometheus:9090
注:
- url: http://prometheus:9090 指定了 Prometheus 數(shù)據(jù)源地址,因為在同一個命名空間下,所以直接使用 service 名稱訪問。
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: grafana
namespace: observability
labels:
app.kubernetes.io/name: grafana
app.kubernetes.io/instance: grafana
app.kubernetes.io/version: "7.0.5"
spec:
type: NodePort
ports:
- name: service
port: 3000
protocol: TCP
selector:
app.kubernetes.io/name: grafana
app.kubernetes.io/instance: grafana
注:
- type: NodePort 為了在開發(fā)環(huán)境中方便訪問,這里使用 NodePort 暴露服務(wù)。
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
namespace: observability
labels:
app.kubernetes.io/name: grafana
app.kubernetes.io/instance: grafana
app.kubernetes.io/version: "7.0.5"
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: grafana
app.kubernetes.io/instance: grafana
strategy:
type: RollingUpdate
template:
metadata:
labels:
app.kubernetes.io/name: grafana
app.kubernetes.io/instance: grafana
app: grafana
spec:
securityContext:
fsGroup: 472
runAsGroup: 472
runAsUser: 472
containers:
- name: grafana
image: "grafana/grafana:7.0.5"
imagePullPolicy: IfNotPresent
volumeMounts:
- name: config
mountPath: "/etc/grafana/grafana.ini"
subPath: grafana.ini
- name: storage
mountPath: "/var/lib/grafana"
- name: config
mountPath: "/etc/grafana/provisioning/datasources/datasources.yaml"
subPath: datasources.yaml
ports:
- name: service
containerPort: 3000
protocol: TCP
- name: grafana
containerPort: 3000
protocol: TCP
env:
- name: "GF_SECURITY_ADMIN_PASSWORD"
value: "admin123"
- name: "GF_SECURITY_ADMIN_USER"
value: "admin"
livenessProbe:
failureThreshold: 10
httpGet:
path: /api/health
port: 3000
initialDelaySeconds: 60
timeoutSeconds: 30
readinessProbe:
httpGet:
path: /api/health
port: 3000
resources: {}
volumes:
- name: config
configMap:
name: grafana
- name: storage
emptyDir: {}
注:
- GF_SECURITY_ADMIN_USER 用戶名
- GF_SECURITY_ADMIN_PASSWORD 密碼
部署
$ kubectl apply -f config.yaml
configmap/grafana created
$ kubectl apply -f deployment.yaml
deployment.apps/grafana created
$ kubectl apply -f service.yaml
service/grafana created
檢查
$ kubectl get deployment -n observability
NAME READY UP-TO-DATE AVAILABLE AGE
grafana 1/1 1 1 4m6s
httpbin 1/1 1 1 2d5h
prometheus 1/1 1 1 6d4h
redis 1/1 1 1 2d6h
$ kubectl get service -n observability
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana NodePort 10.96.124.67 <none> 3000:31273/TCP 4m10s
httpbin ClusterIP 10.111.188.30 <none> 8000/TCP 2d5h
node-exporter NodePort 10.111.82.119 <none> 9100:31672/TCP 3d5h
prometheus NodePort 10.98.133.13 <none> 9090:31033/TCP 6d4h
redis ClusterIP 10.104.118.216 <none> 6379/TCP,9121/TCP 2d6h
訪問
根據(jù)服務(wù)端口訪問 Grafana http://localhost:31273,并使用設(shè)置的用戶名和密碼登錄。
Dashboard
導(dǎo)入 Dashboard
為了觀察指標(biāo),我們可以根據(jù)自己的需求手動新建一個 Dashboard。除此之外,grafana 官網(wǎng)上還有很多公共的 Dashboard 可以選用。
由于在監(jiān)控 Kubernetes 集群中我們講解過使用 node_exporter 采集服務(wù)器節(jié)點的運行指標(biāo),所以下面以 Node Exporter for Prometheus Dashboard 為例講解如何導(dǎo)入公共的 Dashboard。
點擊 Import
輸入Node Exporter for Prometheus Dashboard 的 id,并點擊 Load
選擇數(shù)據(jù)源并點擊 Import 導(dǎo)入
查看 Dashboard
指標(biāo)可視化流程
選擇某個圖表,右鍵選擇 Edit
可以看到圖表顯示的值,其實是將指標(biāo)通過計算而來的。
如上圖,總 CPU 使用率是通過 100 - (avg(irate(node_cpu_seconds_total{instance=~"$node",mode="idle"}[5m])) * 100)
計算得出的結(jié)果。而 node_cpu_seconds_total
便是使用 node_exporter
采集到的服務(wù)器節(jié)點指標(biāo)中的一個。
所以,指標(biāo)可視化流程是,先配置 Prometheus 采集想要的指標(biāo),然后使用 promQL
語句查詢出想要的數(shù)據(jù),最后通過 Grafana 可視化。
如果grafana 官網(wǎng)的 Dashboard 不能滿足要求,也可以新建一個自定義 Dashboard,具體的 promQL
語句參考導(dǎo)入的 Dashboard 即可,這里不再贅述。
報警
報警是監(jiān)控系統(tǒng)中必不可少的環(huán)節(jié),grafana 支持很多種形式的報警功能,比如 email、釘釘、slack、webhook 等等,下面我們以釘釘為例。
釘釘
設(shè)置報警前,需要設(shè)置下釘釘通知參數(shù)。
注:這里需要注意的是,Grafana 的釘釘通知沒有新版機器人的加簽設(shè)置,所以推薦使用自定義關(guān)鍵詞(由于這里做報警的,每個通知消息都會包含 alert, 所以關(guān)鍵字可設(shè)置為 alert)。
image
Graph
目前,只有 Graph 支持報警功能。下面新建一個 Dashbaord,在里面創(chuàng)建 Graph。
如上圖,設(shè)置的指標(biāo)值為 (1 - avg(irate(node_cpu_seconds_total{job=~"kubernetes-node-exporter",mode="idle"}[5m])) by (instance)) * 100
表示節(jié)點 cpu 總平均使用率。然后,點擊 Alert,創(chuàng)建一個報警。
如上圖,為了便于觸發(fā)通知,這里設(shè)置了當(dāng) cpu 總平均使用率高于 10%
的時候通知到釘釘群。
完成配置后,等到 Rule 周期到的時候(上面設(shè)置了 5 分鐘),就能在釘釘群中收到報警。
小結(jié)
本篇為大家介紹了如何使用 Grafana 可視化 Prometheus 收集到的指標(biāo),并設(shè)置報警。
注:本章內(nèi)容涉及的 yaml 文件可前往 https://github.com/MakeOptim/service-mesh/prometheus 獲取。