grafana 是一個可視化面板,有著非常漂亮的圖表和布局展示,功能齊全的度量儀表盤和圖形編輯器,支持 Graphite、zabbix、InfluxDB、Prometheus、OpenTSDB、Elasticsearch 等作為數據源,比 Prometheus 自帶的圖表展示功能強大太多,更加靈活,有豐富的插件,功能更加強大。
接下來就來直接安裝,同樣的,將 grafana 安裝到 Kubernetes 集群中,第一步同樣是去查看 grafana 的 docker 鏡像的介紹,可以在 dockerhub 上去搜索,也可以在官網去查看相關資料,鏡像地址如下:https://hub.docker.com/r/grafana/grafana/
但是還有一個需要注意的是 Changelog 中v5.1.0版本的更新介紹:
Major restructuring of the container
Usage of chown removed
File permissions incompatibility with previous versions
user id changed from 104 to 472
group id changed from 107 to 472
Runs as the grafana user by default (instead of root)
All default volumes removed
特別需要注意第3條,userid 和 groupid 都有所變化,所以我們在運行的容器的時候需要注意這個變化?,F在我們將這個容器轉化成 Kubernetes 中的 Pod:(grafana-statefulset.yaml),通過statefulset方式部署。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: grafana
namespace: kube-system
spec:
serviceName: "grafana"
replicas: 1
selector:
matchLabels:
app: grafana
template:
metadata:
labels:
app: grafana
spec:
containers:
- image: grafana/grafana:5.3.4
name: grafana
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3000
protocol: TCP
env:
- name: GF_SECURITY_ADMIN_USER
value: admin
- name: GF_SECURITY_ADMIN_PASSWORD
value: adminqed
readinessProbe:
failureThreshold: 10
httpGet:
path: /api/health
port: 3000
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 30
livenessProbe:
failureThreshold: 3
httpGet:
path: /api/health
port: 3000
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
resources:
limits:
cpu: 300m
memory: 300Mi
requests:
cpu: 300m
memory: 300Mi
volumeMounts:
- name: grafana-data
mountPath: /var/lib/grafana
subPath: grafana
securityContext:
fsGroup: 472
runAsUser: 472
volumeClaimTemplates:
- metadata:
name: grafana-data
spec:
storageClassName: course-nfs-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: "10Gi"
---
apiVersion: v1
kind: Service
metadata:
name: grafana
namespace: kube-system
spec:
type: NodePort
ports:
- port: 80
targetPort: 3000
nodePort: 31111
selector:
app: grafana
這里使用了最新的鏡像grafana/grafana:5.3.4,然后添加了監(jiān)控檢查、資源聲明,另外兩個比較重要的環(huán)境變量GF_SECURITY_ADMIN_USER和GF_SECURITY_ADMIN_PASSWORD,用來配置 grafana 的管理員用戶和密碼的,由于 grafana 將 dashboard、插件這些數據保存在/var/lib/grafana這個目錄下面的,所以這里如果需要做數據持久化的話,就需要針對這個目錄進行 volume 掛載聲明,這里使用storageclass,由于上面剛剛提到的 Changelog 中 grafana 的 userid 和 groupid 有所變化,所以這里需要增加一個securityContext的聲明來進行聲明。
注:如securityContext聲明時有問題,請檢查kube-apiserver配置是否禁用了securityContext。
[root@laxidc-cmp-master01 grafana]# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana NodePort 10.254.175.109 <none> 80:31111/TCP 2d
可以在瀏覽器中使用http://<node VIP:31111>來訪問 grafana 這個服務了:

配置
在上面的首頁中可以看到已經安裝了 Grafana,接下來點擊Add data source進入添加數據源界面。
數據源
這個地方配置的數據源是 Prometheus,所以選擇這個 Type 即可,給改數據源添加一個 name:prometheus-ds,最主要的是下面HTTP區(qū)域是配置數據源的訪問模式。
訪問模式是用來控制如何處理對數據源的請求的:
- 服務器(Server)訪問模式(默認):所有請求都將從瀏覽器發(fā)送到 Grafana 后端的服務器,后者又將請求轉發(fā)到數據源,通過這種方式可以避免一些跨域問題,其實就是在 Grafana 后端做了一次轉發(fā),需要從Grafana 后端服務器訪問該 URL。
- 瀏覽器(Browser)訪問模式:所有請求都將從瀏覽器直接發(fā)送到數據源,但是有可能會有一些跨域的限制,使用此訪問模式,需要從瀏覽器直接訪問該 URL。
由于我們這個地方 Prometheus 通過 NodePort 的方式的對外暴露的服務,所以我們這個地方是不是可以使用瀏覽器訪問模式直接訪問 Prometheus 的外網地址,但是這種方式顯然不是最好的,相當于走的是外網,而我們這里 Prometheus 和 Grafana 都處于 kube-system 這同一個 namespace 下面,是不是在集群內部直接通過 DNS 的形式就可以訪問了,而且還都是走的內網流量,所以我們這里用服務器訪問模式顯然更好,數據源地址:http://prometheus:9090(因為在同一個 namespace 下面所以直接用 Service 名也可以),然后其他的配置信息就根據實際情況了,比如 Auth 認證,我們這里沒有,所以跳過即可,點擊最下方的Save & Test提示成功證明我們的數據源配置正確:

數據源添加完成后,就可以來添加 Dashboard 了。
Dashboard
同樣,切換到主頁,我們可以根據自己的需求手動新建一個 Dashboard,除此之外,grafana 的官方網站上還有很多公共的 Dashboard 可以供我們使用,我們這里可以使用Kubernetes cluster monitoring (via Prometheus)(dashboard id 為162)這個 Dashboard 來展示 Kubernetes 集群的監(jiān)控信息,在左側側邊欄 Create 中點擊import導入:

我們可以將上面編號162的 dashboard 下載到本地,然后這里重新上傳即可,也可以在上面的文本框中直接輸入162編號回車即可,導入這個 dashboard:

需要注意的是在執(zhí)行上面的 import 之前要記得選擇prometheus-ds這個名字的數據源,執(zhí)行import操作,就可以進入到 dashboard 頁面:

可以看到 dashboard 頁面上出現了很多漂亮的圖表,但是看上去數據不正常,這是因為這個 dashboard 里面需要的數據指標名稱和我們 Prometheus 里面采集到的數據指標不一致造成的,比如,第一個Cluster memory usage(集群內存使用情況),我們可以點擊標題 -> Edit,進入編輯這個圖表的編輯頁面:

進入編輯頁面我們就可以看到這個圖表的查詢語句:
(sum(node_memory_MemTotal) - sum(node_memory_MemFree+node_memory_Buffers+node_memory_Cached) ) / sum(node_memory_MemTotal) * 100

這就是我們之前在 Prometheus 里面查詢的
promQL語句,我們可以將上面的查詢語句復制到 Prometheus 的 Graph 頁面進行查詢,其實可以預想到是沒有對應的數據的,因為我們用node_exporter采集到的數據指標不是node_memory_MemTotal關鍵字,而是node_memory_MemTotal_bytes,將上面的promQL語句做相應的更改:
(sum(node_memory_MemTotal_bytes) - sum(node_memory_MemFree_bytes + node_memory_Buffers_bytes+node_memory_Cached_bytes)) / sum(node_memory_MemTotal_bytes) * 100
這個語句的意思就是(整個集群的內存-(整個集群剩余的內存以及Buffer和Cached))/整個集群的內存,簡單來說就是總的集群內存使用百分比。將上面 grafana 的promQL語句替換掉,就可以看到圖表正常了:


同樣下面的Pod CPU Usage用來展示 Pod CPU 的使用情況,對應的promQL語句如下,根據 pod_name 來進行統計:
sum by (pod_name)(rate(container_cpu_usage_seconds_total{image!="", pod_name!=""}[1m]))
按照上面的方法替換 grafana 中的 dashboard 圖表中的查詢語句: 

最后要記得保存這個 dashboard,下面的鏈接是我修改后的 dashboard json 文件地址,你可以直接下載下來導入到 grafana 當中,當然你也可以根據實際情況進行相應的更改:k8s-cluster-grafana-dashboard.json。
除此之外,也可以前往 grafana dashboard 的頁面去搜索其他的關于 Kubernetes 的監(jiān)控頁面,地址:https://grafana.com/dashboards。
比如監(jiān)控pod的id 為747的dashboard
比如監(jiān)控DeployMent的id 為741的dashboard
比如監(jiān)控Nod的id 為9276的dashboard
插件
上面是最常用的 grafana 當中的 dashboard 的功能的使用,然后我們也可以來進行一些其他的系統管理,比如添加用戶,為用戶添加權限等等,也可以安裝一些其他插件,比如 grafana 就有一個專門針對 Kubernetes 集群監(jiān)控的插件:grafana-kubernetes-app
要安裝這個插件,需要到 grafana 的 Pod 里面去執(zhí)行安裝命令:
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
grafana-79477fbb7c-v4prs 1/1 Running 0 23m
$ kubectl exec -it grafana-79477fbb7c-v4prs /bin/bash -n kube-system
grafana@grafana-79477fbb7c-v4prs:/usr/share/grafana$ grafana-cli plugins install grafana-kubernetes-app
installing grafana-kubernetes-app @ 1.0.1
from url: https://grafana.com/api/plugins/grafana-kubernetes-app/versions/1.0.1/download
into: /var/lib/grafana/plugins
? Installed grafana-kubernetes-app successfully
Restart grafana after installing plugins . <service grafana-server restart>
grafana@grafana-79477fbb7c-v4prs:/usr/share/grafana$
安裝完成后需要重啟 grafana 才會生效,這里直接刪除 Pod,重建即可,然后回到 grafana 頁面中,切換到 plugins 頁面可以發(fā)現下面多了一個 Kubernetes 的插件,點擊進來啟用即可,然后點擊Next up旁邊的鏈接配置集群

可以添加一個新的 Kubernetes 集群,這里需要填寫集群的訪問地址:https://kubernetes.default,然后比較重要的是集群訪問的證書,勾選上TLS Client Auth和With CA Cert這兩項。

集群訪問的證書文件,用我們訪問集群的 kubectl 的配置文件中的證書信息(~/.kube/config)即可,其中屬性certificate-authority-data、client-certificate-data、client-key-data就對應這 CA 證書、Client 證書、Client 私鑰,不過 config 文件里面的內容是base64編碼過后的,所以我們這里填寫的時候要做base64解碼。
另外需要將解碼過后的
\n換成換行符,不然認證會失敗。
配置完成后,可以直接點擊Deploy,然后點擊Save,就可以獲取到集群的監(jiān)控資源信息了。


注:或者直接input id 6417也可以監(jiān)控集群